Swarm
分布式系统中多容器管理的困难
生产环境中同一种类型的容器往往散落在各个主机节点上,因此无法回避下列问题:
- 怎么去管理这么多容器?
- 怎么能方便的横向扩展?
- 如果容器 down 了,怎么能自动恢复?
- 如何去更新容器而不影响业务?
- 如何去监控追踪这些容器?
- 怎么去调度容器的创建?
- 保护隐私数据?
Docker Swarm Mode Architecture
综上所述,容器编排应运而生,docker 的容器编排工具的实现有很多,只不过 swarm 是内置于 docker 的容器编排工具,由 docker 公司内置到 docker 中。
Service & Replicas
- 在 docker swarm 模式下 Service 的概念和 Docker Compose 中的概念基本一致。
- 在 Replicas 横向扩展模式下,每个 Replicas 都是一个实际的容器,每个容器都会根据调度系统的计算,被分配在不同的 node 上运行。也就是说,通过 Swarm Manager 部署去部署一个 Service 时候,其实是不知道容器最终会运行在哪些 swarm 节点上的,这取决于 Swarm 的调度算法的计算结果(例如:根据节点负载)。
搭建 3 节点的 swam cluster
1# 初始化一个swarm集群,在Swarm Manager中: 192.168.31.220
2[root@localhost ~]# docker swarm init --advertise-addr=192.168.31.220
3Swarm initialized: current node (wx8spu6s1tszpo4hbvkc5v1qt) is now a manager.
4To add a worker to this swarm, run the following command:
5
6 docker swarm join --token SWMTKN-1-5mxs3nwkgidt55i7erq1d663xvj94lanh2xdep76b4q7xxg15w-cdgbba27hiqeb0b6buzzv6whq 192.168.31.220:2377
7
8To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
9
10# swarm node1 加入 cluster: 192.168.31.240
11[root@centos7_two ~]# docker swarm join --token SWMTKN-1-5mxs3nwkgidt55i7erq1d663xvj94lanh2xdep76b4q7xxg15w-cdgbba27hiqeb0b6buzzv6whq 192.168.31.220:2377
12This node joined a swarm as a worker.
13
14# swarm node2 加入 cluster: 192.168.31.250
15[root@centos7_three ~]# docker swarm join --token SWMTKN-1-5mxs3nwkgidt55i7erq1d663xvj94lanh2xdep76b4q7xxg15w-cdgbba27hiqeb0b6buzzv6whq 192.168.31.220:2377
16This node joined a swarm as a worker.
17
18# 在Swarm Manager中 查看Swam Cluster信息
19[root@localhost ~]# docker node list
20ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
21p4jexd5om3yofpgz3n4vyq2yt centos7_three Ready Active 18.09.7
22ms9s0pquan1hvue2ubaxn2evl centos7_two Ready Active 18.09.7
23wx8spu6s1tszpo4hbvkc5v1qt * localhost.localdomain Ready Active Leader 18.09.7
24
Service 的创建维护和水平扩展
默认创建一个 Service 可能会运行在 Cluster 中的任意一个节点上。
1# 创建一个service:create相当于run
2[root@localhost ~]# docker service create --name demo busybox sh -c "while true;do sleep 3600;done"
3jvomccrnms8cz14jbcthwg6ey
4overall progress: 1 out of 1 tasks
51/1: running [==================================================>]
6verify: Service converged
7
8# 查看service:也就是container的位置 relicated 1/1 代表此容器水平扩展的数量
9[root@localhost ~]# docker service ls
10ID NAME MODE REPLICAS IMAGE PORTS
11jvomccrnms8c demo replicated 1/1 busybox:latest
12# 查看service(container)具体运行的位置:centos7_three
13[root@localhost ~]# docker service ps demo
14ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
15sfy5hefhksyw demo.1 busybox:latest centos7_three Running Running 2 minutes ago
16
17# 在 centos7_three 节点中查看
18[root@centos7_three ~]# docker ps
19CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20112843852d0c busybox:latest "sh -c 'while true;d…" 9 minutes ago Up 9 minutes demo.1.sfy5hefhksywi36rhst1zq06w
21
22# 对指定service做水平扩展: 自带恢复能力,如果其中有一个replicated故障,会自动在Cluster中新增加一个replicated节点。 让分子和分母一直可以确保相等。 5ready/5num
23[root@localhost lb-scale]# docker service scale demo=5
24demo scaled to 5
25overall progress: 5 out of 5 tasks
261/5: running [==================================================>]
272/5: running [==================================================>]
283/5: running [==================================================>]
294/5: running [==================================================>]
305/5: running [==================================================>]
31verify: Service converged
32
33
34# 查看service replicated 5/5 已经ready的数量/要扩展的数量
35[root@localhost lb-scale]# docker service ls
36ID NAME MODE REPLICAS IMAGE PORTS
37jvomccrnms8c demo replicated 5/5 busybox:latest
38# 查看指定的容器
39[root@localhost lb-scale]# docker service ls
40
41ID NAME MODE REPLICAS IMAGE PORTS
42
43jvomccrnms8c demo replicated 5/5 busybox:latest
44
45[root@localhost lb-scale]# docker service ps demo
46ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
47sfy5hefhksyw demo.1 busybox:latest centos7_three Running Running 15 minutes ago
48mh1ero6kazrw demo.2 busybox:latest centos7_three Running Running 2 minutes ago
49jpynv8ne89xc demo.3 busybox:latest centos7_two Running Running 2 minutes ago
50w705h9lauvrv demo.4 busybox:latest localhost.localdomain Running Running 2 minutes ago
51mf9y8mg15we5 demo.5 busybox:latest localhost.localdomain Running Running 2 minutes ago
52
53# 删除指定的Service(后台需要一系列复杂的操作,稍有延迟性)
54[root@localhost lb-scale]# docker service rm demo
55demo
56
57# 离开ji'qu
58docker swarm leave --force
59
60
Swarm 部署 wordpress
1# 创建overlay网络:用于不同节点上的容器通信
2[root@localhost ~]# docker network create -d overlay demo
32xaj5rg3s1ng1fj3xhju365tq
4[root@localhost ~]# docker network ls | grep demo
52xaj5rg3s1ng demo overlay swarm
6
7# 创建mysql 服务
8[root@localhost ~]# docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpress --network demo --mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql
9[root@localhost ~]# docker service ls
10ID NAME MODE REPLICAS IMAGE PORTS
11w5bgs2khjfdc mysql replicated 1/1 mysql:latest
12[root@localhost ~]# docker service ps mysql
13ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
14ifhi4fb7g0wj mysql.1 mysql:latest localhost.localdomain Running Running 40 seconds ago
15[root@localhost ~]# docker ps
16CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1732a3ea0323d4 mysql:latest "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp mysql.1.ifhi4fb7g0wjgensmtfnj0u4l
18
19
20# 创建wordpress 服务
21[root@localhost ~]# docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql --network demo wordpress
22
23# 访问 centos7_three http://192.168.31.250 发现可以与mysql通信
24[root@localhost ~]# docker service ps wordpress
25ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
26bblw244vhc28 wordpress.1 wordpress:latest centos7_three Running Running 10 minutes ago
27