Docker Swarm介绍
1 什么是swarm
Swarm是Docker公司推出的docker集群管理平台,它将一群Docker主机变成了一台单一的虚拟Docker主机。
Swarm使用标准的Docker API接口,因此,任何支持Docker API的工具都能使用Swarm,包括Docker Compose、Docker Machine、Jenkins等等。
Docker 1.12版本之后,Swarm已经包含在Docker引擎中了,不需要再手动安装Swarm相关的组件了。
Swarm遵循可插拔原则(swap, plug, and play),它的后台引擎是可替换的,在大规模生产环境中,可以将Swarm后端替换成更强大的后端(比如Mesos)。
2 swarm中的几个概念
(1)Node
Swarm节点,是运行Docker引擎的一个实例,通常是一台物理服务器或者是云服务器。节点有两类:
worker node:工作节点,接收和执行任务,运行具体的服务。
manager node:管理节点,用于执行集群命令,调度任务等等。默认情况下管理节点同时也具有工作节点的功能,可以接收和执行任务。
(2)Service
集群中具体要运行的容器。
(3)Task
集群中要执行的命令。
3 Swarm常用命令
(1)集群和节点操作
使用以下3台服务器演示swarm命令:
ecs-dev-07
ecs-dev-08
ecs-dev-09
[root@ecs-dev-07 ~]# docker swarm init Swarm initialized: current node (w45oeu9569u5vcp0f2i0z26xc) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3qhvwlzbh084t0xygh7semasver547auakxdo5xzdwp5mt91vk-10eep4z6ic54ws8zc7r6aqmhp 172.19.141.21:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. # 将从节点加入集群 docker swarm join --token SWMTKN-1-2v0mg19ouxu6svqdc1ufbwgz7tfrd9f0uhwqeriogygdcovowx-4d558q9qb51429j27at6teq2j 172.19.141.21:2377 # 如果希望从节点作为manager角色加入集群,则主节点上运行以下命令,重新创建token [root@ecs-dev-07 ~]# docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-3qhvwlzbh084t0xygh7semasver547auakxdo5xzdwp5mt91vk-2zhuddonlxe1m0d4agpqzopyw 172.19.141.21:2377 # 查看集群信息 [root@ecs-dev-07 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION w45oeu9569u5vcp0f2i0z26xc * ecs-dev-07 Ready Active Leader 19.03.5 x6io92f7wb9sb9ivq0hrr0xja ecs-dev-08 Ready Active Reachable 19.03.4 vsf9pkvxai5m3184evskl2dsc ecs-dev-09 Ready Active Reachable 19.03.5 # 将leader节点停掉,可以看到原来的leader节点状态变成了Unreachable,另外一台主机的角色变成了Leader [root@ecs-dev-08 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION w45oeu9569u5vcp0f2i0z26xc ecs-dev-07 Unknown Active Unreachable 19.03.5 x6io92f7wb9sb9ivq0hrr0xja * ecs-dev-08 Unknown Active Leader 19.03.4 vsf9pkvxai5m3184evskl2dsc ecs-dev-09 Unknown Active Reachable 19.03.5 # 将当前节点从集群中删除 docker swarm leave -f
(2)服务操作
# 创建一个具有2个实例的nginx集群 docker service create --name nginx --replicas 2 --network actinia nginx:1.15 # 查看所有的服务列表 [root@ecs-dev-08 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS nyyub2v4xt6s nginx replicated 2/2 nginx:1.15 # 查看nginx服务的具体运行情况 [root@ecs-dev-08 ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS rb4jd9t95hun nginx.1 nginx:1.15 ecs-dev-08 Running Running 45 seconds ago s5ljg8d2nf38 nginx.2 nginx:1.15 ecs-dev-07 Running Running 46 seconds ago # 将nginx实例数量变成3个 [root@ecs-dev-08 ~]# docker service scale nginx=3 nginx scaled to 3 overall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged # 再次查看nginx服务的运行情况,可以看到当前nginx服务数量已经变成了3个 [root@ecs-dev-08 ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS rb4jd9t95hun nginx.1 nginx:1.15 ecs-dev-08 Running Running 2 minutes ago s5ljg8d2nf38 nginx.2 nginx:1.15 ecs-dev-07 Running Running 2 minutes ago r6ptddryp0pq nginx.3 nginx:1.15 ecs-dev-09 Running Running 8 seconds ago # 还可以使用更强大的docker service update命令,对服务进行更多的修改,比如服务的镜像版本、重启策略、环境变量等等。 # 例如,修改服务的镜像版本 docker service update --image nginx:1.14 nginx # 再次查看服务运行情况 # 可以看到1.15版本的nginx服务已经停掉,当前运行的是1.14版本的nginx服务 [root@ecs-dev-08 ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xcrxhdhuuajo nginx.1 nginx:1.14 ecs-dev-09 Running Running about a minute ago rb4jd9t95hun \_ nginx.1 nginx:1.15 ecs-dev-08 Shutdown Shutdown 5 minutes ago afec10q894s9 nginx.2 nginx:1.14 ecs-dev-07 Running Running 56 seconds ago s5ljg8d2nf38 \_ nginx.2 nginx:1.15 ecs-dev-07 Shutdown Shutdown about a minute ago
(3)网络操作
Docker Swarm使用overlay类型的网络。在同一个overlay网络中的容器,即使是在不同的宿主机上,互相之间也能通讯。不同的overlay网络内的容器是相互隔离的。
overlay网络为每一个服务提供了一个虚拟IP(VIP)和一个域名,同一个网络中的容器可以互相通过虚拟IP和域名进行访问。
# 创建网络 [root@ecs-dev-07 ~]# docker network create --subnet 172.30.0.0/16 --gateway 172.30.0.1 --driver overlay --attachable actinia # 查看网络 [root@ecs-dev-07 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE giepr8kjiq1z actinia overlay swarm 8c85d1fdd11c bridge bridge local 90e4ef8ecdf3 docker_gwbridge bridge local e945204eb642 host host local ho2oi9uyks7h ingress overlay swarm 3c325566a9c8 none null local