Swarm是Docker内置的一款集群管理工具,其作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,功能也较kubernetes更少一些。
Swarm的优点和缺点都是使用标准的Docker接口,使用简单,容易集成到现有系统,但是更困难支持更复杂的调度,比如以定制接口方式定义的调度。
Kubernetes 是自成体系的管理工具,有自己的服务发现和复制,需要对现有应用的重新设计,但是能支持失败冗余和扩展系统。
稳定性方面,Kubenetes 更稳定。
一、创建集群
swarm集群内节点分为三种角色:领导者(Leader),被选举者(Reachable),工作节点(Worker)。领导者和被选举者其实都是manager,swarm集群中至少得有2个可用的被选举节点才能选举主节点出来,否则集群将无法执行操作。
创建管理节点:
[root@Python ~]# docker swarm init --advertise-addr 192.168.3.24
Swarm initialized: current node (bs9ozmncagtsvmqzcb74o4l95) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-40rwtcdq31zm2jp14hynt4rlwzleh6n5ewll7mylo1nfvxy7ft-02vm2piktpm05qul0cvdvo10e 192.168.3.24:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
查看token令牌:
[root@Python ~]# docker swarm join-token worker
# 查看加入工作节点token令牌
[root@Python ~]# docker swarm join-token manager
# 查看加入管理节点token令牌
创建工作节点dockerone:
[root@dockerone ~]# docker swarm join --token SWMTKN-1-40rwtcdq31zm2jp14hynt4rlwzleh6n5ewll7mylo1nfvxy7ft-02vm2piktpm05qul0cvdvo10e 192.168.3.24:2377
This node joined a swarm as a worker.
创建工作节点dockertwo:
[root@dockertwo ~]# docker swarm join --token SWMTKN-1-40rwtcdq31zm2jp14hynt4rlwzleh6n5ewll7mylo1nfvxy7ft-02vm2piktpm05qul0cvdvo10e 192.168.3.24:2377
This node joined a swarm as a worker.
在管理节点上查看swarm集群:
[root@Python ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
bs9ozmncagtsvmqzcb74o4l95 * Python Ready Active Leader 18.09.3
1biq9wn6tsgllzdxxgbfq1e5o dockerone Ready Active 18.09.3
momahk8groojvrpucbdtemh3d dockertwo Ready Active 18.09.3
查看端口情况:(2375 是 docker 守护进程的端口,2377 是 swarm mode 集群管理的端口,7946 是各集群节点之间通信的端口。)
[root@Python ~]# netstat -tnlp|grep docker
tcp6 0 0 :::2375 :::* LISTEN 16561/dockerd
tcp6 0 0 :::2377 :::* LISTEN 16561/dockerd
tcp6 0 0 :::7946 :::* LISTEN 16561/dockerd
查看集群网络情况:(初始化集群后,默认会创建一个 overlay 的网络 ingress,还会创建一个桥接的网络docker_gwbridge,overlay 可网络用于节点间通信)
[root@Python ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ca24e1342650 bridge bridge local
a0581eea0bfb docker_gwbridge bridge local
7d4bbf8a2ab7 host host local
e1o93ah6zjgc ingress overlay swarm
dc4e5634b90c none null local
二、管理集群节点
1、升降级节点角色
[root@Python ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
bs9ozmncagtsvmqzcb74o4l95 * Python Ready Active Leader 18.09.3
1biq9wn6tsgllzdxxgbfq1e5o dockerone Ready Active 18.09.3
momahk8groojvrpucbdtemh3d dockertwo Ready Active 18.09.3
[root@Python ~]# docker node promote dockerone
Node dockerone promoted to a manager in the swarm.
[root@Python ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
bs9ozmncagtsvmqzcb74o4l95 * Python Ready Active Leader 18.09.3
1biq9wn6tsgllzdxxgbfq1e5o dockerone Ready Active Reachable 18.09.3
momahk8groojvrpucbdtemh3d dockertwo Ready Active 18.09.3
[root@Python ~]# docker node demote Python
[root@dockerone ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
bs9ozmncagtsvmqzcb74o4l95 Python Ready Active 18.09.3
1biq9wn6tsgllzdxxgbfq1e5o * dockerone Ready Active Leader 18.09.3
momahk8groojvrpucbdtemh3d dockertwo Ready Active 18.09.3
注:升降级节点角色只能在管理节点上运行,应先升级工作节点为被选举者,再降级领导者为工作节点,然后被选举者成为领导者完成替换;
2、让节点退出swarm集群
[root@Python ~]# docker swarm leave
Node left the swarm.
注:docker swarm leave 命令可在所有节点上运行,值得注意的是,工作节点退出swarm集群后,在管理节点上依然保存着工作节点的节点信息,状态为down,要删除节点信息,可使用docker node rm 命令,当所有的节点都退出并且被删除时,在管理节点上使用docker swarm leave,然后退出整个集群;
3、删除节点信息
[root@dockerone ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
bs9ozmncagtsvmqzcb74o4l95 Python Down Active 18.09.3
vdb2v23wl7rtyepc0xu9foupj Python Ready Active Reachable 18.09.3
1biq9wn6tsgllzdxxgbfq1e5o * dockerone Ready Active Leader 18.09.3
momahk8groojvrpucbdtemh3d dockertwo Ready Active 18.09.3
[root@dockerone ~]# docker node rm bs9ozmncagtsvmqzcb74o4l95
bs9ozmncagtsvmqzcb74o4l95
三、管理集群服务
1、创建服务
[root@Python ~]# docker service create --replicas 3 -p 80:80 --name My_nginx nginx
vebv2hw2kqd8z3ln1jbzmtbsi
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
--replicas 3 表示在集群中创建三个服务
2、查看集群服务列表
[root@dockerone ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
7i3hnasnka53 My_nginx replicated 3/3 nginx:latest *:80->80/tcp
3、查看某个集群服务详情
[root@dockerone ~]# docker service ps My_nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
mv0zgbylbhu0 My_nginx.1 nginx:latest Python Running Running about a minute ago
ynntkki4r0e0 My_nginx.2 nginx:latest dockerone Running Running about a minute ago
es5b9p1uwwl6 My_nginx.3 nginx:latest dockertwo Running Running about a minute ago
4、查看某个服务日志
[root@dockerone ~]# docker service logs My_nginx
5、删除服务
[root@dockerone ~]# docker service rm My_nginx
My_nginx
四、使用docker-compose文件部署集群服务
1、docker-compose.yml 文件准备
[root@Python syz]# cat syztoo.yml
version: "3"
services:
wordpress:
image: wordpress
ports:
- 80:80
networks:
- overlay
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
deploy:
mode: replicated
replicas: 3
db:
image: mysql
networks:
- overlay
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
deploy:
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
volumes:
db-data:
networks:
overlay:
2、部署服务
[root@Python syz]# docker stack deploy -c syztoo.yml wordpress
Creating network wordpress_overlay
Creating network wordpress_default
Creating service wordpress_visualizer
Creating service wordpress_wordpress
Creating service wordpress_db
3、查看服务
[root@Python syz]# docker stack ls
NAME SERVICES ORCHESTRATOR
wordpress 3 Swarm
4、移除服务
[root@Python syz]# docker stack down wordpress
Removing service wordpress_db
Removing service wordpress_visualizer
Removing service wordpress_wordpress
Removing network wordpress_overlay
Removing network wordpress_default