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

- 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
网友评论