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 | 更新节点 |
注意:本文归作者所有,未经作者允许,不得转载