Swarm就是一组docker宿主机组成的cluster,它有个管理节点叫作swarm manager,这个swarm里的docker命令都在这个swarm manager上执行,其他的节点都叫作worker。一个docker宿主机通过运行docker swarm init命令将自己设定为swarm manager,而其他的宿主机通过运行docker swarm join命令并指定swarm manager的IP和端口(默认端口2377)来加入swarm(join)。
在笔记四中部署hello-service时,其实已经用到了swarm,下面还是通过demo来更直观的了解swarm吧。
Note
本文demo参考docker官方文档,有条件的朋友建议直接看原文Link:https://docs.docker.com/get-started/part4/#create-a-cluster
Demo
Swarm manager
我先用一台IP是10.200.218.124的宿主机来做swarm manager。执行docker swarm init,会提示我们怎么将其他的宿主机join到这个swarm中。
root@hunk-virtual-machine:/home/hunk/docker# docker swarm init
Swarm initialized: current node (pxjmqahdfyqp2m2znlaj4kwc2) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-51yl2q26jn2za02mcb5id3f3etkx38s6js19xnfzg1ldnnq6ft-9bgk59pk5f95m53y7w65gl1mi \
10.200.218.124:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
note:swarm manager节点和worker节点都要先login。
Swarm node
我用另一台IP是10.200.218.125的宿主机来join到上面的swarm中。
root@hunk-virtual-machine:/home/hunk# docker swarm join \
> --token SWMTKN-1-51yl2q26jn2za02mcb5id3f3etkx38s6js19xnfzg1ldnnq6ft-9bgk59pk5f95m53y7w65gl1mi \
> 10.200.218.124:2377
This node joined a swarm as a worker.
View node
在swarm manager上查看所有的node
root@hunk-virtual-machine:/home/hunk/docker# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
j6s1lwlgq8d6o7mxq5azg0gxh hunk-virtual-machine Ready Active
pxjmqahdfyqp2m2znlaj4kwc2 * hunk-virtual-machine Ready Active Leader
Deploy service
在笔记四里面,我们用yml配置来部署了一个hello-service服务,其实当时已经用到了swarm,只是我们只有一个swarm manager,没有worker,service所有的container replicas都运行在swarm manager上。而当前我们多了一个worker,那service的container replicas其实会被均匀的分配到所有的worker上(包括swarm manager)。
先用同样的方式部署hello-service。
root@hunk-virtual-machine:/home/hunk/docker# docker stack deploy -c hello-service.yml hello-service
Creating network hello-service_webnet
Creating service hello-service_web
在swarm manager上查看container replicas的分布情况
root@hunk-virtual-machine:/home/hunk/docker# docker stack ps hello-service --no-resolve
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
q0wv31fthg3c y46ique6nw7taei64dfm44c6s.1 hebostary/gohead:demo1 pxjmqahdfyqp2m2znlaj4kwc2 Running Running 53 seconds ago
u22hl65sgyd6 y46ique6nw7taei64dfm44c6s.2 hebostary/gohead:demo1 j6s1lwlgq8d6o7mxq5azg0gxh Running Running less than a second ago
vjdgx00ga2k5 y46ique6nw7taei64dfm44c6s.3 hebostary/gohead:demo1 pxjmqahdfyqp2m2znlaj4kwc2 Running Running 53 seconds ago
tdi3fbp2sn3f y46ique6nw7taei64dfm44c6s.4 hebostary/gohead:demo1 j6s1lwlgq8d6o7mxq5azg0gxh Running Running less than a second ago
n9vokwj46sbi y46ique6nw7taei64dfm44c6s.5 hebostary/gohead:demo1 pxjmqahdfyqp2m2znlaj4kwc2 Running Running 53 seconds ago
root@hunk-virtual-machine:/home/hunk/docker# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8bedc58f8933 hebostary/gohead@sha256:969c4f12d7c1d9e3f167498e1779aceefc631a158ec4e18730d16f5602569d03 "python app.py" 5 minutes ago Up 5 minutes 80/tcp hello-service_web.3.vjdgx00ga2k5jo0757wmmw8fg
5bcaa11079d0 hebostary/gohead@sha256:969c4f12d7c1d9e3f167498e1779aceefc631a158ec4e18730d16f5602569d03 "python app.py" 5 minutes ago Up 5 minutes 80/tcp hello-service_web.5.n9vokwj46sbi68wozrmkkvx8v
6c52c7c28e71 hebostary/gohead@sha256:969c4f12d7c1d9e3f167498e1779aceefc631a158ec4e18730d16f5602569d03 "python app.py" 5 minutes ago Up 5 minutes 80/tcp hello-service_web.1.q0wv31fthg3cwqffrm2ocgkur
查看worker节点上的container
root@hunk-virtual-machine:/home/hunk# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fdc525604b7 hebostary/gohead@sha256:969c4f12d7c1d9e3f167498e1779aceefc631a158ec4e18730d16f5602569d03 "python app.py" 7 minutes ago Up 7 minutes 80/tcp hello-service_web.2.u22hl65sgyd6y9w3effadl37u
a21c29caead8 hebostary/gohead@sha256:969c4f12d7c1d9e3f167498e1779aceefc631a158ec4e18730d16f5602569d03 "python app.py" 7 minutes ago Up 7 minutes 80/tcp hello-service_web.4.tdi3fbp2sn3f528jdvg3a35x2
curl访问service
root@n209-h246:/home/hunk# curl http://10.200.218.124:4000
<h3>Hello World!</h3><b>Hostname:</b> 9fdc525604b7<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>root@n209-h246:/home/hunk# curl http://10.200.218.124:4000
<h3>Hello World!</h3><b>Hostname:</b> 5bcaa11079d0<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>root@n209-h246:/home/hunk# curl http://10.200.218.124:4000
<h3>Hello World!</h3><b>Hostname:</b> 8bedc58f8933<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
root@n209-h246:/home/hunk# curl http://10.200.218.125:4000
<h3>Hello World!</h3><b>Hostname:</b> 6c52c7c28e71<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>root@n209-h246:/home/hunk# curl http://10.200.218.125:4000
<h3>Hello World!</h3><b>Hostname:</b> 8bedc58f8933<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>root@n209-h246:/home/hunk# curl http://10.200.218.125:4000
<h3>Hello World!</h3><b>Hostname:</b> 5bcaa11079d0<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
每次请求返回的hostname都不同,说明这些请求确实被分发到了不同的task中,有loadbalance的处理。另外,除了swarm manager,我们用worker节点的IP地址也可以访问这个web服务。这里和普通的服务可能有些区别了,每个node上都能接收处理外部请求,并且都有loadbalance的能力。这里我们直接引用官方demo的ingress network图,它说明swarm里所有的node都能对外提供api,并且都有loadbalance的能力。