Docker Swarm
集群基本配置
安装三台docker基本环境
ip/主机名 | 角色 | 基础环境 |
---|---|---|
192.168.10.101/manager | 管理manager节点 | docker-ce |
192.168.10.102/worker01 | 工作worker节点 | docker-ce |
192.168.10.103/worker02 | 工作worker节点 | docker-ce |
如果生产环境防火墙开启则需要放行端口
如果开启防火墙三台均需要放行端口
Tcp 2377 (集群管理端口)
tcp/udp 7946 (容器网络发现端口)
udp 4789 (overlay网络通信端口)
基础环境搭建
免密码登陆
[root@manager ~]# ssh-keygen #测试环境一路回车
[root@manager ~]# ssh-copy-id 192.168.10.102
[root@manager ~]# ssh-copy-id 192.168.10.103
下载镜像
[root@manager ~]# vim a.sh
#!/bin/bash
echo "自行配置免密登陆"
hostnamectl set-hostname manager
ssh 192.168.10.102 "hostnamectl set-hostname worker01"
ssh 192.168.10.103 "hostnamectl set-hostname worker02"
cat >> /etc/hosts << EOF
192.168.10.101 manager
192.168.10.102 worker01
192.168.10.103 worker02
EOF
docker pull nginx:1.13.7-alpine
docker pull busybox
docker pull redis:3.0.6
docker pull redis:3.0.7
docker pull wordpress
docker pull mysql:5.7
docker pull docersamples/visualizer:stable
for i in 2 3
do
ssh 192.168.10.10$i "docker pull nginx:1.13.7-alpine"
ssh 192.168.10.10$i "docker pull busybox"
ssh 192.168.10.10$i "docker pull redis:3.0.6"
ssh 192.168.10.10$i "docker pull redis:3.0.7"
ssh 192.168.10.10$i "docker pull wordpress"
scp /etc/hosts root@192.168.10.10$i:/etc/hosts
done
[root@manager ~]# chmod +x a.sh
[root@manager ~]# ./a.sh
初始化集群(manager)
#设置当前节点为manager
[root@manager ~]# docker swarm init --advertise-addr 192.168.10.101
Swarm initialized: current node (rfomxue7gg0pfqkl7qgs3irem) is now a manager.
To add a worker to this swarm, run the following command:
#worker节点加入此集群的的令牌
#=======================================================================
docker swarm join --token SWMTKN-1-4zun5qrx4b258fw1oq4ypy17x5cp8ks21yrazvs5da7pv7i1f8-apg5g9h7wcqg0glxs1os2fcbi 192.168.10.101:2377
#======================================================================
#添加其他管理节点
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
如果日后需要扩充节点则可以使用
docker swarm join-token worker:查看加入woker的命令。
docker swarm join-token manager:查看加入manager的命令
增加工作节点@2@3
[root@worker01 ~]# docker swarm join --token SWMTKN-1-4zun5qrx4b258fw1oq4ypy17x5cp8ks21yrazvs5da7pv7i1f8-apg5g9h7wcqg0glxs1os2fcbi 192.168.10.101:2377
提示信息为加入集群成功,为worker节点
This node joined a swarm as a worker
[root@worker02 ~]# docker swarm join --token SWMTKN-1-4zun5qrx4b258fw1oq4ypy17x5cp8ks21yrazvs5da7pv7i1f8-apg5g9h7wcqg0glxs1os2fcbi 192.168.10.101:2377
提示信息为加入集群成功,为worker节点
This node joined a swarm as a worker
查看已加入集群的节点@1
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
wmiu8ci831hohcwhh15h2yekn * manager Ready Active Leader 19.03.5
p1akr0g4l2tlkf52tm8br413z worker01 Ready Active 19.03.5
q9axs9a1v1ml93ggew4aqswhd worker02 Ready Active 19.03.5
示例1:服务的负载均衡
[root@manager ~]# docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
rklexqg60z7wbw2flie4wa2mz
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
#=============================参数解释=================================
replicas 3 :服务模式:3个副本
-p 80:80:端口映射
--name nginx:service名称
nginx:1.13.7-alpine:运行使用镜像名
查看服务状态
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
rklexqg60z7w nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
查看服务的详细信息
[root@manager ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
nx9aabiykot8 nginx.1 nginx:1.13.7-alpine worker01 Running Running about a minute ago
n88a55h1ewlx nginx.2 nginx:1.13.7-alpine worker02 Running Running about a minute ago
tdwzybt8kkxz nginx.3 nginx:1.13.7-alpine manager Running Running about a minute ago
使用docker service logs来查看某个服务的日志
docker service logs -f nginx
nginx.2.r440yh0jb7uz@worker02 | 10.0.0.2 - - [20/Feb/2021:07:19:19 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
nginx.1.aqlir36jc8gj@worker01 | 10.0.0.2 - - [20/Feb/2021:07:19:20 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
nginx.3.wnl4slswl9mz@manager | 10.0.0.2 - - [20/Feb/2021:07:19:21 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
nginx.2.r440yh0jb7uz@worker02 | 10.0.0.2 - - [20/Feb/2021:07:19:21 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
nginx.1.aqlir36jc8gj@worker01 | 10.0.0.2 - - [20/Feb/2021:07:19:22 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
nginx.3.wnl4slswl9mz@manager | 10.0.0.2 - - [20/Feb/2021:07:19:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
验证负载均衡@2
curl 192.168.10.101
curl 192.168.10.101
curl 192.168.10.101
curl 192.168.10.101
#通过日志输入可以看出网站已经负载均衡了
使用docker service rm来从 Swarm 集群移除某个服务
[root@manager ~]#docker service rm nginx
nginx
示例2:服务的动态伸缩
manager启动一个服务
[root@manager ~]# docker service create --replicas 2 --name hello busybox ping baidu.com
syq9w1mm6k5d5glbt3a81k7ku
overall progress: 2 out of 2 tasks
1/2: running
2/2: running
verify: Service converged
启动完成完成后查看服务信息
[root@manager ~]# docker service ps hello
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
64s50n3pt6iq hello.1 busybox:latest manager Running Running about a minute ago
wsbz1jdgko73 hello.2 busybox:latest worker01 Running Running about a minute ago
#当前有两个节点工作
显示服务详细信息
docker service inspect --pretty hello
增加工作节点
[root@manager ~]# docker service scale hello=3
hello scaled to 3
#把当前服务名称为hello的服务调整为3个任务
#查看服务信息验证
[root@manager ~]# docker service ps hello
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
64s50n3pt6iq hello.1 busybox:latest manager Running Running 5 minutes ago
wsbz1jdgko73 hello.2 busybox:latest worker01 Running Running 5 minutes ago
lmqy8fu0uuoh hello.3 busybox:latest worker02 Running Running about a minute ago
减少工作节点
[root@manager ~]# docker service scale hello=2
#把当前服务名称为hello的服务调整为2个任务
#查看服务信息验证
[root@manager ~]# docker service ps hello
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
64s50n3pt6iq hello.1 busybox:latest manager Running Running 6 minutes ago
wsbz1jdgko73 hello.2 busybox:latest worker01 Running Running 6 minutes ago
lmqy8fu0uuoh hello.3 busybox:latest worker02 Remove Running 7 seconds ago
#可以看出器中有一台服务已经被删除
示例3:镜像的滚动更新
[root@manager ~]# docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
# 通过指定--update-delay 选项,表示容器进行更新的间隔时间,每次成功部署一个,延迟 10 秒钟,然后再更新下一 个服务。如果某个服务更新失败,则 Swarm 的调度器就会暂 停本次服务的部署更新。
进行更新
[root@manager ~]# docker service update --image redis:3.0.7 redis
#更新redis:3.0.6服务的镜像为redis:3.0.7镜像,更新时每更新成功一个则等待10秒在进行下一个更新
[root@manager ~]# docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qkvevew3uyvl redis.1 redis:3.0.7 manager Running Running 2 minutes ago
ti408jiev30y \_ redis.1 redis:3.0.6 manager Shutdown Shutdown 2 minutes ago
9sw83vzokw6f redis.2 redis:3.0.7 worker02 Running Running about a minute ago
f74frf477m27 \_ redis.2 redis:3.0.6 worker02 Shutdown Shutdown about a minute ago
rgf0mulilla6 redis.3 redis:3.0.7 worker01 Running Running about a minute ago
5yheirojr4re \_ redis.3 redis:3.0.6 worker01 Shutdown
#将 Redis 服务对应的 Image 版本由 3.0.6 更新为 3.0.7,
# 但是服务更新之前的 3.0.6 镜像版本的容器不会删除,只会停止。
示例4:一次搭建多个服务
正如之前使用docker-compose.yml来一次配置、启动多个容器,在Swarm集群中也可以使用compose文件(dockercompose.yml)来配置、启动多个服务。上一节中,我们使用docker service create一次只能部署一个服务,使用docker-compose.yml我们可以一次启动多个关联的服务。我们以在Swarm集群中部署WordPress为例进行说明:(docker-compose.yml)
创建docker-compose.yml文件
vim docker-compose.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]
#构建docker Swarm可视化节点,可以查看集群主机上运行了那些服务
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:
#参数解释:
deploy: #部署配置
mode: replicated #运行模式
replicas: 3 #运行3个副本
constraints: [node.role == manager]#约束此服务在manager上执行
在 Swarm 集群管理节点新建该文件,其中的 visualizer 服务提供一个可视化页面,我们可以从浏览器中很直观的查看集群中各个服务的运行节点。
在 Swarm 群集中可以使用 Overlay 网络来连接到一个或多个服务。
使用 docker-compose.yml 我们用docker stack命令,下面我们对该命令进行说明。
部署服务
部署服务使用docker stack deploy,其中-c参数指定compose 文件名。
[root@manager ~]# docker stack deploy -c docker-compose.yml wordpress
#查看服务
[root@manager ~]# docker stack ls
NAME SERVICES ORCHESTRATOR
wordpress 3 Swarm
访问测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dBAFRmX-1628841051470)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210220160516769.png)]
安装完成后进行登陆
登陆成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yHw0oPjD-1628841051473)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210220160624224.png)]
登陆8080端口查看
可以查看到各个节点所运行的服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WlT9I09t-1628841051475)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210220160708453.png)]
移除服务
要移除服务,使用docker stack down :
[root@manager ~]# docker stack down wordpress
Removing service wordpress_db
Removing service wordpress_visualizer
Removing service wordpress_wordpress
Removing network wordpress_overlay
Removing network wordpress_default
swarm 集群中节点状态说明
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
wmiu8ci831hohcwhh15h2yekn * manager Ready Active Leader 19.03.5
p1akr0g4l2tlkf52tm8br413z worker01 Ready Active 19.03.5
q9axs9a1v1ml93ggew4aqswhd worker02 Ready Active
#================================状态说明======================================
Active:群集中的节点可以正常的被分配任务
Pause:群集中的节点不接受新的任务,但是已经运行的任务,正常运行
Drain:群集中的节点不可以接受新的任务,当前运行的任务,停止并转移到其他可以接受任务的节点上
示例5:状态切换
[root@manager ~]# docker node update --availability drain manager
manager
#不可以接受新的任务,当前运行的任务,停止并转移到其他可以接受任务的节点上
[root@manager ~]# docker node ls | grep manager
wmiu8ci831hohcwhh15h2yekn * manager Ready Drain Leader 19.03.5
[root@manager ~]# docker service ps hello
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
nqizecoahmmk hello.1 busybox:latest worker02 Running Running about a minute ago
64s50n3pt6iq \_ hello.1 busybox:latest manager Shutdown Shutdown about a minute ago
wsbz1jdgko73 hello.2 busybox:latest worker01 Running Running 51 minutes ago
#可以查看到manager上的服务已经停止并且转移到worker02上了
[root@manager ~]# docker node update --availability active manager
manager
#切换为原有状态
示例6:节点提权降权操作
提升权限
[root@manager ~]# docker node promote worker01
#升级权限:worker升级为manager
Node worker01 promoted to a manager in the swarm.
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
wmiu8ci831hohcwhh15h2yekn * manager Ready Active Leader 19.03.5
p1akr0g4l2tlkf52tm8br413z worker01 Ready Active Reachable 19.03.5
q9axs9a1v1ml93ggew4aqswhd worker02 Ready Active 19.03.5
#当前worker01状态为 Reachable下一个Leader的候选人(Leader只能出现一个)
降低权限
[root@manager ~]# docker node demote manager
Manager manager demoted in the swarm.
[root@worker01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
wmiu8ci831hohcwhh15h2yekn manager Ready Active 19.03.5
p1akr0g4l2tlkf52tm8br413z * worker01 Ready Active Leader 19.03.5
q9axs9a1v1ml93ggew4aqswhd worker02 Ready Active 19.03.5
#此时查看worker01已经成为Leader
示例7:退出集群
如果 Manager 想要退出 Swarm 群集, 在 Manager Node
上执行如下命令:
[root@manager ~]# docker swarm leave
Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing the last manager erases all current state of the swarm. Use `--force` toignore this message.
#如果群集中还存在其它的 Worker Node,还希望 Manager退出群集,则加上一个强制选项
[root@manager ~]# docker swarm leave --force
示例7:退出集群
如果 Manager 想要退出 Swarm 群集, 在 Manager Node
上执行如下命令:
[root@manager ~]# docker swarm leave
Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing the last manager erases all current state of the swarm. Use `--force` toignore this message.
#如果群集中还存在其它的 Worker Node,还希望 Manager退出群集,则加上一个强制选项
[root@manager ~]# docker swarm leave --force