Docker 1.12版本提供服务的Scaling、health check、滚动升级等功能,并提供了内置的dns、vip机制,实现service的服务发现和负载均衡能力。
在启动容器之前,先来创建一个覆盖网络,用来保证在不同主机上的容器网络互通的网络模式
[root@manager-node ~]
do7gkto6w4xjw0ooytxamm4d3
[root@manager-node ~]
NETWORK ID NAME DRIVER SCOPE
64c014f61d15 bridge bridge
local
10d1451ecc8d docker_gwbridge bridge
local
5764ade8774b host host
local
50kipkihuwxy ingress overlay swarm
do7gkto6w4xj ngx_net overlay swarm
f2af952cd27a none null
local
在manager-node节点上使用上面这个覆盖网络创建nginx服务:
其中,--replicas 参数指定服务由几个实例组成。
注意:不需要提前在节点上下载nginx镜像,这个命令执行后会自动下载这个容器镜像(比如此处创建tomcat容器,就将下面命令中的镜像改为tomcat镜像)。
[root@manager-node ~]
bkmgnxkwvryq5s804ssr6osqc
就创建了一个具有一个副本(--replicas 1 )的nginx服务,使用镜像nginx
使用 docker service
ls
查看正在运行服务的列表
[root@manager-node ~]
ID NAME REPLICAS IMAGE COMMAND
bkmgnxkwvryq my-
test
1
/1
nginx
查询Swarm中服务的信息
--pretty 使命令输出格式化为可读的格式,不加 --pretty 可以输出更详细的信息:
[root@manager-node ~]
ID: bkmgnxkwvryq5s804ssr6osqc
Name: my-
test
Mode: Replicated
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
ContainerSpec:
Image: nginx
Resources:
Networks: do7gkto6w4xjw0ooytxamm4d3
Ports:
Protocol = tcp
TargetPort = 80
PublishedPort = 80
查询到哪个节点正在运行该服务。如下该容器被调度到manager-node节点上启动了,然后访问http:
//10
.10.172.201即可访问这个容器应用(如果调度到其他节点,访问也是如此)
[root@manager-node ~]
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
97g8jujp63aq2mbgiovzy2m2b my-
test
.1 nginx manager-node Running Running 46 seconds ago
注意,如果上面命令执行后,上面的 STATE 字段中刚开始的服务状态为 Preparing,需要等一会才能变为 Running 状态,其中最费时间的应该是下载镜像的过程。
有上面命令可知,该服务在manager-node节点上运行。登陆该节点,可以查看到nginx容器在运行中
[root@manager-node ~]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1d3c8549c74 nginx:latest
"nginx -g 'daemon off"
3 minutes ago Up 3 minutes 80
/tcp
my-
test
.1.97g8jujp63aq2mbgiovzy2m2b
-----------------------------------------------------------在Swarm中动态扩展服务(scale)-----------------------------------------------------------
当然,如果只是通过service启动容器,swarm也算不上什么新鲜东西了。Service还提供了复制(类似kubernetes里的副本)功能。可以通过 docker service scale 命令来设置服务中容器的副本数:
比如将上面的my-
test
容器动态扩展到5个,命令如下:
[root@manager-node ~]
my-
test
scaled to 5
和创建服务一样,增加scale数之后,将会创建新的容器,这些新启动的容器也会经历从准备到运行的过程,过一分钟左右,服务应该就会启动完成,这时候可以再来看一下 nginx 服务中的容器
[root@manager-node ~]
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
97g8jujp63aq2mbgiovzy2m2b my-
test
.1 nginx manager-node Running Running 5 minutes ago
3log3kj86b8pdui1wttp60q47 my-
test
.2 nginx node2 Running Running 20 seconds ago
d3dhsrevv55drhgjryz06rfvl my-
test
.3 nginx node1 Running Running 38 seconds ago
9817bpuxud3wpdzouk4dntybm my-
test
.4 nginx node1 Running Running 38 seconds ago
9dmflf1ysr7k3b4x0r5qigy1g my-
test
.5 nginx manager-node Running Running about a minute ago
可以看到,之前my-
test
容器只在manager-node节点上有一个实例,而现在又增加了4个实例。
这5个副本的my-
test
容器分别运行在这三个节点上,登陆这三个节点,就会发现已经存在运行着的my-
test
容器。
-----------------------------------------------------------------------------------------------------
特别需要清楚的一点:
如果一个节点宕机了(即该节点就会从swarm集群中被踢出),则Docker应该会将在该节点运行的容器,调度到其他节点,以满足指定数量的副本保持运行状态。
比如:
将node1宕机后或将node1的docker服务关闭,那么它上面的task实例就会转移到别的节点上。当node1节点恢复后,它转移出去的task实例不会主动转移回来,
只能等别的节点出现故障后转移task实例到它的上面。使用命令
"docker node ls"
,发现node1节点已不在swarm集群中了。
然后过一会查询服务的状态列表
[root@manager-node ~]
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
97g8jujp63aq2mbgiovzy2m2b my-
test
.1 nginx manager-node Running Running 10 minutes ago
3log3kj86b8pdui1wttp60q47 my-
test
.2 nginx node2 Running Running 4 minutes ago
dlb7m3q2lrfh9vlm1r6tg2nlk my-
test
.3 nginx node2 Ready Preparing
less
than a second ago
d3dhsrevv55drhgjryz06rfvl \_ my-
test
.3 nginx node1 Shutdown Running 4 minutes ago
63s3azdo71p9p3mo3yg06ct1i my-
test
.4 nginx node2 Ready Preparing
less
than a second ago
9817bpuxud3wpdzouk4dntybm \_ my-
test
.4 nginx node1 Shutdown Running 4 minutes ago
9dmflf1ysr7k3b4x0r5qigy1g my-
test
.5 nginx manager-node Running Running 5 minutes ago
发现,node1节点出现故障后,它上面之前的两个task任务已经转移到node2节点上了。
登陆到node2节点上,可以看到这两个运行的task任务。当访问10.10.172.203节点的80端口,swarm的负载均衡会把请求路由到一个任意节点的可用的容器上。
[root@node2 ~]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bfa6b4e510b6 nginx:latest
"nginx -g 'daemon off"
55 seconds ago Up 52 seconds 80
/tcp
my-
test
.3.dlb7m3q2lrfh9vlm1r6tg2nlk
b8b28144f968 nginx:latest
"nginx -g 'daemon off"
55 seconds ago Up 53 seconds 80
/tcp
my-
test
.4.63s3azdo71p9p3mo3yg06ct1i
8bdd0608d1cd nginx:latest
"nginx -g 'daemon off"
5 minutes ago Up 5 minutes 80
/tcp
my-
test
.2.3log3kj86b8pdui1wttp60q47
再次在node2节点上将从node1上转移过来的两个task关闭
[root@node2 ~]
my-
test
.3.dlb7m3q2lrfh9vlm1r6tg2nlk
my-
test
.4.63s3azdo71p9p3mo3yg06ct1i
再次查询服务的状态列表,发现这两个task又转移到node1上了(即在swarm cluster集群中启动的容器,在worker node节点上删除或停用后,该容器会自动转移到其他的worker node节点上)
[root@manager-node ~]
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
97g8jujp63aq2mbgiovzy2m2b my-
test
.1 nginx manager-node Running Running 13 minutes ago
3log3kj86b8pdui1wttp60q47 my-
test
.2 nginx node2 Running Running 8 minutes ago
68oxkukpnxcisr35rg18b3hr4 my-
test
.3 nginx node2 Running Running 13 seconds ago
dlb7m3q2lrfh9vlm1r6tg2nlk \_ my-
test
.3 nginx node2 Shutdown Complete 20 seconds ago
d3dhsrevv55drhgjryz06rfvl \_ my-
test
.3 nginx node1 Shutdown Running 8 minutes ago
81a87qt79pnlcuyulwaocbr8a my-
test
.4 nginx node2 Running Running 14 seconds ago
63s3azdo71p9p3mo3yg06ct1i \_ my-
test
.4 nginx node2 Shutdown Complete 20 seconds ago
9817bpuxud3wpdzouk4dntybm \_ my-
test
.4 nginx node1 Shutdown Running 8 minutes ago
9dmflf1ysr7k3b4x0r5qigy1g my-
test
.5 nginx manager-node Running Running 9 minutes ago
----------------------------------------------------------------------------------------------------
同理,swarm还可以缩容,如下,将my-
test
容器变为1个。其它全部会被Shutdown
[root@manager-node ~]
[root@manager-node ~]
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
3log3kj86b8pdui1wttp60q47 my-
test
.2 nginx node2 Running Running 9 minutes ago
登录node2节点,使用docker
ps
查看,会发现容器是up状态。
---------------------------------------------------------------------------------------------------
删除容器服务
[root@manager-node ~]
[root@manager-node ~]
my-
test
[root@manager-node ~]
Error: No such service: my-
test
---------------------------------------------------------------------------------------------------
除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令。 可对 服务的启动 参数 进行 更新/修改。
[root@manager-node ~]
9wtr4fnrfflo07vyt3jd4zmhw
[root@manager-node ~]
my-
test
更新完毕以后,可以查看到REPLICAS已经变成3
/3
[root@manager-node ~]
ID NAME REPLICAS IMAGE COMMAND
9wtr4fnrfflo my-
test
3
/3
nginx
[root@manager-node ~]
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
dsxvyuiwarky040jj7ws0wwxn my-
test
.1 nginx manager-node Running Running 43 seconds ago
5zys9b8njm2mnlhumy0tl2jtn my-
test
.2 nginx node2 Running Running 34 seconds ago
dl274y2y4gw4ecvvn6nh9pzsi my-
test
.3 nginx manager-node Running Running 33 seconds ago
docker service update 命令,也可用于直接 升级 镜像等。
[root@manager-node ~]
my-
test
[root@manager-node ~]
ID NAME REPLICAS IMAGE COMMAND
9wtr4fnrfflo my-
test
2
/3
nginx:new