目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

Swarm

分布式系统中多容器管理的困难


生产环境中同一种类型的容器往往散落在各个主机节点上,因此无法回避下列问题:
Swarm

  • 怎么去管理这么多容器?
  • 怎么能方便的横向扩展?
  • 如果容器 down 了,怎么能自动恢复?
  • 如何去更新容器而不影响业务?
  • 如何去监控追踪这些容器?
  • 怎么去调度容器的创建?
  • 保护隐私数据?

Docker Swarm Mode Architecture

Swarm Architecture
 综上所述,容器编排应运而生,docker 的容器编排工具的实现有很多,只不过 swarm 是内置于 docker 的容器编排工具,由 docker 公司内置到 docker 中。

Service & Replicas

Service & Replicas

  • 在 docker swarm 模式下 Service 的概念和 Docker Compose 中的概念基本一致。
  • 在 Replicas 横向扩展模式下,每个 Replicas 都是一个实际的容器,每个容器都会根据调度系统的计算,被分配在不同的 node 上运行。也就是说,通过 Swarm Manager 部署去部署一个 Service 时候,其实是不知道容器最终会运行在哪些 swarm 节点上的,这取决于 Swarm 的调度算法的计算结果(例如:根据节点负载)。
    服务的创建与调度

搭建 3 节点的 swam cluster

Swarm 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

作者:Soulboy