一、Docker Swarm简介

Docker Swarm有两个核心组件,一是安全集群,二是编排引擎。

Docker Swarm包含两个方面:一个企业级的Docker安全集群,以及一个微服务应用编排引擎。

集群方面,Swam将一个或多个Docker节点组织起来,方便用户以集群的方式管理它们。Docker Swarm默认有加密的分布式集群存储、加密网络、公用TLS、安全集群接入令牌以及一套简化数字证书管理的PKI。用户可以自如地添加或删除节点。

编排方面,Docker Swarm提供了一套丰富的API使得部署和管理复杂的微服务应用变得易如反掌。通过将应用定义在声明式配置文件中,就可以使用原生的Docker命令完成部署。还可以执行滚动升级、回滚以及扩缩容操作,同样基于简单的命令可以完成。

二、Docker Swarm详解

2.1 Swarm初步介绍

从集群角度来看,一个Swarm由一个或多个Docker节点组成。节点可以是物理服务器、虚拟机、树莓派或云实例。

节点会被配置为管理节点或工作节点。其中管理节点负责集群控制面;工作节点接收来自管理节点的任务并执行。

Swarm的配置和状态信息保存在一套位于所有管理节点上的分布式ectd数据库中。该数据库运行于内存中,并保持数据的最新状态。

Swarm最小调度单元是服务,随Swarm引入的,在API是一个新的对象元素。

2.2 搭建安全Swarm集群

2.2.1 搭建Swarm集群

参考如何搭建Swarm集群

2.2.2 Swarm管理器高可用性(HA)

Swarm实现了一种主从方式的多管理节点的HA。通常处于活动状态的管理节点被称为"主节点",主节点也是唯一一个会对Swarm发送控制命令的节点。

关于HA,以下是两条最佳实践原则: * 部署奇数个管理节点 * 不要部署太多管理节点(建议3个或5个)

2.2.3 内置的Swarm安全机制

Swarm集群内置有繁多的安全机制,并提供了开箱即用的合理的默认配置。

2.2.4 锁定Swarm

一个旧的管理节点重新接入Swarm会自定解密并获得Raft数据库中长时间序列的访问权,这会带来隐患。进行备份恢复可能会抹掉最新的Swarm配置。

针对以上问题,Docker提供了自动锁机制来锁定Swarm,这会强制要求重启的管理节点在提供一个集群解锁码之后才有权从新接入集群。

2.3 部署Swarm服务

使用服务仍能够配置大多数熟悉的容器属性。此外还增加了额外的特性,将其告知Docker后,Docker会负责进行服务的部署和管理。

2.3.1 创建Swarm服务

下面以例子来说明如何创建Swarm服务: 1、执行docker service create --name web-fe -p 8080:8080 --replicas 5 nigelpoulton/pluralsight-docker-ci命令创建一个名为web-fe新的服务,将每个节点上的8080端口映射到服务副本内部的8080端口,并且告知Docker总是有5个此服务的副本。

root@zq-virtual-machine:/home/zq/Desktop# docker service create --name web-fe -p 8080:8080 --replicas 5 nigelpoulton/pluralsight-docker-ci 
kl1zr1mq07b2giloiwk40xpcj
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged 

其中指令参数含义如下: * --name参数用于命名 * -p参数用于指定映射端口 * --replicas用于告知Docker有几个此服务的副本 * nigelpoulton/pluralsight-docker-ci用于告知Docker哪个镜像用于副本

2.3.2 查看Swarm服务

1、执行docker service ls命令查看Swarm中所有运行中的服务。

root@zq-virtual-machine:/home/zq/Desktop# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                                       PORTS
kl1zr1mq07b2   web-fe    replicated   5/5        nigelpoulton/pluralsight-docker-ci:latest   *:8080->8080/tcp

2、执行docker service ps命令查看服务副本列表及各副本的状态。其中每一个副本作为一行输出,显示了各副本分别运行在Swarm的哪个节点上以及期望的状态和实际状态。

root@zq-virtual-machine:/home/zq/Desktop# docker service ps web-fe
ID             NAME           IMAGE                                       NODE                    DESIRED STATE   CURRENT STATE             ERROR     PORTS
i49cp3f7ubhv   web-fe.1       nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 16 minutes ago              
d7b1v256cnlw   web-fe.2       nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 15 minutes ago              
nsrsixz6h51d    \_ web-fe.2   nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 15 minutes ago             
a71d38wr0380   web-fe.3       nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 16 minutes ago              
vo3hz34tynsg   web-fe.4       nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 16 minutes ago              
pk81lelw03fp   web-fe.5       nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 15 minutes ago              
xndi18snfgsr    \_ web-fe.5   nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 15 minutes ago  

3、执行docker service inspect --pretty web-fe命令只查看web-fe详细信息。其中--pretty参数是限制输出自己感兴趣的内容,并以易于阅读的格式打印出来。

root@zq-virtual-machine:/home/zq/Desktop# docker service inspect --pretty web-fe

ID:     kl1zr1mq07b2giloiwk40xpcj
Name:       web-fe
Service Mode:   Replicated
 Replicas:  5
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:     nigelpoulton/pluralsight-docker-ci:latest@sha256:9b6241ad65941128fb03eb2d1ec7d3c161c26894782ad25e4619131fe68667fe
 Init:      false
Resources:
Endpoint Mode:  vip
Ports:
 PublishedPort = 8080
  Protocol = tcp
  TargetPort = 8080
  PublishMode = ingress 

2.3.3 副本服务VS全局服务

服务的默认复制模式是副本模式,这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中。

全局模式这种模式,每个节点上仅运行一个脚本。通过--mode global参数来实现。 副本模式和全局模式二者命令格式如下:

root@zq-virtual-machine:/home/zq/Desktop# docker service create --name web-fe -p 8080:8080 --replicas 5 nigelpoulton/pluralsight-docker-ci
root@zq-virtual-machine:/home/zq/Desktop# docker service create --mode global --name web-fe -p 8080:8080 --replicas 5 nigelpoulton/pluralsight-docker-ci

2.3.4 服务的扩缩容

在底层实现上,Swarm执行了一个调度算法,默认将副本尽量均衡分配给Swarm中的所有节点。

1、执行docker server scale web-fe=10命令对web-fe进行扩容。将副本数增加到10个。

root@zq-virtual-machine:/home/zq/Desktop# docker service scale web-fe=10
web-fe scaled to 10
overall progress: 10 out of 10 tasks 
1/10: running   [==================================================>] 
2/10: running   [==================================================>] 
3/10: running   [==================================================>] 
4/10: running   [==================================================>] 
5/10: running   [==================================================>] 
6/10: running   [==================================================>] 
7/10: running   [==================================================>] 
8/10: running   [==================================================>] 
9/10: running   [==================================================>] 
10/10: running   [==================================================>] 
verify: Service converged 

2、执行docker service ls命令检查操作是否成功。

root@zq-virtual-machine:/home/zq/Desktop# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                                       PORTS
kl1zr1mq07b2   web-fe    replicated   10/10      nigelpoulton/pluralsight-docker-ci:latest   *:8080->8080/tcp

3、执行docker service ps web-fe命令查看各个节点在服务副本分布情况。观察到,服务副本在各个节点是均匀分布的。

root@zq-virtual-machine:/home/zq/Desktop# docker service ps web-fe
ID             NAME            IMAGE                                       NODE                    DESIRED STATE   CURRENT STATE             ERROR                              PORTS
i49cp3f7ubhv   web-fe.1        nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 36 minutes ago                                       
d7b1v256cnlw   web-fe.2        nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 35 minutes ago                                       
nsrsixz6h51d    \_ web-fe.2    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 35 minutes ago                                      
a71d38wr0380   web-fe.3        nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 36 minutes ago                                       
vo3hz34tynsg   web-fe.4        nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 36 minutes ago                                       
pk81lelw03fp   web-fe.5        nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 35 minutes ago                                       
xndi18snfgsr    \_ web-fe.5    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 35 minutes ago                                      
fxfb2qhk2w1p   web-fe.6        nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 3 minutes ago                                        
lcr2zg7fvubm   web-fe.7        nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 3 minutes ago                                        
zh7mrxq1kk1b   web-fe.8        nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 2 minutes ago                                        
yzzga1e2vuyt    \_ web-fe.8    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 2 minutes ago                                       
qknz82dl80v7    \_ web-fe.8    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Failed 3 minutes ago      "starting container failed: fa…"   
n2q48rjciwaa   web-fe.9        nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 2 minutes ago                                        
wapxh0u7s9qi    \_ web-fe.9    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 2 minutes ago                                       
rtwwob8e6age    \_ web-fe.9    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Failed 3 minutes ago      "starting container failed: fa…"   
sk2iytsjkfny   web-fe.10       nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 2 minutes ago                                        
q7n5d0bicmrp    \_ web-fe.10   nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 2 minutes ago                                       
am5awen1qf5g    \_ web-fe.10   nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Failed 3 minutes ago      "starting container failed: fa…" 

4、执行docker service scale web-fe=5命令将副本数从10个降为5个。

root@zq-virtual-machine:/home/zq/Desktop# docker service scale web-fe=5
web-fe scaled to 5
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5:   
5/5:   
verify: Service converged 

5、执行docker service ls命令检查操作是否成功。

root@zq-virtual-machine:/home/zq/Desktop# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                                       PORTS
kl1zr1mq07b2   web-fe    replicated   10/5       nigelpoulton/pluralsight-docker-ci:latest   *:8080->8080/tcp

2.3.5 删除服务

1、执行docker service rm web-fe命令删除之前部署的服务。

root@zq-virtual-machine:/home/zq/Desktop# docker service rm web-fe
web-fe

2、执行docker service ls命令检查操作是否成功。

root@zq-virtual-machine:/home/zq/Desktop# docker service ls
ID        NAME      MODE      REPLICAS   IMAGE     PORTS

2.3.6 滚动升级

对部署的应用进行滚动升级是常见的操作。 1、执行docker network create -d overlay uber-net命令创建一个名为uber-net的覆盖网络。(可选)

root@zq-virtual-machine:/home/zq/Desktop# docker network create -d overlay uber-net
0ntmifmkkvjlamdjs65kyehqs

2、执行docker network ls命令查看网络是否创建成功。观察到,已成功创建网络。(可选)

root@zq-virtual-machine:/home/zq/Desktop# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
0ntmifmkkvjl   uber-net          overlay   swarm

3、执行docker service create --name uber-svc --network uber-net -p 80:80 --replicas 12 nigelpoulton/tu-demo:v1命令创建一个名为uber-svc新的服务,并将其接入uber-net网络。

root@zq-virtual-machine:/home/zq/Desktop# docker service create --name uber-svc --network uber-net -p 80:80 --replicas 12 nigelpoulton/tu-demo:v1

以上指令参数说明如下: * --name指定服务名字为uber-svc * --network指定网络为uber-net * -p指定将Swarm80端口整体暴露出来,并映射到12个容器副本的80端口 * --replicas用于告知Docker有几个此服务的副本 * nigelpoulton/tu-demo:v1用于声明所有副本都基于nigelpoulton/tu-demo:v1镜像

4、执行docker service ls命令查看操作是否成功。这里观察到,操作已成功完成。

root@zq-virtual-machine:/home/zq/Desktop# docker service ls 
ID             NAME       MODE         REPLICAS   IMAGE                     PORTS
mxkgw950zvqs   uber-svc   replicated   12/12      nigelpoulton/tu-demo:v1   *:80->80/tcp

5、执行docker service ps uber-svc命令详细查看uber-svc服务。

root@zq-virtual-machine:/home/zq/Desktop# docker service ps uber-svc
ID             NAME              IMAGE                     NODE                    DESIRED STATE   CURRENT STATE                ERROR     PORTS
q9zq4di34cxu   uber-svc.1        nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running about a minute ago             
xewhrp13pc7j   uber-svc.2        nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running about a minute ago             
9d3ujesk5mkh   uber-svc.3        nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running about a minute ago             
4i34gzd8rum2   uber-svc.4        nigelpoulton/tu-demo:v1   zq-virtual-machine      Running         Running 43 seconds ago                 
ketlg4y903z9    \_ uber-svc.4    nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Running about a minute ago             
n6dftu6woafh   uber-svc.5        nigelpoulton/tu-demo:v1   zq-virtual-machine      Running         Running about a minute ago             
zo0eer3yyskg   uber-svc.6        nigelpoulton/tu-demo:v1   zq-virtual-machine      Running         Running about a minute ago             
sm8wrdj6d13m   uber-svc.7        nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running about a minute ago             
u7fq39358280   uber-svc.8        nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running 46 seconds ago                 
uj9eyypcoty8    \_ uber-svc.8    nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Running about a minute ago             
s4mpcjos8vlc   uber-svc.9        nigelpoulton/tu-demo:v1   zq-virtual-machine      Running         Running about a minute ago             
pwjr54dgxfmr   uber-svc.10       nigelpoulton/tu-demo:v1   zq-virtual-machine      Running         Running 42 seconds ago                 
p2zcvjqg1ihe    \_ uber-svc.10   nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Running about a minute ago             
s6gam56mcg0a   uber-svc.11       nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running 46 seconds ago                 
lzvlgyfp68sz    \_ uber-svc.11   nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Running about a minute ago             
aazg60gytw4d   uber-svc.12       nigelpoulton/tu-demo:v1   zq-virtual-machine      Running         Running about a minute ago 

6、使用Swarm中的任一节点IP,进入80端口界面,查看服务运行状态。观察到,这是一个简单的投票程序,能够注册对"football"或"soccer"的投票。

滚动升级

假设投票结束,公司希望开启一轮新的投票。现在已经为下一轮投票构建了一个新的镜像,并推送到了Docker Hub仓库,新镜像的tag由v1变更为v2。此次升级采用一种阶段性的方式——每次更新两个副本,中间间隔20s。

1、执行docker service update --image nigelpoulton/tu-demo:v2 --update-parallelism 2 --update-delay 20s uber-svc命令升级任务。

root@zq-virtual-machine:~# docker service update --image nigelpoulton/tu-demo:v2 --update-parallelism 2 --update-delay 20s uber-svc
uber-svc
overall progress: 12 out of 12 tasks 
1/12: running   [==================================================>] 
2/12: running   [==================================================>] 
3/12: running   [==================================================>] 
4/12: running   [==================================================>] 
5/12: running   [==================================================>] 
6/12: running   [==================================================>] 
7/12: running   [==================================================>] 
8/12: running   [==================================================>] 
9/12: running   [==================================================>] 
10/12: running   [==================================================>] 
11/12: running   [==================================================>] 
12/12: running   [==================================================>] 
verify: Service converged 

以上指令参数说明如下: * --update-parallelism:声明每次更新2个副本 * --update-delay:声明每次使用新镜像时有20s的延迟

2、执行docker service ps uber-svc命令查看服务具体情况。这里观察到,有些副本的版本号是v2而有些依然是v1。

root@zq-virtual-machine:~# docker service ps uber-svc
ID             NAME              IMAGE                     NODE                    DESIRED STATE   CURRENT STATE             ERROR                              PORTS
ddfs0lg2r3k0   uber-svc.1        nigelpoulton/tu-demo:v2   localhost.localdomain   Running         Running 18 minutes ago                                       
nf6y84hocq0a    \_ uber-svc.1    nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Shutdown 18 minutes ago                                      
q9zq4di34cxu    \_ uber-svc.1    nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Failed 2 hours ago        "error while removing network:…"   
dlew6u8qwrjz   uber-svc.2        nigelpoulton/tu-demo:v2   zq-virtual-machine      Running         Running 17 minutes ago                                       
dx6u94bpubxl    \_ uber-svc.2    nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Shutdown 17 minutes ago                                      
xewhrp13pc7j    \_ uber-svc.2    nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Failed 2 hours ago        "error while removing network:…"   
sorylfxqn578   uber-svc.3        nigelpoulton/tu-demo:v2   localhost.localdomain   Running         Running 21 minutes ago                                       
rnonaqvsg2tu    \_ uber-svc.3    nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Shutdown 21 minutes ago                                      
9d3ujesk5mkh    \_ uber-svc.3    nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Failed 2 hours ago        "error while removing network:…"   
pvmxldqdedsq   uber-svc.4        nigelpoulton/tu-demo:v2   localhost.localdomain   Running         Running 20 minutes ago                                       
5l6domk7n3zj    \_ uber-svc.4    nigelpoulton/tu-demo:v2   localhost.localdomain   Shutdown        Failed 18 minutes ago     "error while removing network:…"   
5b54h0pi198j    \_ uber-svc.4    jeckjohn/tu-demo:v2       localhost.localdomain   Shutdown        Rejected 21 minutes ago   "No such image: jeckjohn/tu-de…"   
8csa989cjxwy    \_ uber-svc.4    jeckjohn/tu-demo:v2       localhost.localdomain   Shutdown        Rejected 21 minutes ago   "No such image: jeckjohn/tu-de…"   
f5101ru4mxmc    \_ uber-svc.4    jeckjohn/tu-demo:v2       zq-virtual-machine      Shutdown        Rejected 21 minutes ago   "No such image: jeckjohn/tu-de…"   
hzjxe3zojzzn   uber-svc.5        nigelpoulton/tu-demo:v2   zq-virtual-machine      Running         Running 17 minutes ago                                       
s8cvea9zuq9t    \_ uber-svc.5    nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Shutdown 17 minutes ago                                      
n6dftu6woafh    \_ uber-svc.5    nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Failed 2 hours ago        "error while removing network:…"   
8rxtkpw2m54q   uber-svc.6        nigelpoulton/tu-demo:v2   localhost.localdomain   Running         Running 21 minutes ago                                       
9ijpo7muzhc6    \_ uber-svc.6    jeckjohn/tu-demo:v2       localhost.localdomain   Shutdown        Shutdown 21 minutes ago                                      
i7oltlw6nimt    \_ uber-svc.6    jeckjohn/tu-demo:v2       localhost.localdomain   Shutdown        Rejected 21 minutes ago   "No such image: jeckjohn/tu-de…"   
c6tazysu4wyz    \_ uber-svc.6    jeckjohn/tu-demo:v2       zq-virtual-machine      Shutdown        Rejected 21 minutes ago   "No such image: jeckjohn/tu-de…"   
iwjysz5uwjce    \_ uber-svc.6    jeckjohn/tu-demo:v2       localhost.localdomain   Shutdown        Rejected 21 minutes ago   "No such image: jeckjohn/tu-de…"   
n7vnqkmhflqm   uber-svc.7        nigelpoulton/tu-demo:v2   zq-virtual-machine      Running         Running 17 minutes ago                                       
f0nczgooeb8a    \_ uber-svc.7    nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Shutdown 17 minutes ago                                      
sm8wrdj6d13m    \_ uber-svc.7    nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Failed 2 hours ago        "error while removing network:…"   
y19vzp3om6ex   uber-svc.8        nigelpoulton/tu-demo:v2   localhost.localdomain   Running         Running 20 minutes ago                                       
oqchgsaageon    \_ uber-svc.8    nigelpoulton/tu-demo:v2   localhost.localdomain   Shutdown        Failed 18 minutes ago     "error while removing network:…"   
y9em0o457n29    \_ uber-svc.8    nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Shutdown 20 minutes ago                                      
u7fq39358280    \_ uber-svc.8    nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Failed 2 hours ago        "error while removing network:…"   
uj9eyypcoty8    \_ uber-svc.8    nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Failed 3 hours ago        "error while removing network:…"   
o1f9m2zsakex   uber-svc.9        nigelpoulton/tu-demo:v2   zq-virtual-machine      Running         Running 17 minutes ago                                       
qbm65do5i21l    \_ uber-svc.9    nigelpoulton/tu-demo:v2   localhost.localdomain   Shutdown        Failed 17 minutes ago     "error while removing network:…"   
9nkbgfwewnkg    \_ uber-svc.9    nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Shutdown 18 minutes ago                                      
s4mpcjos8vlc    \_ uber-svc.9    nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Failed 2 hours ago        "error while removing network:…"   
e4lwqja4jyg7   uber-svc.10       nigelpoulton/tu-demo:v2   zq-virtual-machine      Running         Running 17 minutes ago                                       
4oxkpxxv64b2    \_ uber-svc.10   nigelpoulton/tu-demo:v2   localhost.localdomain   Shutdown        Failed 17 minutes ago     "error while removing network:…"   
5ydc2afqowtl    \_ uber-svc.10   nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Shutdown 18 minutes ago                                      
pwjr54dgxfmr    \_ uber-svc.10   nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Shutdown 2 hours ago                                         
p2zcvjqg1ihe    \_ uber-svc.10   nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Shutdown 3 hours ago                                         
sgsomyqqtsu1   uber-svc.11       nigelpoulton/tu-demo:v2   localhost.localdomain   Running         Running 20 minutes ago                                       
w6egsd7ngd54    \_ uber-svc.11   nigelpoulton/tu-demo:v2   localhost.localdomain   Shutdown        Shutdown 18 minutes ago                                      
fk1buw9srfvy    \_ uber-svc.11   nigelpoulton/tu-demo:v1   zq-virtual-machine      Shutdown        Shutdown 20 minutes ago                                      

3、使用Swarm中的任一节点IP,进入80端口界面,查看服务运行状态。观察到,页面已更新。

滚动升级-图2

4、执行docker service inspect --pretty uber-svc命令查看uber-svc服务的具体情况。观察到,所有运行副本的节点都会使用前面创建的uber-net覆盖网络。

root@zq-virtual-machine:~# docker service inspect --pretty uber-svc

ID:     mxkgw950zvqsd9zgsgc3s7ur2
Name:       uber-svc
Service Mode:   Replicated
 Replicas:  12
UpdateStatus:
 State:     completed
 Started:   27 minutes ago
 Completed: 22 minutes ago
 Message:   update completed
Placement:
UpdateConfig:
 Parallelism:   2
 Delay:     20s
 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:     nigelpoulton/tu-demo:v2@sha256:af111729d35a09fd24c25607ec045184bb8d76e37714dfc2d9e55d13b3ebbc67
 Init:      false
Resources:
Networks: uber-net 
Endpoint Mode:  vip
Ports:
 PublishedPort = 80
  Protocol = tcp
  TargetPort = 80
  PublishMode = ingress 

2.4 问题定位

Docker节点默认配置是,服务使用json-file日志驱动,其他驱动还有journald(仅用于运行有systemd的Linux主机)、syslog、splunk和gelf。

journald和json-file容易配置,二者可用于docker service logs命令,命令格式为docker service logs <service-name>。这里注意:并非所有的日志驱动都支持该命令。如果使用第三方日志驱动,就需要使用相应日志平台的原生工具来查看日志。

以下是在/etc/docker/daemon.json配置文件中定义使用syslog作为日志驱动的实例:

{
  "log-driver": "syslog"
}

通过在执行docker service create命令时传入--logdriver和--log-opts参数可以强制某服务使用一个不同的日志驱动,这会覆盖/etc/docker/daemon.json中的配置。

以下是执行docker service logs uber-svc命令后的部分回显消息。其中可以添加-follow参数进行跟踪、使用--tail参数显示最近的日志、使用--details获取额外细节。

root@zq-virtual-machine:~# docker service logs uber-svc
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [1] [INFO] Starting gunicorn 20.1.0
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [1] [INFO] Listening at: http://0.0.0.0:80 (1)
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [1] [INFO] Using worker: sync
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [8] [INFO] Booting worker with pid: 8
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [9] [INFO] Booting worker with pid: 9
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [10] [INFO] Booting worker with pid: 10
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [11] [INFO] Booting worker with pid: 11

三、Docker Swarm相关操作

3.1 创建Swarm

1、执行docker swarm init --advertise-addr 192.168.100.130:2377 --listen-addr 192.168.100.130:2377命令创建一个新的Swarm,同时执行该命令的节点会成为第一个管理节点。

root@zq-virtual-machine:~# docker swarm init --advertise-addr 192.168.100.130:2377 --listen-addr 192.168.100.130:2377
Swarm initialized: current node (oz4yqja5d46z4x4sft4h9qilm) is now a manager.

针对上面指令分解说明: * docker swarm init:通知Docker初始化一个新的Swarm,并将自身作为第一个管理节点,同时这个节点开启Swarm模式 * --advertise-addr:指定其他节点用来连接到当前管理节点的IP和端口。这是为了防止节点有多个IP不能确认 * --listen-addr:指定用于承载Swarm流量的IP和端口,这也是为了防止节点有多个IP不能确认

说明:Swarm模式下的操作默认运行2377端口!!!

2、继续执行docker info命令查看 swarm 的当前状态。观察到Swarm状态为active。

root@zq-virtual-machine:~# docker info 
......
 Swarm: active
  NodeID: oz4yqja5d46z4x4sft4h9qilm
  Is Manager: true
  ClusterID: t80w9wpih8nz23ppbkzwux1p7
  Managers: 1
  Nodes: 1
  Default Address Pool: 10.0.0.0/8  
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
......

3、继续执行docker node ls命令列出Swarm中的节点。MANAGER一栏中显示【Leader】代表管理节点。

root@zq-virtual-machine:~# docker node ls
ID                            HOSTNAME             STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
oz4yqja5d46z4x4sft4h9qilm *   zq-virtual-machine   Ready     Active         Leader           20.10.18

说明:节点ID后面的【*】代表此时登录的节点!!!

3.2 查询节点到现有Swarm命令和Tocken

3.2.1 查询管理节点到现有Swarm命令和Tocken

1、登录到mgr1执行docker swarm join-token manger命令来获取添加工作节点到Swarm的命令和Token。

root@zq-virtual-machine:~# docker swarm join-token manger
To add a manger to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3y222gkw18wftep185ag02av0csb790z2pctywmistl3728gtw-6z0ncroputkh9ttdu0cp7iso6 192.168.100.130:2377

3.2.2 查询工作节点到现有Swarm命令和Tocken

1、登录到mgr1执行docker swarm join-token worker命令来获取添加工作节点到Swarm的命令和Token。

root@zq-virtual-machine:~# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3y222gkw18wftep185ag02av0csb790z2pctywmistl3728gtw-6z0ncroputkh9ttdu0cp7iso6 192.168.100.130:2377

3.3 管理/工作节点添加到现有Swarm

3.3.1 管理节点添加到现有Swarm

1、登录到mgr2执行docker swarm join --token SWMTKN-1-3y222gkw18wftep185ag02av0csb790z2pctywmistl3728gtw-6z0ncroputkh9ttdu0cp7iso6 192.168.100.130:2377 --advertise-addr 192.168.100.110:2377 --listen-addr 192.168.100.110:2377命令将工作节点wrk1添加到Swarm。注意192.168.100.110是mgr2的地址。

[root@localhost student]# docker swarm join --token  SWMTKN-1-3y222gkw18wftep185ag02av0csb790z2pctywmistl3728gtw-6z0ncroputkh9ttdu0cp7iso6 192.168.100.130:2377 --advertise-addr 192.168.100.110:2377 --listen-addr 192.168.100.110:2377
This node joined a swarm as a manger.

说明:--advertise-addr 192.168.100.110:2377 --listen-addr 192.168.100.110:2377这是可选配置!!!

3.3.2 工作节点添加到现有Swarm

1、登录到wrk1执行docker swarm join --token SWMTKN-1-3y222gkw18wftep185ag02av0csb790z2pctywmistl3728gtw-6z0ncroputkh9ttdu0cp7iso6 192.168.100.130:2377 --advertise-addr 192.168.100.110:2377 --listen-addr 192.168.100.110:2377命令将工作节点wrk1添加到Swarm。注意192.168.100.110是wrk1的地址。

[root@localhost student]# docker swarm join --token  SWMTKN-1-3y222gkw18wftep185ag02av0csb790z2pctywmistl3728gtw-6z0ncroputkh9ttdu0cp7iso6 192.168.100.130:2377 --advertise-addr 192.168.100.110:2377 --listen-addr 192.168.100.110:2377
This node joined a swarm as a worker.

说明:--advertise-addr 192.168.100.110:2377 --listen-addr 192.168.100.110:2377这是可选配置!!!

3.4 查询全部节点

1、继续执行docker node ls命令列出Swarm中的节点。MANAGER一栏中显示【Leader】代表管理节点。

root@zq-virtual-machine:~# docker node ls
ID                            HOSTNAME             STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
oz4yqja5d46z4x4sft4h9qilm *   zq-virtual-machine   Ready     Active         Leader           20.10.18

说明:节点ID后面的【*】代表此时登录的节点!!!

3.5 锁定Swarm

1、在管理节点上执行docker swarm update --autolock=true命令启用锁。注意:这里会生成钥匙,如SWMKEY-1-E2laq+kwZsfvcjcOsYq2Bi15vCdQOqxKh3YIfnji9LA,解锁时会用到。

root@zq-virtual-machine:/home/zq/Desktop# docker swarm update --autolock=true
Swarm updated.
To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:

    SWMKEY-1-E2laq+kwZsfvcjcOsYq2Bi15vCdQOqxKh3YIfnji9LA

Please remember to store this key in a password manager, since without it you
will not be able to restart the manager.

2、在管理节点上继续执行service docker restart命令重启docker。

root@zq-virtual-machine:/home/zq/Desktop# service docker restart

3、在管理节点上继续执行docker node ls命令查看Swarm节点。观察到已被锁定。

root@zq-virtual-machine:/home/zq/Desktop# docker node ls
Error response from daemon: Swarm is encrypted and needs to be unlocked before it can be used. Please use "docker swarm unlock" to unlock it.

3.6 解锁Swarm

1、在管理节点上执行docker swarm unlcok命令解锁。输入钥匙即可解锁。

root@zq-virtual-machine:/home/zq/Desktop# docker swarm unlock
Please enter unlock key: 

2、在管理节点上继续执行docker node ls命令查看Swarm节点。观察到已被解锁。

t@zq-virtual-machine:/home/zq/Desktop# docker node ls
ID                            HOSTNAME                STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
g4i1tmqc0rvnzeh51l2dks4jw     localhost.localdomain   Ready     Active                          20.10.18
q9n8xqjyxx1z3gbn3dncobzpg     localhost.localdomain   Ready     Active                          20.10.18
oz4yqja5d46z4x4sft4h9qilm *   zq-virtual-machine      Ready     Active         Leader           20.10.18

3.7 创建新服务

3.7.1 创建副本服务(默认)

1、执行docker service create --name web-fe -p 8080:8080 --replicas 5 nigelpoulton/pluralsight-docker-ci命令创建一个名为web-fe新的服务,将每个节点上的8080端口映射到服务副本内部的8080端口,并且告知Docker总是有5个此服务的副本。

root@zq-virtual-machine:/home/zq/Desktop# docker service create --name web-fe -p 8080:8080 --replicas 5 nigelpoulton/pluralsight-docker-ci 
kl1zr1mq07b2giloiwk40xpcj
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged 

其中指令参数含义如下: * --name参数用于命名 * -p参数用于指定映射端口 * --replicas用于告知Docker有几个此服务的副本 * nigelpoulton/pluralsight-docker-ci用于告知Docker哪个镜像用于副本

3.7.2 创建全局服务

1、执行docker service create --mode global --name web-fe -p 8080:8080 --replicas 5 nigelpoulton/pluralsight-docker-ci命令创建一个名为web-fe新的服务,

root@zq-virtual-machine:/home/zq/Desktop# docker service create --mode global --name web-fe -p 8080:8080 --replicas 5 nigelpoulton/pluralsight-docker-ci

其中指令参数含义如下: * --mode参数用于指明全局 * --name参数用于命名 * -p参数用于指定映射端口 * --replicas用于告知Docker有几个此服务的副本 * nigelpoulton/pluralsight-docker-ci用于告知Docker哪个镜像用于副本

3.8 查看Swarm服务

1、执行docker service ls命令查看Swarm中所有运行中的服务。

root@zq-virtual-machine:/home/zq/Desktop# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                                       PORTS
kl1zr1mq07b2   web-fe    replicated   5/5        nigelpoulton/pluralsight-docker-ci:latest   *:8080->8080/tcp

2、执行docker service ps命令查看服务副本列表及各副本的状态。其中每一个副本作为一行输出,显示了各副本分别运行在Swarm的哪个节点上以及期望的状态和实际状态。

root@zq-virtual-machine:/home/zq/Desktop# docker service ps web-fe
ID             NAME           IMAGE                                       NODE                    DESIRED STATE   CURRENT STATE             ERROR     PORTS
i49cp3f7ubhv   web-fe.1       nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 16 minutes ago              
d7b1v256cnlw   web-fe.2       nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 15 minutes ago              
nsrsixz6h51d    \_ web-fe.2   nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 15 minutes ago             
a71d38wr0380   web-fe.3       nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 16 minutes ago              
vo3hz34tynsg   web-fe.4       nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 16 minutes ago              
pk81lelw03fp   web-fe.5       nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 15 minutes ago              
xndi18snfgsr    \_ web-fe.5   nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 15 minutes ago  

3、执行docker service inspect --pretty web-fe命令只查看web-fe详细信息。其中--pretty参数是限制输出自己感兴趣的内容,并以易于阅读的格式打印出来。

root@zq-virtual-machine:/home/zq/Desktop# docker service inspect --pretty web-fe

ID:     kl1zr1mq07b2giloiwk40xpcj
Name:       web-fe
Service Mode:   Replicated
 Replicas:  5
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:     nigelpoulton/pluralsight-docker-ci:latest@sha256:9b6241ad65941128fb03eb2d1ec7d3c161c26894782ad25e4619131fe68667fe
 Init:      false
Resources:
Endpoint Mode:  vip
Ports:
 PublishedPort = 8080
  Protocol = tcp
  TargetPort = 8080
  PublishMode = ingress 

3.9 扩缩容服务

3.9.1 扩容服务

1、执行docker server scale web-fe=10命令对web-fe进行扩容。将副本数增加到10个。

root@zq-virtual-machine:/home/zq/Desktop# docker service scale web-fe=10
web-fe scaled to 10
overall progress: 10 out of 10 tasks 
1/10: running   [==================================================>] 
2/10: running   [==================================================>] 
3/10: running   [==================================================>] 
4/10: running   [==================================================>] 
5/10: running   [==================================================>] 
6/10: running   [==================================================>] 
7/10: running   [==================================================>] 
8/10: running   [==================================================>] 
9/10: running   [==================================================>] 
10/10: running   [==================================================>] 
verify: Service converged 

2、执行docker service ls命令检查操作是否成功。

root@zq-virtual-machine:/home/zq/Desktop# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                                       PORTS
kl1zr1mq07b2   web-fe    replicated   10/10      nigelpoulton/pluralsight-docker-ci:latest   *:8080->8080/tcp

3、执行docker service ps web-fe命令查看各个节点在服务副本分布情况。观察到,服务副本在各个节点是均匀分布的。

root@zq-virtual-machine:/home/zq/Desktop# docker service ps web-fe
ID             NAME            IMAGE                                       NODE                    DESIRED STATE   CURRENT STATE             ERROR                              PORTS
i49cp3f7ubhv   web-fe.1        nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 36 minutes ago                                       
d7b1v256cnlw   web-fe.2        nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 35 minutes ago                                       
nsrsixz6h51d    \_ web-fe.2    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 35 minutes ago                                      
a71d38wr0380   web-fe.3        nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 36 minutes ago                                       
vo3hz34tynsg   web-fe.4        nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 36 minutes ago                                       
pk81lelw03fp   web-fe.5        nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 35 minutes ago                                       
xndi18snfgsr    \_ web-fe.5    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 35 minutes ago                                      
fxfb2qhk2w1p   web-fe.6        nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 3 minutes ago                                        
lcr2zg7fvubm   web-fe.7        nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 3 minutes ago                                        
zh7mrxq1kk1b   web-fe.8        nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Running         Running 2 minutes ago                                        
yzzga1e2vuyt    \_ web-fe.8    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 2 minutes ago                                       
qknz82dl80v7    \_ web-fe.8    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Failed 3 minutes ago      "starting container failed: fa…"   
n2q48rjciwaa   web-fe.9        nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 2 minutes ago                                        
wapxh0u7s9qi    \_ web-fe.9    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 2 minutes ago                                       
rtwwob8e6age    \_ web-fe.9    nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Failed 3 minutes ago      "starting container failed: fa…"   
sk2iytsjkfny   web-fe.10       nigelpoulton/pluralsight-docker-ci:latest   zq-virtual-machine      Running         Running 2 minutes ago                                        
q7n5d0bicmrp    \_ web-fe.10   nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Shutdown 2 minutes ago                                       
am5awen1qf5g    \_ web-fe.10   nigelpoulton/pluralsight-docker-ci:latest   localhost.localdomain   Shutdown        Failed 3 minutes ago      "starting container failed: fa…" 

3.9.2 缩容服务

1、执行docker service scale web-fe=5命令将副本数从10个降为5个。

root@zq-virtual-machine:/home/zq/Desktop# docker service scale web-fe=5
web-fe scaled to 5
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5:   
5/5:   
verify: Service converged 

2、执行docker service ls命令检查操作是否成功。

root@zq-virtual-machine:/home/zq/Desktop# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                                       PORTS
kl1zr1mq07b2   web-fe    replicated   10/5       nigelpoulton/pluralsight-docker-ci:latest   *:8080->8080/tcp

3.10 删除服务

1、执行docker service rm web-fe命令删除之前部署的服务。

root@zq-virtual-machine:/home/zq/Desktop# docker service rm web-fe
web-fe

2、执行docker service ls命令检查操作是否成功。

root@zq-virtual-machine:/home/zq/Desktop# docker service ls
ID        NAME      MODE      REPLICAS   IMAGE     PORTS

3.11 变更运行服务属性

1、执行docker service create --name uber-svc --network uber-net -p 80:80 --replicas 12 nigelpoulton/tu-demo:v1命令创建一个名为uber-svc新的服务,并将其接入uber-net网络。

root@zq-virtual-machine:/home/zq/Desktop# docker service create --name uber-svc --network uber-net -p 80:80 --replicas 12 nigelpoulton/tu-demo:v1

以上指令参数说明如下: * --name指定服务名字为uber-svc * --network指定网络为uber-net * -p指定将Swarm80端口整体暴露出来,并映射到12个容器副本的80端口 * --replicas用于告知Docker有几个此服务的副本 * nigelpoulton/tu-demo:v1用于声明所有副本都基于nigelpoulton/tu-demo:v1镜像

2、执行docker service ls命令查看操作是否成功。这里观察到,操作已成功完成。

root@zq-virtual-machine:/home/zq/Desktop# docker service ls 
ID             NAME       MODE         REPLICAS   IMAGE                     PORTS
mxkgw950zvqs   uber-svc   replicated   12/12      nigelpoulton/tu-demo:v1   *:80->80/tcp

3、执行docker service ps uber-svc命令详细查看uber-svc服务。

root@zq-virtual-machine:/home/zq/Desktop# docker service ps uber-svc
ID             NAME              IMAGE                     NODE                    DESIRED STATE   CURRENT STATE                ERROR     PORTS
q9zq4di34cxu   uber-svc.1        nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running about a minute ago             
xewhrp13pc7j   uber-svc.2        nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running about a minute ago             
9d3ujesk5mkh   uber-svc.3        nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running about a minute ago             
4i34gzd8rum2   uber-svc.4        nigelpoulton/tu-demo:v1   zq-virtual-machine      Running         Running 43 seconds ago                 
ketlg4y903z9    \_ uber-svc.4    nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Running about a minute ago             
n6dftu6woafh   uber-svc.5        nigelpoulton/tu-demo:v1   zq-virtual-machine      Running         Running about a minute ago             
zo0eer3yyskg   uber-svc.6        nigelpoulton/tu-demo:v1   zq-virtual-machine      Running         Running about a minute ago             
sm8wrdj6d13m   uber-svc.7        nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running about a minute ago             
u7fq39358280   uber-svc.8        nigelpoulton/tu-demo:v1   localhost.localdomain   Running         Running 46 seconds ago                 
uj9eyypcoty8    \_ uber-svc.8    nigelpoulton/tu-demo:v1   localhost.localdomain   Shutdown        Running about a minute ago             
s4mpcjos8vlc   uber-svc.9        nigelpoulton/tu-demo:v1   zq-virtual-machine      Running         Running about a minute ago             

3.12 查看服务日志

1、执行docker service logs uber-svc命令查看服务日志。其中可以添加-follow参数进行跟踪、使用--tail参数显示最近的日志、使用--details获取额外细节。

root@zq-virtual-machine:~# docker service logs uber-svc
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [1] [INFO] Starting gunicorn 20.1.0
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [1] [INFO] Listening at: http://0.0.0.0:80 (1)
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [1] [INFO] Using worker: sync
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [8] [INFO] Booting worker with pid: 8
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [9] [INFO] Booting worker with pid: 9
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [10] [INFO] Booting worker with pid: 10
uber-svc.3.rnonaqvsg2tu@zq-virtual-machine     | [2022-10-07 04:25:21 +0000] [11] [INFO] Booting worker with pid: 11

3.13 创建网络

1、执行docker network create -d overlay uber-net命令创建一个名为uber-net的覆盖网络。(可选)

root@zq-virtual-machine:/home/zq/Desktop# docker network create -d overlay uber-net
0ntmifmkkvjlamdjs65kyehqs

2、执行docker network ls命令查看网络是否创建成功。观察到,已成功创建网络。(可选)

root@zq-virtual-machine:/home/zq/Desktop# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
0ntmifmkkvjl   uber-net          overlay   swarm