Docker Swarm

Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker Container抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。

swarm是安装docker时自带的一个工具,安装了docker就有了swarm这个工具。

Docker Swarm模式架构 :

image.png
  • Manager:是管理节点,管理cluster的状态。通过Manager节点去部署service;
  • Worker:是工作节点,manager在横向扩展service数量时,会将service平均分配至每个Worker节点上面。Worker节点不具备管理功能。

一、创建一个三节点的swarm集群

先启动docker,再初始化swarm manager管理节点

1.1 在swarm manager节点操作

docker swarm init --advertise-addr=10.0.1.102

# 先启动docker
[root@openstack-load1 ~]# systemctl start docker

# 初始化swarm manager管理节点
[root@openstack-load1 ~]# docker swarm init --advertise-addr=10.0.1.102
Swarm initialized: current node (szh5ayn7ai92j12ln9ijv6wek) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4jgq2bgxbh1fcer272z9tn3kvljhxigwtmmwghhyeo3ilyh0zf-8jr94m003pl7vcmjxezw3i7z1 10.0.1.102:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

根据上述输出结果提示,执行docker swarm join ......命令。

1.2 分别在两台swarm worker节点操作

ocker swarm join --token SWMTKN-1-4jgq2bgxbh1fcer272z9tn3kvljhxigwtmmwghhyeo3ilyh0zf-8jr94m003pl7vcmjxezw3i7z1 10.0.1.102:2377

# 开启docker
[root@openstack-compute1 ~]# systemctl start docker

# 加入swarm worker节点
[root@openstack-compute1 ~]# docker swarm join --token SWMTKN-1-4jgq2bgxbh1fcer272z9tn3kvljhxigwtmmwghhyeo3ilyh0zf-8jr94m003pl7vcmjxezw3i7z1 10.0.1.102:2377
This node joined a swarm as a worker.

1.3 查看swarm集群中的节点

只能在swarm manager节点查看
列出所有的节点

docker node ls

[root@openstack-load1 ~]# docker node ls
ID                            HOSTNAME                      STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
i6owu3qb89lpirzjn6a1bc0td     openstack-compute1            Ready               Active                                  18.03.1-ce
8nyd5tmskr92kraaxnii37voe     openstack-compute2            Ready               Active                                  18.03.1-ce
szh5ayn7ai92j12ln9ijv6wek *   openstack-load1.example.com   Ready               Active              Leader              18.03.1-ce

可以看出有3个节点,两个worker节点,一个manager节点。manager节点的MANAGER STATUS被标识为Leader

二、service创建维护与水平扩展

  • service中包含一个或多个container(容器)。
  • 通过scale扩展service中的container数量,如
  • 如果其中某一个container如果意外停止,集群会自动创建一全新的container,让service中的是running状态的container数量始终保持scale扩展的时的数量。
  • 也可以通过scale减小service中container的数量。

2.1 创建一个service

docker service create --name demo busybox sh -c "while true;do sleep 3600;done"

[root@openstack-load1 ~]# docker service create --name demo busybox sh -c "while true;do sleep 3600;done"
9xa356sjez3q4uzys26izuseu
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

列出所有服务

docker service ls

[root@openstack-load1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
9xa356sjez3q        demo                replicated          1/1                 busybox:latest 

REPLICAS 1/1:分母1,表示名为demo的service中有1个container;分子1,表示名为demo 的service中有1个container是running状态。

列出名为demo的service中所有的container

docker service ps demo

[root@openstack-load1 ~]# docker service ps demo
ID                  NAME                IMAGE               NODE                          DESIRED STATE       CURRENT STATE            ERROR               PORTS
wq4mog4938a1        demo.1              busybox:latest      openstack-load1.example.com   Running             Running 29 seconds ago 

NODE:表示当前container处于swarm集群中哪个节点上。

2.2 水平扩展container

docker service scale demo=5

[root@openstack-load1 ~]# docker service scale demo=5
demo scaled to 5
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 

列出service docker service ls

[root@openstack-load1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
9xa356sjez3q        demo                replicated          5/5                 busybox:latest 

列出service中的container
docker service ps demo

[root@openstack-load1 ~]# docker service ps demo
ID                  NAME                IMAGE               NODE                          DESIRED STATE       CURRENT STATE                ERROR               PORTS
wq4mog4938a1        demo.1              busybox:latest      openstack-load1.example.com   Running             Running about a minute ago                       
gt7bb6hq8ioc        demo.2              busybox:latest      openstack-compute1            Running             Running 28 seconds ago                           
bx1oymev67hk        demo.3              busybox:latest      openstack-compute2            Running             Running 26 seconds ago                           
t4jskwwunwp8        demo.4              busybox:latest      openstack-compute2            Running             Running 26 seconds ago                           
icockwud7yil        demo.5              busybox:latest      openstack-load1.example.com   Running             Running 30 seconds ago 

这时你通过docker rm 容器ID删除service中的一个容器,

三、在swarm集群中通过serivce部署wordpress

3.1 创建一个overlay网络

因为不确定创建的容器运行在哪个节点主机上面,所以需要保证不同主机之间的容器能够通信,这就需要创建一个overlay的网络。

docker network create -d overlay demo

[root@openstack-load1 ~]# docker network create -d overlay demo
r954turzy3orqooe4de3edlef

3.2 创建mysql service

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:5.7

[root@openstack-load1 ~]# 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:5.7
dl1uuea76jto3h9be891y942h
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service converged

必须指定网络为第1步创建的名为demo的overlay网络。

3.3 创建wordpress service

[root@openstack-load1 ~]# docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql --network demo wordpress

必须指定网络为第1步创建的名为demo的overlay网络。

[root@openstack-load1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
dl1uuea76jto        mysql               replicated          1/1                 mysql:5.7           
a98a8p6dvh90        wordpress           replicated          1/1                 wordpress:latest    *:80->80/tcp

以上service部署完成后,会产生的现象:

  • swarm会自动将demo网络同步至container的节点主机上;


    image.png
  • 通过swarm集群中的任意节点IP,均可以访问wordpress站点。


    image.png

你可能感兴趣的:(Docker Swarm)