Docker Swarm基础

152 阅读5分钟

简介

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

参考

[1] Swarm mode overview