docker swarm安装与简单的使用

傻男人 1年前 ⋅ 2177 阅读

docker swarm 安装

安装前的准备

关闭 selinux

查看selinux的开启状态

/usr/sbin/sestatus -v  或者 getenforce

关闭selinux

临时关闭(不用重启机器,但是重启系统后还会开启)
setenforce 0
  • setenforce 0 ##设置SELinux 成为permissive模式
  • setenforce 1 设置SELinux 成为enforcing模式
永久关闭
修改配置文件,将SELINUX=enforcing改为SELINUX=disabled:
vim /etc/selinux/config

关闭防火墙

查看防火墙状态

systemctl status firewalld

关闭防火墙

systemctl stop firewalld.service       #停止firewall
systemctl disable firewalld.service    #禁止firewall开机启动

修改docker监听端口

vim /usr/lib/systemd/system/docker.service

#在ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock后加入

-H tcp://0.0.0.0:2375

示例如下:

# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock \
-H tcp://0.0.0.0:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

重启docker

systemctl daemon-reload
systemctl restart docker

修改主机的名

hostnamectl set-hostname worker02-node;
service docker restart;
docker node ls;

安装swarm

  • 拉取swarm的镜像
docker pull swarm
  • 启动swarm
docker swarm init --advertise-addr 192.168.1.121
  • --advertise-addr 192.168.1.121 指定192.168.1.121作为管理节点
  • 执行docker info命令查看swarm的当前状态
......
Swarm: active
  NodeID: 88h2e6cge9sdjzx9cyh5siano
  Is Manager: true
  ClusterID: jpqc2uryxd0hbws9edvm6d0gx
  Managers: 1
  Nodes: 1
  Default Address Pool: 10.0.0.0/8  
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
  Raft:
   Snapshot Interval: 10000
   Number of Old Snapshots to Retain: 0
   Heartbeat Tick: 1
   Election Tick: 10
  Dispatcher:
   Heartbeat Period: 5 seconds
  CA Configuration:
   Expiry Duration: 3 months
   Force Rotate: 0
  Autolock Managers: false
  Root Rotation In Progress: false
  Node Address: 192.168.1.121
  Manager Addresses:
   192.168.1.121:2377
......

部署一个服务到swarm

自定义一个服务

docker service create --replicas 2 --name helloworld busybox:1.25.1-musl /bin/sh -c "while true; do echo hello world; sleep 3; done"
  • docker service create 命令创建服务。
  • --name 标志将服务命名为helloworld。
  • --replicas 标志指定了期望状态为 2 个运行示例。
  • 参数 busybox:1.25.1-musl /bin/sh -c "while true; do echo hello world; sleep 3; done 将服务定义为使用镜像busybox:1.25.1-musl 创建容器,并在里面执行 /bin/sh -c "while true; do echo hello world; sleep 3; done。

docker swarm的常用操作

查看服务的详细信息(在管理节点上)

$ docker service inspect --pretty helloworld 
ID:		s0i7sc7ih08xxcgxpssksxw42
Name:		helloworld
Service Mode:	Replicated
 Replicas:	2
Placement:
UpdateConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:		busybox:1.25.1-musl@sha256:46634e32e559271b8e18b7f1b21d981da4cd63ed8d36fbdc35c0b56464238a0c
 Args:		/bin/sh -c while true; do echo hello world; sleep 3; done 
 Init:		false
Resources:
Endpoint Mode:	vip
  • 参数--pretty表示以可读性良好的格式输出。如果想输出详细的 json 格式信息,去掉--pretty参数即可。
$ docker service inspect  helloworld 
[
    {
        "ID": "04a3iqg8zlhba84kpi2tatssf",
        "Version": {
            "Index": 23
        },
        "CreatedAt": "2016-12-22T15:00:03.780379494Z",
        "UpdatedAt": "2016-12-22T15:00:03.780379494Z",
        "Spec": {
            "Name": "helloworld",
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "busybox:1.25.1-musl",
                    "Args": [
                        "/bin/sh",
                        "-c",
                        "while true; do echo hello world; sleep 3; done"
                    ]
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "MaxAttempts": 0
                },
                "Placement": {}
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 1
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause"
            },
            "EndpointSpec": {
                "Mode": "vip"
            }
        },
        "Endpoint": {
            "Spec": {}
        },
        "UpdateStatus": {
            "StartedAt": "0001-01-01T00:00:00Z",
            "CompletedAt": "0001-01-01T00:00:00Z"
        }
    }
]

查看哪个节点在运行该服务(在管理节点上)

$ docker service ps helloworld 
ID             NAME           IMAGE                 NODE              DESIRED STATE   CURRENT STATE            ERROR     PORTS
nd4f0e1ojg18   helloworld.1   busybox:1.25.1-musl   ecs-carloan-bak   Running         Running 19 minutes ago             
sosw0q1hj3hv   helloworld.2   busybox:1.25.1-musl   ecs-carloan-bak   Running         Running 19 minutes ago 
  • 其中DESIRED STATE和CURRENT STATE表示服务的期望状态和当前状态,你可以对比它们,判断服务是否想期望的那样运行。这里的Running和Running 19 minutes ago说明服务运行正常。

伸缩服务(伸缩服务的任务数量)(在管理节点上)

$ docker service scale helloworld = 5
  • 如果伸缩的数量的值小于当前服务的实例,则移除掉当前服务的实例-伸缩的数量的服务实例
  • 如果伸缩的数量的值等于当前服务的实例,则无实例启动与移除
  • 如果伸缩的数量的值大于当前服务的实例,则添加伸缩的数量-当前服务的实例的服务实例

删除swarm 上运行的服务(在管理节点上)

$ docker service rm helloworld 

确认是否删除swarm 上运行的服务(在管理节点上)

$ docker service ls
如果列表没有刚需要删除的helloworld,则表示删除成功

滚动更新

  • 部署一个基于 Rddis 3.07 镜像的服务。然后使用滚动更新将服务更新到使用 Redis 3.2.5 镜像。

1)、在swarm中部署 Redis 3.0.7,并配置 10 秒更新延迟

$ docker service create --replicas 3 --name redis --update-delay 10s --update-parallelism 2 --update-failure-action continue redis:3.0.7-alpine
c3hrsui7svtmzpxxars48tmtx
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 
  • 命令的解析:
docker service create   创建命令
--replicas 3  副本数
--name redis  服务名
--update-delay 10s  设定容器间更新时间间隔
--update-parallelism 2 更新时同时并行更新数量,默认1
--update-monitor 30s 定义容器启动后监控失败的持续时间
--update-max-failure-ratio 0.1 定义容器失败的百分比
--update-failure-action continue  任务容器更新失败时的模式 continue为继续使用(“pause”停止|”continue“继续),pause为默认值
--rollback-parallelism 2         #回滚时允许两个一起
--rollback-monitor 20s          #回滚监控时间20s
--rollback-max-failure-ratio 0.2    #回滚失败率20%
redis:3.0.7-alpine  镜像
  • 我们在部署服务指定滚动更新策略。--update-delay 表示更新服务对应的任务或一组任务之间的时间间隔。时间间隔用数字和时间单位表示,m 表示分,h 表示时,所以 10m30s 表示 10 分 30 秒的延时。
  • 默认情况下,调度器一次更新一个任务。你可以使用 --update-parallelism 标志配置调度器每次同时更新的最大任务数量。
  • 默认情况下,如果更新某个任务返回了RUNNING状态,调度器会转去更新另一个任务,直到所有任务都更新完成。如果在更新某个任务的任意时刻返回了FAILED,调度器暂停更新。我们可以在执行 docker service create 命令和 docker service update 命令时使用 --update-failure-action 标志来覆盖这种默认行为。

2)、查看刚部署的redis服务

$ docker service inspect --pretty redis
ID:		fj5s45g5px9n9cymfoh7vdoqj
Name:		redis
Service Mode:	Replicated
 Replicas:	3
Placement:
UpdateConfig:
 Parallelism:	1
 Delay:		10s
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:		redis:3.0.7-alpine@sha256:350469b395eac82395f9e59d7b7b90f7d23fe0838965e56400739dec3afa60de
 Init:		false
Resources:
Endpoint Mode:	vip

3)、将redis服务滚动更新到redis:3.2.5-alpine

$ docker service update --image redis:3.2.5-alpine redis
redis
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 
  • 调度器根据下面默认的策略来应用滚动更新:
    • 停止第一个任务。
    • 为停止的任务应用更新。
    • 为更新的任务启动容器。
    • 如果更新任务时返回RUNNING,等待一个指定的延时后停止下一个任务,如果,在更新的任意时刻,某个任务返回FAILED,暂停更新。
    • 停止第一个任务。
查看滚动更新后服务的状态
$ docker service ps redis
ID             NAME          IMAGE                NODE              DESIRED STATE   CURRENT STATE             ERROR     PORTS
4txwnsfv2ftz   redis.1       redis:3.2.5-alpine   ecs-carloan-bak   Running         Running 15 seconds ago              
mqtdcp39u0ov    \_ redis.1   redis:3.0.7-alpine   ecs-carloan-bak   Shutdown        Shutdown 15 seconds ago             
p1o7lb9vasmq   redis.2       redis:3.2.5-alpine   ecs-carloan-bak   Running         Running 27 seconds ago              
ipn8w9nktdxt    \_ redis.2   redis:3.0.7-alpine   ecs-carloan-bak   Shutdown        Shutdown 27 seconds ago             
nmhmniy1945i   redis.3       redis:3.2.5-alpine   ecs-carloan-bak   Running         Running 39 seconds ago              
n68m0wwikewq    \_ redis.3   redis:3.0.7-alpine   ecs-carloan-bak   Shutdown        Shutdown 40 seconds ago 
  • 可以看到有三个镜像为redis:3.0.7-alpine的任务状态为Shutdown,三个镜像为redis:3.2.5-alpine的任务状态为Running。说明滚动更新已完成。
使用docker ps -a 查看现在容器的状态
$ docker ps -a
CONTAINER ID   IMAGE                                      COMMAND                  CREATED             STATUS                     PORTS                    NAMES
edd2fbc74b37   redis:3.2.5-alpine                         "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes               6379/tcp                 redis.1.4txwnsfv2ftza01nwsc82fara
c95cd1a2747b   redis:3.2.5-alpine                         "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes               6379/tcp                 redis.2.p1o7lb9vasmq7j48mhk8vd8vd
fd8aac368a24   redis:3.2.5-alpine                         "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes               6379/tcp                 redis.3.nmhmniy1945ioscidrr949kdc
f5a0b55b9d1a   redis:3.0.7-alpine                         "docker-entrypoint.s…"   About an hour ago   Exited (0) 9 minutes ago                            redis.3.n68m0wwikewqmqyp6redoy3ab
681319ea257a   redis:3.0.7-alpine                         "docker-entrypoint.s…"   About an hour ago   Exited (0) 8 minutes ago                            redis.1.mqtdcp39u0ovasyi0dq3gbl7b
907cc9967117   redis:3.0.7-alpine                         "docker-entrypoint.s…"   About an hour ago   Exited (0) 8 minutes ago                            redis.2.ipn8w9nktdxtet6l796n9c2ru
  • 更新后,。swarm并没有删除旧的容器

手动回滚

创建服务时设定回滚策略

docker service create \
--name my_web \
--replicas 3 \
--rollback-parallelism 2 \
--rollback-monitor 20s \
--rollback-max-failure-ratio .2 \
nginx:1.12
  • 命令解析
docker service create 创建服务
--name my_web 服务名
--replicas 3 副本数
--rollback-parallelism 2 同时执行回滚数动作
--rollback-monitor 20s 每次容器与容器之间的回滚时间间隔
--rollback-max-failure-ratio .2 回滚故障率如果小于百分比允许运行
nginx:1.12  使用镜像

更新服务提升一个版本

docker service update --image nginx:1.13 my_web

手动回滚到上一个版本

docker service update --rollback my_web

下线某个节点

  • 在前面的步骤中,所有的节点都处于运行状态且可用性为ACTIVE。swarm 管理器可以将任务分配给任何可用性为 ACTIVE 的节点,所以到目前为止,所有节点都可以接收任务。
  • 有时候,比如到了计划的维护时间,你需要将节点的可用性设为DRAIN。可用性为DRAIN的节点不会从 swarm 接收任何新任务。同时,管理器将停止运行在该节点上的任务,并在另外可用性为 ACTIVE 的节点上启动相应的任务副本。

确认当前swarm中节点的活跃状态

$ docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
4rkvaeauhftolat98u5ty01iz    worker02   Ready   Active        
7ik7wqhe5wcag8k5tp816c7ck *  manager01  Ready   Active        Leader
cashcvy4qzcq3lvtnix4trqu7    worker01   Ready   Active                      

节点下线

$ docker node update --availability drain worker02(nodeName)
worker02
查看被下线节点的详细信息
$ docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
4rkvaeauhftolat98u5ty01iz    worker02   Ready   Drain         
7ik7wqhe5wcag8k5tp816c7ck *  manager01  Ready   Active        Leader
cashcvy4qzcq3lvtnix4trqu7    worker01   Ready   Active     
$ docker node inspect --pretty worker02
ID:         4rkvaeauhftolat98u5ty01iz
Hostname:       worker02
Joined at:      2016-12-22 14:51:02.806948804 +0000 utc
Status:
 State:         Ready
 Availability:      Drain
Platform:
 Operating System:  linux
 Architecture:      x86_64
Resources:
 CPUs:          2
 Memory:        1.937 GiB
Plugins:
  Network:      bridge, host, null, overlay
  Volume:       local
Engine Version:     1.12.3
  • 可以看到worker02节点的状态为Ready,但可用性为Drain。
再次查看任务的分配情况
$ docker service ps redis 
ID                         NAME         IMAGE               NODE       DESIRED STATE  CURRENT STATE                ERROR
9b89vrug0wz1nw28840rv5r57  redis.1      redis:3.2.5-alpine  manager01  Running        Running 8 minutes ago        
8bqo8nni0pi2o3c3nog5r0u7v   \_ redis.1  redis:3.0.7-alpine  manager01  Shutdown       Shutdown 9 minutes ago       
1lwslgvlq631v14urjuo2vge2  redis.2      redis:3.2.5-alpine  worker01   Running        Running about a minute ago   
3x6m9vmrw20kaittw28slwtmj   \_ redis.2  redis:3.2.5-alpine  worker02   Shutdown       Shutdown about a minute ago  
cb4b3iowzhmi8bk2izok4t2e6   \_ redis.2  redis:3.0.7-alpine  worker02   Shutdown       Shutdown 8 minutes ago       
cozd08m25sg3eip9cimsc6bc7  redis.3      redis:3.2.5-alpine  manager01  Running        Running 8 minutes ago        
eb8f2m36c00h3kxpjfhctre32   \_ redis.3  redis:3.0.7-alpine  worker01   Shutdown       Shutdown 8 minutes ago 
  • 与之前的列表相比,可以看到,swarm 管理器停止了workd02工作节点上的任务,并在 work01 上创建了一个新任务。

再次将被下线的节点重置为活动状态

$ docker node update --availability active worker02
worker02
确认该节点的新状态
$ docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
4rkvaeauhftolat98u5ty01iz    worker02   Ready   Active        
7ik7wqhe5wcag8k5tp816c7ck *  manager01  Ready   Active        Leader
cashcvy4qzcq3lvtnix4trqu7    worker01   Ready   Active

$ docker node inspect --pretty worker02
ID:         4rkvaeauhftolat98u5ty01iz
Hostname:       worker02
Joined at:      2016-12-22 14:51:02.806948804 +0000 utc
Status:
 State:         Ready
 Availability:      Active
...
  • 说明现在该节点又可以重新接收任务了。
再看看 worker02 节点上是否被分配了任务:
$ docker service ps -f desired-state=running redis 
ID                         NAME     IMAGE               NODE       DESIRED STATE  CURRENT STATE           ERROR
9b89vrug0wz1nw28840rv5r57  redis.1  redis:3.2.5-alpine  manager01  Running        Running 20 minutes ago  
1lwslgvlq631v14urjuo2vge2  redis.2  redis:3.2.5-alpine  worker01   Running        Running 13 minutes ago  
cozd08m25sg3eip9cimsc6bc7  redis.3  redis:3.2.5-alpine  manager01  Running        Running 20 minutes ago 
  • desired-state 表示只列出处于活动状态的任务。说明 worker02 虽然可用,但没被分配任务。
  • 一个可用性为Active的节点在以下情况下可以接收到新任务:
    • 当一个服务在伸缩规模时
    • 滚动更新时
    • 当你把其他某个节点的可用性设为 Drain 时
    • 当某个任务在另外某个 Active 节点上启动失败时
采用扩大一下服务的规模,看是否有新任务被分配到 worker02 上:
$ docker service scale redis=5
redis scaled to 5
在查看一个任务分配情况:
$ docker service ps -f desired-state=running  redis 
ID                         NAME     IMAGE               NODE       DESIRED STATE  CURRENT STATE               ERROR
9b89vrug0wz1nw28840rv5r57  redis.1  redis:3.2.5-alpine  manager01  Running        Running 26 minutes ago      
1lwslgvlq631v14urjuo2vge2  redis.2  redis:3.2.5-alpine  worker01   Running        Running 19 minutes ago      
cozd08m25sg3eip9cimsc6bc7  redis.3  redis:3.2.5-alpine  manager01  Running        Running 25 minutes ago      
0s11xwnvusv0vorgnjielg7ef  redis.4  redis:3.2.5-alpine  worker02   Running        Running about a minute ago  
035fd3l4xz6bvlz5wi4s04b9k  redis.5  redis:3.2.5-alpine  worker02   Running        Running about a minute ago 
  • 可以看到,worker02 被新分配了两个任务。

Docker Stack常用命令

命令含义备注
docker stack deploy -c ${compose_yml_path} #{serviceName} --with-registry-auth部署新的堆栈或更新现有堆栈docker stack deploy -c car_loan.yml car_loan --with-registry-auth
docker stack ls列出现有堆栈
docker stack ps #{serviceName}列出堆栈中的任务
docker stack rm #{serviceName}删除一个或多个堆栈
docker stack services #{serviceName}列出堆栈中的服务

swarm的常用命令

命令含义备注
docker node ls节点列表
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]创建一个新的
docker service inspect --pretty #{serviceName}服务的详细信息
docker service inspect #{serviceName}查询服务的详细信息(json格式输出)
docker service ps #{serviceName}查询服务的运行状态与服务运行的节点
docker service scale #{serviceName}= ${count}服务伸缩
docker service rm #{serviceName}删除服务
docker swarm leave --force删除swarm节点(node)
docker node rm -f #{nodeName}删除swarm节点(manager)
docker service update [OPTIONS] IMAGE [COMMAND] [ARG...]滚动更新
docker service ls查看运行的服务
docker node update --availability drain #{nodeName}节点下线
docker node update --availability active #{nodeName}节点上线
docker swarm join-token worker查看加入worker的命令
docker swarm join-token manager查看加入manager的命令
docker swarm join-token --rotate worker重置worker的Token
docker swarm join-token -q worker仅打印Token
docker swarm join加入集群中
docker node demote #{nodeName}节点降级,由管理节点降级为工作节点
docker node promote #{nodeName}节点升级,由工作节点升级为管理节点
docker node update更新节点

全部评论: 0

    我有话说: