千家信息网

Docker swarm集群的安装配置

发表于:2025-02-11 作者:千家信息网编辑
千家信息网最后更新 2025年02月11日,一、Docker swarm简介Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swa
千家信息网最后更新 2025年02月11日Docker swarm集群的安装配置

一、Docker swarm简介

Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker

Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

Docker swarm中有三种角色:

  • Manager node:负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态,swarm可以有多个manager node,他们会自动协商选举出一个leader执行编排任务;但相反,不能没有manager node;
  • Worker node:接受并执行由manager node派发的任务,并且默认manager node也是一个work node,不过可以将它设置manager-only node,让它负责编排和管理工作;
  • Service:用来定义worker上执行的命令;

注意:在一个Docker Swarm群集中,每台docker服务器的角色可以都是manager,但是,不可以都是worker,也就是说,不可以群龙无首,并且,参与群集的所有主机名,千万不可以冲突。

二、环境准备

注意事项:

  • 保证时间同步;
  • 关闭防火墙与SElinux(实验环境);
  • 更改主机名;
  • 编写host文件,保证可以i进行域名解析;

三、初始化Swarm群集

[root@node01 ~]# tail -3 /etc/hosts       192.168.1.1 node01192.168.1.2 node02192.168.1.3 node03//三台主机都需配置hosts文件实现域名解析的效果[root@node01 ~]# docker swarm init --advertise-addr 192.168.1.1//--advertise-addr:指定与其他node通信的地址

命令的返回信息,如图:

图中①的命令:以worker身份加入swarm群集中的命令;
②的命令:以manager身份加入swarm群集中的方法;
出现上图表示初始化成功!注意:--token表示期限为24小时;

四、配置node02、node03加入、离开swarm群集

###################node02的操作如下###################[root@node02 ~]# docker swarm join --token SWMTKN-1-4pc1gjwjrp9h5dny52j58m0lclq88ngovis0w3rinjd05lklu5-ay18vjhwu7w8gsqvct84fv8ic 192.168.1.1:2377###################node03的操作如下###################[root@node03 ~]# docker swarm join --token SWMTKN-1-4pc1gjwjrp9h5dny52j58m0lclq88ngovis0w3rinjd05lklu5-ay18vjhwu7w8gsqvct84fv8ic 192.168.1.1:2377//node02、node03默认是以worker身份加入的###################node01的操作如下###################[root@node01 ~]# docker node ls           //查看节点详细信息(只能是manager身份才可查看)ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSIONmc3xn4az2r6set3al79nqss7x *   node01              Ready               Active              Leader              18.09.0olxd9qi9vs5dzes9iicl170ob     node02              Ready               Active                                  18.09.0i1uee68sxt2puzd5dx3qnm9ck     node03              Ready               Active                                  18.09.0//可以看出node01、node02、node03的状态为Active###################node02的操作如下###################[root@node02 ~]# docker swarm leave###################node03的操作如下###################[root@node03 ~]# docker swarm leave//node02、node03申请离开群集###################node01的操作如下###################[root@node01 ~]# docker node lsID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSIONmc3xn4az2r6set3al79nqss7x *   node01              Ready               Active              Leader              18.09.0olxd9qi9vs5dzes9iicl170ob     node02              Down                Active                                  18.09.0i1uee68sxt2puzd5dx3qnm9ck     node03              Down                Active                                  18.09.0///可以看到node02、node03的状态为Down[root@node01 ~]# docker node rm node02[root@node01 ~]# docker node rm node03//node01将node02、node03移除群集//如果worker节点没有辞职,manager节点可以使用"-f"表示强制开出worker节点

以上命令可以将某一个节点加入、删除群集。

[root@node01 ~]# docker swarm leave -f//manager节点退出swamr群集环境,这就表示swarm群集解散

不过加入时是使用worker身份的,如果想要让节点是以manager身份加入群集,需要使用以下命令:

[root@node01 ~]# docker swarm join-token manager //查询以manager身份加入群集的命令[root@node01 ~]# docker swarm join-token worker//查询以worker身份加入群集的命令

如图:

###################node02的操作如下###################[root@node02 ~]# docker swarm join --token SWMTKN-1-2c0gcpxihwklx466296l5jp6od31pshm04q990n3ssncby3h0c-78rnxee2e990axj0q7td74zod 192.168.1.1:2377###################node03的操作如下###################[root@node03 ~]# docker swarm join --token SWMTKN-1-2c0gcpxihwklx466296l5jp6od31pshm04q990n3ssncby3h0c-78rnxee2e990axj0q7td74zod 192.168.1.1:2377//node02、node03加入群集是以manager身份加入###################node01的操作如下###################[root@node01 ~]# docker node ls         //查看节点的详细信息ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSIONexr8uoww0eih53iujqz5cbv6q *   node01              Ready               Active              Leader              18.09.0r35f48huyw5hvnkuzatrftj1r     node02              Ready               Active              Reachable           18.09.0gsg1irl1bywgdsmfawi9rna7p     node03              Ready               Active              Reachable           18.09.0//从MANAGER STATUS这列就可看出

虽然加入群集时,可以指定使用manager、worker身份,但是也可以通过以下命令,进行降级、升级,操作如下:

[root@node01 ~]# docker node demote node02[root@node01 ~]# docker node demote node03//将node02、node03降级为worker[root@node01 ~]# docker node promote node02[root@node01 ~]# docker node promote node03//将node02、node03升级为manager//自行验证

五、部署图形化UI

部署图形化UI界面由node01来完成!

[root@node01 ~]# docker run -d -p 8080:8080 -e HOST=172.16.0.10 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer//-e HOST指定的是容器

使用浏览器访问:

浏览器可以正常访问,则表示图形化UI界面部署完成!

六、docker swarm群集的service服务配置

node01发布一个任务,(必须在manager角色的主机上)运行六个容器,命令如下:

[root@node01 ~]# docker service create --replicas 6  --name web -p 80:80 nginx// --replicas:副本数量;大概可以理解为一个副本就是一个容器

容器运行完成后,可以登录web页面进行查看,如图:

注意:如果另外两台节点服务器上没有相应的惊醒,则默认会从docker Hub上自动进行下载!

[root@node01 ~]# docker service ls            //查看创建的serviceID                  NAME                MODE                REPLICAS            IMAGE               PORTSnbfzxltrcbsk        web                 replicated          6/6                 nginx:latest        *:80->80/tcp[root@node01 ~]# docker service ps web     //查看创建的service都运行在那些容器上ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTSv7pmu1waa2ua        web.1               nginx:latest        node01              Running             Running 6 minutes ago                       l112ggmp7lxn        web.2               nginx:latest        node02              Running             Running 5 minutes ago                       prw6hyizltmx        web.3               nginx:latest        node03              Running             Running 5 minutes ago                       vg38mso99cm1        web.4               nginx:latest        node01              Running             Running 6 minutes ago                       v1mb0mvtz55m        web.5               nginx:latest        node02              Running             Running 5 minutes ago                       80zq8f8252bj        web.6               nginx:latest        node03              Running             Running 5 minutes ago                       

如果现在node02、node03发生宕机时,service并不会因为节点的当即而死掉,而是自动跑到正常的节点上。

模拟node02宕机,web页面如下:

恢复node02,web页面如下:

即使node02恢复正常,也不会将service分配给node02。

因此,可以得出一个结论:如果node发生故障,service会自动跑到可用的节点上;反之,如果node没有发生故障,默认情况下,service不会轻易更改节点!

七、实现service的扩容、收缩

扩容:就是添加几台service;
收缩:就是减少几台service;

针对上述环境实现收缩、扩容;

(1)service扩容

[root@node01 ~]# docker service scale web=8//原本有6个service,现在增加到8台

web页面如下:

关于service分配到那台node节点上,是根据docker swarm自身的算法进行分配的。

(2)service收缩

[root@node01 ~]# docker service scale web=4//原本有8个service,现在减少到4台

web页面如下:

(3)设置某个node不运行service

上述环境中,三台都是manager,即使是一台manager、两台worker默认情况manager也是进行工作的,将node02、node03降级为worker,执行如下命令:

[root@node01 ~]# docker node demote node02[root@node01 ~]# docker node demote node03

如图:

可以通过设置,使某台节点不运行service,如下:

[root@node01 ~]# docker node update --availability drain node01//设置noder01以后不运行容器,但已经运行的容器并不会停止// --availability:选项后面共有三个选项可配置,如下:active:工作;pause:暂时不工作;drain:永久性的不工作

web页面如下:

[root@node01 ~]# docker node update --availability drain node02//node02也不参加工作,但已经运行的容器并不会停止

如图:

由此可以得出:不是只有manager才有不工作的权力!

八、docker swarm网络

docker swarm集群会产生两种不同类型的流量:

  • 控制和管理层面:包括swarm消息管理等,例如请求加入或离开swarm,这种类型的流量总是被加密的(涉及到集群内部的hostname、ip-address、subnet、gateway等);
  • 应用数据层面:包括容器与客户端的通信等(涉及到 防火墙、端口映射、VIP等);

在swarm中有三个重要的概念:

  • overlay networks:管理swarm中Docker守护进程间的通信。你可以将服务附加到一个或多个已存在的overlay网络上,使得服务与服务之间能够通信;
  • ingress network:是一个特殊的overlay网络,用于服务节点间的负载均衡。当然任何swarm节点在发布的端口上接收到请求后,将请求交给一个名为IPVS的模块。IPVS跟踪参与该服务的所有IP地址,选择其中的一个,并通过ingress网络将请求到它;
  • docker_gwbridge:是一种桥接网络,将overlay网络(包括ingress网络)连接到一个单独的Docker守护进程的物理网络。默认情况下,服务正在运行的每个容器都连接到本地Docker守护进程主机的docker_gwbridge网络;

docker_gwbridge网络在初始化Swarm或加入Swarm时自动创建。大多数情况下,用户不需要自定义配置,但是Docker允许自定义;

查看node01上默认的网络,如图:

注意:图中的SCOPE,注意其作用范围!

除了Swarm群集默认创建的两个网络以外,我们还可以自定义创建overlay网络,连接到此网络的容器,即可互相通信,,但是需要注意,自定义的网络只能是创建的manager主机才可查看到!

创建自定义overlay网络

[root@node01 ~]# docker network create -d overlay --subnet 200.0.0.0/24 --gateway 200.0.0.1 --attachable my_net//Docker swarm群集创建overlay网络时,必须使用--attachable选项来指定名称,否则其他节点的容器运行时无法使用此网络

创建自定义的overlay网络时,必须是manager才可以创建,并且只在manager节点上才显示的,别的worker节点是查看不到的,但是可以使用。
如下:

[root@node02 ~]# docker run -itd --name test01 --ip 200.0.0.10 --network my_net busybox//node02使用刚才自定义的overlay网络创建容器[root@node03 ~]# docker run -itd --name test02 --network my_net --ip 200.0.0.20 busybox//node03使用自定义的overlay网络创建容器

测试访问:

这是node02、node03已经使用过这个自定义的网络了,这是在node02、node03上就可以查看到了!

而且基于docker swarm创建的overlay网络也符合自定义跨主机网络的特点,可以使用主机名进行通信。

九、搭建registry私有仓库

通过搭建registry私有仓库,可以便于让其他node下载镜像。搭建私有仓库可以参考Docker搭建私有仓库

[root@node01 ~]# docker run -itd --name registry -p 5000:5000 -v /registry:/var/lib/registry --restart=always registry:2[root@node01 ~]# vim /usr/lib/systemd/system/docker.service //更改内容为ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.1:5000[root@node01 ~]# systemctl daemon-reload [root@node01 ~]# systemctl restart docker[root@node01 ~]# docker ps -a -q | xargs docker start//由于刚才创建的容器并没有设置自动启动,所以在重启docker服务的时候,需要手动启动[root@node01 ~]# ssh-keygen -t rsa[root@node01 ~]# ssh-copy-id root@node02[root@node01 ~]# ssh-copy-id root@node03//设置免密登录[root@node01 ~]# scp /usr/lib/systemd/system/docker.service root@node02:/usr/lib/systemd/system/docker.service[root@node01 ~]# scp /usr/lib/systemd/system/docker.service root@node03:/usr/lib/systemd/system/docker.service//将docker的配置文件复制到node02、node03上,因为docker的配置文件都是一样的内容[root@node02 ~]# systemctl daemon-reload [root@node02 ~]# systemctl restart docker[root@node03 ~]# systemctl daemon-reload [root@node03 ~]# systemctl restart docker//重新启动node02、node03节点的docker服务[root@node01 ~]# docker pull httpd[root@node01 ~]# docker tag httpd:latest 192.168.1.1:5000/httpd:latest[root@node01 ~]# docker push 192.168.1.1:5000/httpd:latest //将httpd镜像上传到私有仓库中

十、service服务版本的升级与回滚

(1)准备环境

[root@node01 ~]# mkdir version{1,2,3,}[root@node01 ~]# cd version1[root@node01 version1]# echo "version1" >> index.html[root@node01 version1]# echo -e "FROM httpd:latest\nADD index.html /usr/local/apache2/htdocs/index.html" > Dockerfile[root@node01 version1]# docker build -t 192.168.1.1:5000/httpd:v1 .//version1目录下模拟生成版本v1[root@node01 version1]# cp Dockerfile ../version2[root@node01 version1]# cd !$cd ../version2[root@node01 version2]# echo "version2" >> index.html[root@node01 version2]# docker build -t 192.168.1.1:5000/httpd:v2 .//vesion2目录下模拟生成版本v2[root@node01 version2]# cp Dockerfile ../version3[root@node01 version2]# cd !$cd ../version3[root@node01 version3]# echo "version3" >> index.html[root@node01 version3]# docker build -t 192.168.1.1:5000/httpd:v3 .//vesion3目录下模拟生成版本v3//注意在主页面做一些区分[root@node01 ~]# docker push 192.168.1.1:5000/httpd:v1[root@node01 ~]# docker push 192.168.1.1:5000/httpd:v2[root@node01 ~]# docker push 192.168.1.1:5000/httpd:v3//将生成的镜像上传到私有仓库[root@node01 ~]# docker service create --replicas 3 --name httpd 192.168.1.1:5000/httpd:v1//基于192.168.1.1:5000/httpd:v1创建三个service副本

浏览器访问测试:

三个service副本是轮询的方式来服务的,根据node02、node03的首页内容进行测试!
node02:

[root@node02 ~]# docker psCONTAINER ID        IMAGE                       COMMAND              CREATED             STATUS              PORTS               NAMESb6c1d88fcadf        192.168.1.1:5000/httpd:v1   "httpd-foreground"   4 minutes ago       Up 4 minutes        80/tcp              httpd.1.qubzhexjprpt7s89ku91mlle0[root@node02 ~]# docker exec -it b6c1d88fcadf /bin/bashroot@b6c1d88fcadf:/usr/local/apache2# echo "node02" >> htdocs/index.html 

node03

[root@node03 ~]# docker psCONTAINER ID        IMAGE                       COMMAND              CREATED             STATUS              PORTS               NAMESee19c342188c        192.168.1.1:5000/httpd:v1   "httpd-foreground"   5 minutes ago       Up 5 minutes        80/tcp              httpd.3.9ru7zsokixz29iw99qbdp15gn[root@node03 ~]# docker exec -it ee19c342188c /bin/bashroot@ee19c342188c:/usr/local/apache2# echo "node03" >> htdocs/index.html 

访问测试:

[root@node01 ~]# curl 127.0.0.1version1node03[root@node01 ~]# curl 127.0.0.1version1[root@node01 ~]# curl 127.0.0.1version1node02//效果已经实现 

(2)版本升级

[root@node01 ~]# docker service update --image 192.168.1.1:5000/httpd:v2 httpd//更新容器的镜像为版本2

浏览器进行测试:

默认情况下,swarm一次只更新一个副本,并且两个副本之间并没有等待时间,可以通过以上方法进行设置。

[root@node01 ~]# docker service update --replicas 6 --image 192.168.1.1:5000/httpd:v3 --update-parallelism 2 --update-delay 1m httpd//--update-parallelism:设置更新的副本数量;//--update-delay:更新的间隔时间// --replicas 6:并在升级的过程中另外再创建3个副本

从更新的过程中可以看出效果!

浏览器确认版本更新成功:

(3)版本回滚

[root@node01 ~]# docker service rollback httpd//回滚为上一个版本

浏览器访问测试:

注意:当我们执行回滚操作的时候,默认是回滚到上一次操作的版本,并且不可以连续回滚。

十一、docker Swarm群集常用命令

[root@node02 ~]# docker swarm leave //那个节点想退出swarm群集,就在那台节点上执行这条命令//节点自动退出swarm群集(相当于辞职)[root@node01 ~]# docker node rm 节点名称//由manager主动删除节点(相当于开除)[root@node01 ~]# docker node promote 节点名称//将节点升级[root@node01 ~]# docker node demote 节点名称//将节点降级[root@node01 ~]# docker node ls          //查看swarm群集的信息(只可以在manager角色的主机上查看) [root@node01 ~]# docker node update --availability drain 节点名称 //调整节点不参加工作 [root@node01 ~]# docker swarm join-token worker//查看加入swarm群集的令牌(可以是worker也可以是manager)[root@node01 ~]# docker service scale web=4//扩容、收缩swarn群集servie的数量(取决与群集原本的数量)//比原本群集数量多,就是扩容,反之、收缩[root@node01 ~]# docker service ls//查看创建的service[root@node01 ~]# docker service ps service的名称//查看创建的service运行在那些容器上[root@node01 ~]# docker service create --replicas 6  --name web -p 80:80 nginx//指定运行的service副本数量[root@node01 ~]# docker service create --replicas 3 --constraint node.hostname==node03 --name test nginx//指定node节点,创建名为test的容器[root@node01 ~]# docker node update --label-add mem=max node02//以键值对的方式给docker02主机打上标签"mem=max",等号两边的内容是可以自定义的[root@node01 ~]# docker service create --name test1 --replicas 3 --constraint 'node.labels.mem==max' nginx//基于nginx镜像在标签为"mem==max"的主机上运行3个名为test1的服务[root@node01 ~]# docker node inspect node02//标签相关的信息,在Spec{  }中有显示

十二、docker swarm总结

  • 参与群集的主机名一定不能冲突,并且可以互相解析对方的主机名;
  • 集群内的所有节点可以都是manager角色,但是不可以都是worker角色;
  • 当指定运行的镜像时,如果群集中的节点本地没有该镜像,那么它将会自动下载对应的镜像;
  • 当群集正常工作时,若一个运行着容器的docker服务器发生宕机,那么,其所运行的所有容器,都将转移到其他正常运行的节点之上,而且,就算发生宕机的服务器恢复正常运行,也不会再接管之前运行的容器;
节点 网络 容器 服务 运行 主机 命令 版本 身份 工作 配置 副本 镜像 通信 集群 仓库 名称 数量 浏览器 环境 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库信息管理模式 怎么检索百度网盘的数据库 网络技术量化交易 杭州轻松购网络技术 1北京华盛恒辉软件开发公司 网络安全知识进课堂活动方案 期货软件开发定制平台搭建 以网络安全为题目的论文 苹果手机服务器无法建立安全链接 微软服务器集群 每日的考勤数据库怎么设计 数通设备 网络安全相关知识 宁德市成型设备数控软件开发 rust封号是封服务器吗 网络服务器怎么连接dns 福建高科技软件开发科技 股票软件开发需要认证吗 网站空间是不是服务器 德国网络安全硕士排名 武汉交易软件开发报价 计算机网络技术专业一建报名 软件开发面试多久后 网络安全法企业责任解读 上海易保网络技术有限公司黄蔚 信息网络安全的不足之处 数据库删除 北京天马时空网络技术怎么样 rustdesk自建服务器视频 电脑突然加载不出服务器页面 数据库和网络其他系统的通信
0