10-docker swarm集群

本文介绍了Swarm集群,它将多个Docker Engine聚集,对外提供容器集群服务。阐述了其特点,如以Docker API接口呈现、易上手、轻量等,还介绍了相关概念和docker swarm命令。详细说明了集群实现过程,包括准备工作和创建步骤,最后测试了主机宕机时容器的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 关于swarm

1)集群概念

Swarm这个项目名称特别贴切。在Wiki的解释中,Swarm behavior是指动物的群集行为。比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavior
在这里插入图片描述
Swarm项目正是这样,通过把多个Docker Engine聚集在一起,形成一个大的docker-engine,对外提供容器的集群服务。同时这个集群对外提供Swarm API,用户可以像使用Docker Engine一样使用Docker集群

2)swarm集群的特点

  • 对外以Docker API接口呈现,这样带来的好处是,如果现有系统使用Docker Engine,则可以平滑将Docker Engine切到Swarm上,无需改动现有系统。
  • Swarm对用户来说,之前使用Docker的经验可以继承过来。非常容易上手,学习成本和二次开发成本都比较低。同时Swarm本身专注于Docker集群管理,非常轻量,占用资源也非常少。 *“Batteries included but swappable”,简单说,就是插件化机制,Swarm中的各个模块都抽象出了API,可以根据自己一些特点进行定制实现。
  • Swarm自身对Docker命令参数支持的比较完善,Swarm目前与Docker是同步发布的。Docker的新功能,都会第一时间在Swarm中体现。

Swarm是一套较为简单的工具,用以管理Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in go, docker_py, docker等)均可以直接与Swarm通信,Swarm几乎全部用Go语言来完成开发

3)swarm集群的相关概念

  • swarm:集群的管理和编排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化时启动 swarm 模式或者加入已存在的 swarm
  • node: 一个节点(node)是已加入到 swarm 的 Docker 引擎的实例 当部署应用到集群,你将会提交服务定义到管理节点,接着 Manager管理节点调度任务到 worker 节点,manager 节点还执行维护集群的状态的编排和群集管理功能,worker 节点接收并执行来自manager 节点的任务。通常,manager 节点也可以是 worker 节点,worker 节点会报告当前状态给 manager 节点
  • service: 服务是要在 worker 节点上要执行任务的定义,它在worker节点上执行,当你创建服务的时,你需要指定容器镜像
  • task: 任务是在 docekr 容器中执行的命令,Manager 节点根据指定数量的任务副本分配任务给 worker 节点

4)docker swarm命令

  • docker swarm:集群管理,子命令有 init, join, leave, update。(docker swarm –help 查看帮助)
  • docker service:服务创建,子命令有 create, inspect, update, remove, tasks。(docker service–help 查看帮助)
  • docker node:节点管理,子命令有 accept, promote, demote, inspect, update, tasks, ls, rm。(docker node –help 查看帮助)

2. swarm集群的实现过程

1)集群准备工作

实验准备

三台已经安装docker的主机

host1 192.168.20.111
host2 192.168.20.112
host3 192.168.20.113
修改host文件
三台都修改
vim /etc/hosts
192.168.20.111 swarm01
192.168.20.112 swarm02
192.168.20.113 swarm03
关闭防火墙
三台都操作
 systemctl stop firewalld
 systemctl disable firewalld

调整selinux状态

三台都操作
vim /etc/selinux/config
  SELINUX=disabled
修改docker监听端口

Swarm是通过监听2375端口进行通信的,所以在使用Swarm进行集群管理之前,需要设置一下2375端口的监听。所有主机节点docker开启2375监听

三台都操作
vim /usr/lib/systemd/system/docker.service 
  ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
ExecStart这一行改成如上的样子

systemctl daemon-reload
systemctl restart docker
重启虚拟机
reboot

2)集群创建

swarm镜像下载

三台都执行
[root@swarm01 ~]# systemctl start docker
[root@swarm01 ~]# docker pull swarm
Using default tag: latest
latest: Pulling from library/swarm
d85c18077b82: Pull complete 
1e6bb16f8cb1: Pull complete 
85bac13497d7: Pull complete 
Digest: sha256:21ba7705cd79ead9495d5bea3b14a98e70b1e8ec97c35b095e6f8562a3f547ff
Status: Downloaded newer image for swarm:latest
[root@swarm01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              49f7960eb7e4        12 months ago       200MB
swarm               latest              ff454b4a0e84        12 months ago       12.7MB

初始化swarm(在swarm01上初始化,默认01就是主)

[root@swarm01 ~]# docker swarm init --advertise-addr 192.168.20.111
Swarm initialized: current node (e77sjyk08w0xu5m4mzy3xicvn) is now a manager.

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

    docker swarm join \
    --token SWMTKN-1-47d0p9cg2nxzl94m1coy2jpgdarrfne03zrkcglek1iiw0c4ba-dcchaf3pnvkiyvyf7f03oj704 \
    192.168.20.111:2377

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

上边说了,如果想要加入这个节点所在集群,可以执行上述命令,如果想以管理节点身份加入,可以执行
docker swarm join-token manager,然后会提示命令,复制粘贴即可

02和03加入集群

   docker swarm join \
    --token SWMTKN-1-47d0p9cg2nxzl94m1coy2jpgdarrfne03zrkcglek1iiw0c4ba-dcchaf3pnvkiyvyf7f03oj704 \
    192.168.20.111:2377

swarm01查看集群节点

[root@swarm01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
a70qjvr9cgt04g1shge0hd8st     swarm03             Ready               Active              
e77sjyk08w0xu5m4mzy3xicvn *   swarm01             Ready               Active              Leader
odwl7akqixlumw42m0vfe89ni     swarm02             Ready               Active       

如果想让某个节点上线或者下线,也可以操作(管理节点上敲)
[root@swarm01 ~]# docker node update --availability drain swarm03
swarm03
[root@swarm01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
a70qjvr9cgt04g1shge0hd8st     swarm03             Ready               Drain               
e77sjyk08w0xu5m4mzy3xicvn *   swarm01             Ready               Active              Leader
odwl7akqixlumw42m0vfe89ni     swarm02             Ready               Active              
[root@swarm01 ~]# docker node update --availability active swarm03
swarm03
[root@swarm01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
a70qjvr9cgt04g1shge0hd8st     swarm03             Ready               Active              
e77sjyk08w0xu5m4mzy3xicvn *   swarm01             Ready               Active              Leader
odwl7akqixlumw42m0vfe89ni     swarm02             Ready               Active              
       
如果想离开集群: docker swarm leave -f
如果想把某个节点提升为manager: docker node  promote swarm02

到这里,集群初步搭建完成,接下来来进行集群的应用

查看网络模式

[root@swarm01 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
51855774c4c8        bridge              bridge              local
314fee32e64e        docker_gwbridge     bridge              local
1bf48cef4eca        host                host                local
lfnnu7swvljb        ingress             overlay             swarm
ad48f481958e        none                null                local
可以看出,创建集群后,自动创建了overlay网络用于swarm集群通信

下载集群可视化的镜像并运行容器

在swarm01上操作
docker search visualizer
docker pull dockersamples/visualizer
docker images  下载完之后查看,发现三台主机都有visualizer这个镜像,id都相同

docker run -itd -p 8888:8080 -e HOST=192.168.20.111 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
容器运行起来之后,可以去浏览器访问swarm01的8888端口,查看集群的图形化界面,如下

在这里插入图片描述
下面,我们在swarm01上用swarm创建集群用的容器

  192  docker service create  -d --replicas 1 --name web01 -p 8000:80 httpd
  194  docker service create  -d --replicas 3 --name web02 -p 8000:80 httpd

--replicas表示容器的个数
效果图如下 如果容器的小圆点是红色的,不要着急,等一等就好了
另外,刚开始的时候,由于容器还不太稳定,所以在主机上docker ps的时候可能看不到
刚创建的容器,等一等就好了

在这里插入图片描述
过一会再看,已经好了,如下图
在这里插入图片描述
如果觉得容器不想要了,可以去每个主机上进行删除

原则上来说,如果集群有n个节点,–replicas的数量不能大于n,也可以使用mode创建与n相等数量的容器,如下操作:

[root@swarm01 ~]# docker service create -d --mode global --name web04 -p 8005:80 httpd
67tx5tyw2fz7948mtoh1rtpkk

在这里插入图片描述

而且这些容器都是可以访问的,以web04为例,结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以看到,在每个主机上,都有很多容器运行,这个时候有一个疑问:如果主机2宕机,那么它上边的容器是否会消失,下边我们停掉主机2的docker,来看一下结果
在这里插入图片描述
由上图,可以看出,如果是replicas的形式创建的,会被转移到其他主机,如果是mode的方式创建的,则不会被转移,我们现在把主机2的docker再次启动起来,看一下变化

在这里插入图片描述

可以看到mode方式创建的容器再次恢复,而通过replicas方式创建的容器转移走了之后就没有再回来

如果相对swarm集群的某个容器进行操作,如下操作即可

[root@swarm03 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
941289bf717c        httpd:latest        "httpd-foreground"   4 minutes ago       Up 4 minutes        80/tcp              web01.1.y73yw98ddlqderpsc5hqpfcfu
83e5e449b59b        httpd:latest        "httpd-foreground"   9 minutes ago       Up 9 minutes        80/tcp              web04.a70qjvr9cgt04g1shge0hd8st.aat085ibidjo80h6xcqcbyma3
ef5e02f94caf        httpd:latest        "httpd-foreground"   21 minutes ago      Up 21 minutes       80/tcp              web02.3.bfzcvu69u4kj0h11ktnlmoxx3
[root@swarm03 ~]# docker exec -it web01.1.y73yw98ddlqderpsc5hqpfcfu /bin/bash
root@941289bf717c:/usr/local/apache2# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs	modules
root@941289bf717c:/usr/local/apache2# 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值