一、Swarm介绍
Docker Swarm是管理跨节点容器的编排工具,相较于Docker Compose而言,Compose只能编排单节点上的容器,Swarm将一群Docker节点虚拟化为一个主机,使得用户只要在单一主机上操作就能完成对整个容器集群的管理工作。如果下载的是最新版的Docker,那么Swarm就已经被包含在内了,无需再安装。
Docker Swarm架构包含两种角色,manager和node,前者是Swarm Daemon工作的节点,包含了调度器、路由、服务发现等功能,负责接收客户端的集群管理请求,然后调度Node进行具体的容器工作,比如容器的创建、扩容与销毁等。 manager本身也是一个node。通常情况下,为了集群的高可用,manager个数>=3的奇数,node的个数则是不限制。
二、Swarm实例
2.1 准备工作
我们需要准备好三个节点,并在各自节点上安装好Docker Engine,才能进行接下来的实例搭建。此处选本地虚拟机方式搭建三台Centos虚机,并安装Docker(Docker初体验)。
192.168.160.100 ————作为manager
192.168.160.101 ————作为node1
192.168.160.102 ————作为node2
2.2 创建集群
在创建集群之前,我们使用docker node ls
想查看下集群中节点的信息,反馈目前没有节点信息,并且当前节点并不是manager。
博主之前已经创建过一个swarm集群,所以先删除掉。
[root@localhost ~]# docker swarm leave -f 删除swarm
那么我们首先就在manager这个节点上执行如下操作,表示要将它设置为manager,并且设置自己的通讯IP为192.168.160.100
。
[root@localhost ~]# docker swarm init --advertise-addr 192.168.160.100
Swarm initialized: current node (upral6mrlz1928ssrqrehjnr8) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4jg8as3v4whcy9gtabon078ooyiu1fuytuelyb2ipqbcuxa7jk-55dc9derg80k6ovt0jx2kju28 192.168.160.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
如上就完成了manager节点的设置,并且得到提示信息如下:
- 可以在其它节点上执行docker swarm join --token......来将该节点设置为工作node,并加入到这个swarm集群中;
- 可以在其它节点上执行docker swarm join-token manager来获取下一步执行指令,执行该指令后,该节点将设置为manager从节点加入到这个swarm集群中;
我们目前演示的是一个manager,两个工作node的模式,所以在另外两台node1和node2上执行第一个命令即可:
docker swarm join --token SWMTKN-1-4jg8as3v4whcy9gtabon078ooyiu1fuytuelyb2ipqbcuxa7jk-55dc9derg80k6ovt0jx2kju28 192.168.160.100:2377
如此,一个swarm集群就算搭建完成了。
2.3 使用集群
manager是我们管理集群的入口,我们的docker命令都是在manager上执行,node节点上是不能执行dockr命令的,这一点要十分牢记。
查看当前节点信息;
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
i91jji6pecz0pic225aogilh7 localhost.localdomain Ready Active 20.10.21
so1xdgl2iudz0gobsnh60cgca localhost.localdomain Ready Active 20.10.21
upral6mrlz1928ssrqrehjnr8 * localhost.localdomain Ready Active Leader 20.10.21
创建一个私有网络,供不同节点上的容器互通使用;
[root@localhost ~]# docker network create -d overlay niginx_network
0mbficvfzsly02hs5v34iq0p1
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
df559dd730a7 bridge bridge local
a0e7ced640ef docker_gwbridge bridge local
9df73a6f4d7a host host local
9i5uwy0rfkek ingress overlay swarm
2187dde6db43 mynet bridge local
0mbficvfzsly niginx_network overlay swarm
fa0cdda1cb13 none null local
使用指定的网络部署一个服务(提前拉去镜像docker pull nginx);
[root@localhost ~]# docker service create --replicas 1 --network niginx_network --name my_nginx -p 80:80 nginx:latest
goaillb240g83fi1ygzjj39h4
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2193c8281810 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp my_nginx.1.s558g27cnz6s4h9492eii03bp
如上使用nginx:latest镜像创建了一个容器,容器名称为my_nginx,对外暴露80端口;
查看运行中的服务列表;
[root@localhost ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
goaillb240g8 my_nginx replicated 1/1 nginx:latest *:80->80/tcp
查看某个服务在哪个节点上运行;
[root@localhost ~]# docker service ps my_nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
s558g27cnz6s my_nginx.1 nginx:latest hostname-100 Running Running 5 minutes ago
动态扩缩容某个服务的容器个数;
[root@localhost ~]# docker service scale my_nginx=4
my_nginx scaled to 4
overall progress: 4 out of 4 tasks
1/4: running [==================================================>]
2/4: running [==================================================>]
3/4: running [==================================================>]
4/4: running [==================================================>]
verify: Service converged
使用update命令也是等价的:docker service update --replicas 3 my_nginx
;
下线一个节点,使之不参与任务分派;
[root@localhost ~]# docker node update --availability drain hostname-102
hostname-102
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
upral6mrlz1928ssrqrehjnr8 * hostname-100 Ready Active Leader 20.10.21
so1xdgl2iudz0gobsnh60cgca hostname-101 Ready Active 20.10.21
i91jji6pecz0pic225aogilh7 hostname-102 Ready Drain 20.10.21
值得一提的是,如果某个节点被设置下线,或者因为其它故障宕机了,那么它其上的容器会被转移到其它可运行的节点上,如此来保证始终有指定副本数量的容器在运行。
上线一个下线中的节点,使之参与任务分派;
[root@localhost ~]# docker node update --availability active hostname-102
hostname-102
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
upral6mrlz1928ssrqrehjnr8 * hostname-100 Ready Active Leader 20.10.21
so1xdgl2iudz0gobsnh60cgca hostname-101 Ready Active 20.10.21
i91jji6pecz0pic225aogilh7 hostname-102 Ready Active 20.10.21
移除一个任务,使得集群中所有该任务的容器都删除;
[root@localhost ~]# docker service rm my_nginx
my_nginx
[root@localhost ~]# docker service ps my_nginx
no such service: my_nginx
加入一个现有的swarm集群
[root@localhost ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4jg8as3v4whcy9gtabon078ooyiu1fuytuelyb2ipqbcuxa7jk-d6c6v0fonjuh07qg88h0dzn33 192.168.160.100:2377
[root@localhost ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4jg8as3v4whcy9gtabon078ooyiu1fuytuelyb2ipqbcuxa7jk-55dc9derg80k6ovt0jx2kju28 192.168.160.100:2377
节点离开集群;
[root@localhost ~]# docker swarm leave
Node left the swarm.
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
upral6mrlz1928ssrqrehjnr8 * hostname-100 Ready Active Leader 20.10.21
so1xdgl2iudz0gobsnh60cgca hostname-101 Down Active 20.10.21
i91jji6pecz0pic225aogilh7 hostname-102 Ready Active 20.10.21
删除swarm集群;
[root@localhost ~]# docker swarm leave -f
Node left the swarm.
当最后一个manager节点离开,则swarm集群自动删除。