2023跟我一起成为docker大牛:swarm 教程:部署篇「上」

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_Docker

Swarm模式是用于管理一组Docker守护程序的高级功能。


ip规划:

Manager: Manager: 172.16.95.137
Node1: 172.16.95.138
Node2: 172.16.95.139
  • 1.
  • 2.
  • 3.

1 、manager节点初始化swarm

docker swarm init --advertise-addr 172.16.95.137

输出:

docker swarm init --advertise-addr 172.16.95.137                                                 
Swarm initialized: current node (57mvxsdn9qg2tq6aiz17et7ot) is now a manager.                                   
To add a worker to this swarm, run the following command:                                                       
    docker swarm join --token SWMTKN-1-544xekdg657cd57fecr4g43uxk7t5pjkvxkkcbitjnygxc0nyh-0f4o0ujh0vz4nm5gxcjh3y
wi3 172.16.95.137:2377                                                                                       
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

2 、运行docker info以查看集群的当前状态:

root@master:~# docker info                                                                                   
Client: Docker Engine - Community                                                                            
 Version:    24.0.5                                                                                           
 Context:    default                                                                                        
 Debug Mode: false                                                                                           
 Plugins:                                                                                                     
  buildx: Docker Buildx (Docker Inc.)                                                                         
    Version:  v0.11.2                                                                                         
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx                                                  
  compose: Docker Compose (Docker Inc.)                                                                      
    Version:  v2.20.2                                                                                         
    Path:     /usr/libexec/docker/cli-plugins/docker-compose                                                    
Server:                                                                                                      
 Containers: 1                                                                                              
  Running: 0                                                                                                
  Paused: 0                                                                                                   
  Stopped: 1                                                                                                 
 Images: 1                                                                                                  
 Server Version: 24.0.5                                                                                      
 Storage Driver: overlay2                                                                                     
  Backing Filesystem: extfs                                                                                   
  Supports d_type: true                                                                                       
  Using metacopy: false                                                                                       
  Native Overlay Diff: true                                                                                   
  userxattr: false                                                                                           
 Logging Driver: json-file                                                                                  
 Cgroup Driver: systemd                                                                                      
 Cgroup Version: 2                                                                                           
 Plugins:                                                                                                     
  Volume: local                                                                                               
  Network: bridge host ipvlan macvlan null overlay                                                           
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog                         
 Swarm: active                                                                                               
  NodeID: 57mvxsdn9qg2tq6aiz17et7ot                                                                           
  Is Manager: true                                                                                           
  ClusterID: qonn6p9e99zv95ekej78u66e0                                                                       
  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: 172.16.95.137                                                                                 
  Manager Addresses:                                                                                         
   172.16.95.137:2377                                                                                         
 Runtimes: io.containerd.runc.v2 runc                                                                         
 Default Runtime: runc                                                                                       
 Init Binary: docker-init                                                                                     
 containerd version: 3dce8eb055cbb6872793272b4f20ed16117344f8                                                 
 runc version: v1.1.7-0-g860f061                                                                             
 init version: de40ad0                                                                                       
 Security Options:                                                                                           
  apparmor                                                                                                   
  seccomp                                                                                                     
   Profile: builtin                                                                                           
  cgroupns                                                                                                   
 Kernel Version: 5.15.0-78-generic                                                                          
 Operating System: Ubuntu 22.04.2 LTS                                                                         
 OSType: linux                                                                                               
 Architecture: x86_64                                                                                         
 CPUs: 2                                                                                                     
 Total Memory: 3.787GiB                                                                                       
 Name: master                                                                                                 
 ID: cf23034e-99d6-4e37-a1cd-b27f39c0ed2e                                                                     
 Docker Root Dir: /var/lib/docker                                                                             
 Debug Mode: false                                                                                           
 Experimental: false                                                                                         
 Insecure Registries:                                                                                         
  127.0.0.0/8                                                                                                 
 Live Restore Enabled: false
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.

3 、查看节点状态

root@master:~# docker node ls                                                                                 
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION             
57mvxsdn9qg2tq6aiz17et7ot *   master     Ready     Active         Leader           24.0.5
  • 1.
  • 2.
  • 3.

将节点添加到swarm集群中

使用管理器节点创建群后,我们就可以添加工作节点了。

  1. 打开一个终端,然后ssh进入要运行工作节点的机器。本教程使用名称master
  2. master节点运行docker swarm init输出生成的命令,在其他机器上执行一下命令并创建工作节点:
root@node1:~# docker swarm join --token SWMTKN-1-544xekdg657cd57fecr4g43uxk7t5pjkvxkkcbitjnygxc0nyh-0f4o0ujh0vz4nm5gxcjh3ywi3 172.16.95.137:2377
This node joined a swarm as a master.
  • 1.
  • 2.

如果我们忘记了命令, 则可以在 master 节点执行以下命令来查看相关命令:

root@master:~# docker swarm join-token worker                                                                 
To add a worker to this swarm, run the following command:                                                       
    docker swarm join --token SWMTKN-1-544xekdg657cd57fecr4g43uxk7t5pjkvxkkcbitjnygxc0nyh-0f4o0ujh0vz4nm5gxcjh3y
wi3 172.16.95.137:2377
  • 1.
  • 2.
  • 3.
  • 4.

3 、在 node2 节点重复执行 node1 上面的命令

4、在master节点运行的机器,并运行docker node ls命令以查看工作节点:

root@master:~# docker node ls                                                                                
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION             
57mvxsdn9qg2tq6aiz17et7ot *   master     Ready     Active         Leader           24.0.5                     
lqv1e6oa2hle33ff4xgxfslz3     node1      Ready     Active                          24.0.5                     
wwb5rc9nypj1e98wwr5qw99ye     node2      Ready     Active                          24.0.5
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

MANAGER列标识了集群中的管理器节点。此列node1node2中的空状态标识为worker节点。

将服务部署到swarm中

创建集群后,我们可以将服务部署到集群中。

  1. 打开一个终端,然后ssh进入运行管理器节点的机器。使用名为master的机器。
  2. 运行以下命令:
docker service create --replicas 1 --name helloworld alpine ping docker.com
  • 1.
  • docker service create命令创建服务。
  • --name标志为helloworld服务命名。
  • --replicas标志指定了1个运行实例的所需状态。
  • 参数alpine ping docker.com将服务定义为执行命令ping docker.com的Alpine Linux容器。

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_devops_02

  1. 运行docker service ls以查看正在运行的服务列表:

检查集群上的服务

  1. 我们使用ssh进入运行master节点的机器。
  2. 运行docker service inspect --pretty <SERVICE-ID>,以易于阅读的格式显示有关服务的详细信息。

执行以下命令查看服务的详细信息

docker service inspect --pretty helloworld

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_Docker_03

如果需要输出 json 格式的内容,执行命令 docker service inspect helloworld

  1. 查看服务具体运行在那个节点,我们可以执行以下命令查看:helloworld 为我们要查看的服务名称
    docker service ps helloworld

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_json_04

从上图中我们可一看到 服务 helloworld 运行在节点 master 的机器中, 而服务 helloword 运行在 node1 的节点中.

helloworld 的服务运行在master的节点上,说明 master 节点也可以像 node 节点一样执行任务.

  1. 服务 helloword 运行在node1的节点上, 我们在 node1 的机器上执行命令 docker ps
root@node1:~# docker ps
CONTAINER ID   IMAGE           COMMAND             CREATED          STATUS          PORTS     NAMES
d3bbf47cf010   alpine:latest   "ping docker.com"   14 minutes ago   Up 14 minutes             helloword.1.nw2qt760d0tupaqqyhodtz2ko
  • 1.
  • 2.
  • 3.

可以看到在 node1 的机器上正在运行 helloword 的服务容器。

扩大集群中服务部署的规模

创建好集群我们就可以使用Docker CLI来扩展服务中的容器数量。在服务中运行的容器被称为“任务”。

  1. 我们使用ssh进入master节点的机器。
  2. 运行以下命令以更改在群中运行的服务的所需状态:
    helloworld 服务扩展为 5 个
docker service scale helloworld=5
  • 1.

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_devops_05

  1. 执行完成后我们查看服务具体运行在那个节点
docker service ps helloworld
  • 1.

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_json_06

可以看到,swarm 创建了 5 个新的任务,并扩展了总共 5 个的 docker 容器实例, 并分布在不同的节点上。

删除集群上运行的服务

如果我们部署的服务不需要了, 那么我们可以从集群中删除对应的服务。

1 、运行docker service rm helloworld以删除helloworld服务。

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_docker_07

执行完命令后我们在执行 docker service ls 查看服务,服务已经被我们删除了。

2、我们可以执行命令 docker service inspect helloworld 来查看服务的信息

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_json_08

从图中执行的命令可以看出服务已经彻底被删除了。

3、当删除服务的命令执行完成后,任务容器也需要几秒钟才能清理完成,我们可以在节点上执行 docker ps 查看容器是否存在。

服务的滚动更新

在工作中我们需要经常的将我们的应用程序的新版本更新,以替换原有的老的版本的应用程序。在 Docker 的 swarm 中我们如何实现应用程序的滚动更新呢?

1 、比如我们需要部署新的一个 redis 服务到我们的swarm服务集群中。 并以10秒的更新延迟配置swarm。为了更直观的操作, 我们先部署一个较老版本的redis:6.0-alpine 服务,执行以下命令部署:

docker service create --replicas 3 --name redis --update-delay 10s redis:6.0-alpine
  • 1.

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_json_09

我们看到服务已经部署成功了。我们执行 docker service ls 结果显示已经将服务发布在所有的节点上了。

root@master:~# docker service ls   
ID             NAME      MODE         REPLICAS   IMAGE              PORTS                                     e2b2aoag8kr0   redis     replicated   3/3        redis:6.0-alpine                                             root@master:~#
  • 1.
  • 2.

部署命令参数说明:

  • --replicas : 表示我们部署的服务数量是几个,--replicas 3 表示部署 3 个
  • --update-delay : 表示任务更新的时间延迟,我们可以将时间设置为 TsTm,,Th,比如:5m10s 表示延迟 5 分钟 10 秒。
  • --update-parallelism 表示在更新时候的最大任务数量, 默认情况下调度程序一次只更新一个任务。

默认情况下,当单个任务的更新返回RUNNING状态时,调度程序会安排另一个任务进行更新,直到所有任务更新。如果在更新期间的任何时候任务返回FAILED,调度程序将暂停更新。我们可以使用docker service createdocker service update--update-failure-action标志来控制行为。

2、我们查看部署的 redis 服务情况:

docker service inspect --pretty redis

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_dev_10

3 、现在我将已经部署好的 redis 服务更新到一个较新的版本 redis:6.0.20-alpine,管理器根据UpdateConfig策略将更新应用于节点:

执行更新命令:docker service update --image redis:6.0.20-alpine redis

root@master:~# docker service update --image redis:6.0.20-alpine redis                                       
redis                                                                                                         
overall progress: 3 out of 3 tasks                                                                           
1/3: running   [==================================================>]                                         
2/3: running   [==================================================>]                                         
3/3: running   [==================================================>]                                         
verify: Service converged
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

我们在来查看下服务详细信息:

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_dev_11

image 已经变成了 redis:6.0.20-alpine , 已经更新成功.

我们在节点查看容器信息:

root@node2:~# docker ps                                                                                       
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS      NAMES 
f036280bde79   redis:6.0.20-alpine   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   6379/tcp   redis.1.
01wlu8r8z0jxmb4c2s399a6qo
  • 1.
  • 2.
  • 3.
  • 4.

同样,容器的镜像已经变成了 redis:6.0.20-alpine

调度程序更新说明:

  • 停止第一个任务。
  • 为停止的任务安排更新。
  • 启动更新任务的容器。
  • 如果任务的更新返回RUNNING,请等待指定的延迟期,然后开始下一个任务。
  • 如果在更新期间的任何时候,任务返回FAILED,请暂停更新。

4、 如果我们需要重启服务,可以执行重启服务的命令:

docker service update redis

root@master:~# docker service update redis                                                                   
redis                                                                                                         
overall progress: 3 out of 3 tasks                                                                           
1/3: running   [==================================================>]                                         
2/3: running   [==================================================>]                                         
3/3: running   [==================================================>]                                         
verify: Service converged
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

5、查看更新的信息:docker service ps redis

2023跟我一起成为docker大牛:swarm 教程:部署篇「上」_json_12