简介
Docker Swarm 模式是用于管理 Docker 集群的高级应用。通过 Docker Swarm 编排可以方便地扩展应用服务,实现服务间的负载均衡以及服务滚动更新等。
Create a Swarm
创建Swarm
初始化Swarm,该主机将作为集群的Manager,称此节点为Manager Node;
在 Docker Desktop for Mac 或 Docker Desktop for Windows 只可以创建单节点集群,
所以创建Swarm时不必指定任何参数,如下的--advertise-addr <MANAGER-IP>。
Manager IP可以通过ifconfig查找,需要保证其他从节点可以通过此IP与主节点通信。
docker swarm init --advertise-addr 192.168.199.103
创建Swarm后,返回的输入内容中--token是作为其他从节点的接入凭证;
同时在Manager Node上开放了TCP 2377端口,作为集群管理端口 。
Swarm initialized: current node (tyquc2rwnwucd8yfnft46g63a) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1cufx4e3tygs6srbniprv6d1obnmysl4uixtagxhn2x1ulx42v-3q42rnne339ixuoww9dgxsxcg 192.168.199.103:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
查询主机上Docker的Swarm信息
执行docker info命令可以查看当前 swarm 状态。
docker info
输出示例:
Swarm: active
NodeID: tyquc2rwnwucd8yfnft46g63a
Is Manager: true
ClusterID: 8jfm5ujeu7uel767wtj52tsx5
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
查询节点列表
执行docker node ls可以查看所有节点信息。
docker node ls
输出示例:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
tyquc2rwnwucd8yfnft46g63a * docker-desktop Ready Active Leader 20.10.11
脱离集群
执行docker swarm leave即可使节点脱离集群。
docker swarm leave
对于Manager Node,添加--force参数。
docker swarm leave --force
Add nodes to the Swarm
查看集群Token
依据创建 Swarm 后返回的--token,作为加入集群的凭证;
如果忘记 token,可以在主节点运行命令检索加入的命令。
docker swarm join-token worker
输出示例:
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1cufx4e3tygs6srbniprv6d1obnmysl4uixtagxhn2x1ulx42v-3q42rnne339ixuoww9dgxsxcg 192.168.199.103:2377
加入swarm集群
执行docker swarm join,创建工作节点并加入已存在的 Swarm 集群。
docker swarm join --token SWMTKN-1-1cufx4e3tygs6srbniprv6d1obnmysl4uixtagxhn2x1ulx42v-3q42rnne339ixuoww9dgxsxcg 192.168.199.103:2377
Deploy a service to the Swarm
部署服务
部署服务到 Swarm 集群中,以下示例将 Nginx 服务部署到 Swarm。
其中--replicas指定要运行的实例数量,且会根据节点分配;
指定的镜像需要能够通过镜像仓库访问到。
docker service create --replicas 1 --name nginx_m nginx:1.21.5-alpine
输出示例:
84w6oxo1es3l7zj5nduj8ubp6
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
查看服务信息
指令--pretty表示用以易阅读格式显示信息
docker service inspect --pretty nginx_m
输出示例:
ID: 84w6oxo1es3l7zj5nduj8ubp6
Name: nginx_m
Service Mode: Replicated
Replicas: 1
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: nginx:1.21.5-alpine@sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333
Init: false
Resources:
Endpoint Mode: vip
查看服务运行情况
可以查看到服务运行在哪些节点上
docker service ps nginx_m
输出示例:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
b1urzxarzrjs nginx_m.1 nginx:1.21.5-alpine docker-desktop Running Running 7 minutes ago
查看节点task
task 是 Swarm 集群管理的最小的调度单位
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c0260af3abb nginx:1.21.5-alpine "/docker-entrypoint.…" 30 minutes ago Up 30 minutes 80/tcp nginx_m.1.b1urzxarzrjsvbhked4g4zg6l
扩展服务
以下示例将 nginx_m 服务扩展到2个运行实例。
实例将在所有节点中分配。
docker service scale nginx_m=2
输出示例:
nginx_m scaled to 2
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
移除服务
移除服务后,所有节点都会下线服务;
task容器(即服务容器)将会在几秒后关闭删除。
docker service rm nginx_m
Apply rolling updates to service
部署服务时指定更新策略
以镜像redis:3.0.6为例,服务名为 redis。
docker service create \
--replicas 3 \
--name redis \
--update-delay 10s \
redis:3.0.6
执行服务更新
更新 redis 服务并指定更新的镜像为redis:3.0.7。
docker service update --image redis:3.0.7 redis
Swarm调度器执行滚动更新的流程
- 停止第一个task
- 调度更新停止的task
- 启动更新后的task
- 如果启动更新的task启动返回
RUNNING,根据指定的更新策略等待时长,开始下一个task更新 - 如果更新过程中有一个task返回
FAILED,暂停此次更新
重启更新
如果更新被暂停,可以重启更新。
docker service update redis
Drain a node
下线节点
下线节点并不会移除容器。
docker node update --availability drain docker-desktop
查看节点信息
执行docker node inspect查看节点信息。
docker node inspect --pretty docker-desktop
可以看到Status: Availability: Drain。
ID: tyquc2rwnwucd8yfnft46g63a
Hostname: docker-desktop
Joined at: 2022-02-16 02:07:31.71226025 +0000 utc
Status:
State: Ready
Availability: Drain
Address: 192.168.199.103
查看节点列表
执行docker node ls可以查看所有节点信息。
docker node ls
输出示例:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
tyquc2rwnwucd8yfnft46g63a * docker-desktop Ready Drain Leader 20.10.11
查看服务运行情况
以下示例查看 nginx_m 服务的运行情况。
docker service ps nginx_m
当某个节点下线后,Swarm集群会根据下线的节点服务,在其他可用节点创建新 task,以保持运行服务实例数量。
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kw0kcccadr3v nginx_m.1 nginx:1.21.5-alpine Running Pending 4 minutes ago "no suitable node (1 node not …"
b1urzxarzrjs \_ nginx_m.1 nginx:1.21.5-alpine docker-desktop Shutdown Shutdown 4 minutes ago
qrlxz3jhdn7v nginx_m.2 nginx:1.21.5-alpine Running Pending 4 minutes ago "no suitable node (1 node not …"
smo3n6yuwjgj \_ nginx_m.2 nginx:1.21.5-alpine docker-desktop Shutdown Shutdown 4 minutes ago
上线节点
docker node update --availability active docker-desktop