08 Docker Swarm

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
访问测试
image-20210220160358775 image-20210220160504142

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dBAFRmX-1628841051470)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210220160516769.png)]

安装完成后进行登陆

image-20210220160540895

登陆成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值