Docker Swarm群集配置实战(1)

网友投稿 314 2022-10-31

Docker Swarm群集配置实战(1)

前言:

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

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

Docker Swarm集群中有三个角色:manager(管理者);worker(实际工作者)以及service(服务)。

在上面的三个角色中,其本质上与我们公司的组织架构类似,有领导(manager),有搬砖的(worker),而领导下发给搬砖者的任务,就是Docker Swarm中的service(服务)。

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

这里通过一个案例来展示Docker Swarm集群的配置。

博文大纲:一、环境准备二、配置主机docker01三、配置docker02及docker03加入Swarm群集四、搭建registry私有仓库五、docker01部署docker Swarm群集的web UI界面六、docker Swarm群集的service服务配置七、实现docker容器的扩容及缩容八、附加——docker Swarm群集常用命令九、docker Swarm总结

一、环境准备

在上述主机中,将指定主机docker01为manager的角色,其他主机的角色为worker。

二、配置主机docker01

以下操作,将初始化一个Swarm群集,并指定docker01的角色为manager。

#由于需要在三台主机间复制一些配置文件,所以在docker01上配置免密登录 [root@docker01 ~]# ssh-keygen #生成密钥对,一路按回车即可生成 [root@docker01 ~]# tail -3 /etc/hosts #配置/etc/hosts文件 #三台主机之间要互相解析(Swarm群集也需要此配置) 192.168.20.6 docker01 192.168.20.7 docker02 192.168.20.8 docker03 [root@docker01 ~]# ssh-copy-id docker02 #将生成的秘钥发送到docker02 root@docker02 s password: #要输入docker02的root密码 [root@docker01 ~]# ssh-copy-id docker03 #将秘钥发送到docker03,同样需要输入docker03的root密码 [root@docker01 ~]# scp /etc/hosts docker02:/etc/ #将hosts文件发送到docker02 [root@docker01 ~]# scp /etc/hosts docker03:/etc/ #将hosts文件发送到docker03 [root@docker01 ~]# docker swarm init --advertise-addr 192.168.20.6 #初始化一个集群,并指定自己为manager

当执行上述操作,指定自己为manager初始化一个群组后,则会随着命令的执行成功而返回一系列的提示信息,这些提示信息给出的是,如果其他节点需要加入此节点,需要执行的命令,直接对其进行复制,然后,在需要加入此群集的主机上执行,即可成功加入群集。

返回的提示信息如下:

在上述中,既然给出了相应的命令,那么,现在开始配置需要加入群集的docker服务器。

三、配置docker02及docker03加入Swarm群集

#docker02执行以下命令: [root@docker02 ~]# docker swarm join --token SWMTKN-1-5ofgk6fh1vey2k7qwsk4gb9yohkxja6hy8les7plecgih1xiw1-3vpemis38suwyxg3efryv5nyu 192.168.20.6:2377 #docker03也执行以下命令 [root@docker03 ~]# docker swarm join --token SWMTKN-1-5ofgk6fh1vey2k7qwsk4gb9yohkxja6hy8les7plecgih1xiw1-3vpemis38suwyxg3efryv5nyu 192.168.20.6:2377 [root@docker01 ~]# docker node promote docker02 #将docker02从worker升级为manager。

至此,docker02及03便以worker的角色加入到了群集当中。

若docker02或者docker03要脱离这个群集,那么需要以下配置(这里以docker03为例):

#将docker03脱离这个群集 [root@docker03 ~]# docker swarm leave #在docker03上执行此命令 [root@docker01 ~]# docker node rm docker03 #然后在manager角色的服务器上移除docker03 [root@docker01 ~]# docker swarm leave -f #若是最后一个manager上进行删除群集,则需要加“-f”选项 #最后一个删除后,这个群集也就不存在了

四、搭建registry私有仓库

在docker Swarm群集中,私有仓库并不影响其群集的正常运行,只是公司的生产环境多数都是自己的私有仓库,所以这里模拟一下。

[root@docker01 ~]# docker run -d --name registry --restart always -p 5000:5000 registry #运行一个registry仓库容器 [root@docker01 ~]# vim /usr/lib/systemd/system/docker.service #修改docker配置文件,以便指定私有仓库 ExecStart=/usr/bin/dockerd -H unix:// --insecure-registry 192.168.20.6:5000 #定位到改行,指定私有仓库IP及端口 #编辑完成后,保存退出即可 [root@docker01 ~]# systemctl daemon-reload #重新加载配置文件 [root@docker01 ~]# systemctl restart docker #重启docker服务 #docker02及docker03也需要指定私有仓库的位置,所以执行下面的命令将更改后的docker配置文件复制过去 [root@docker01 ~]# scp /usr/lib/systemd/system/docker.service docker02:/usr/lib/systemd/system/ [root@docker01 ~]# scp /usr/lib/systemd/system/docker.service docker03:/usr/lib/systemd/system/ #将docker的配置文件复制过去以后,需要重启docker02及03的docker服务 #下面的命令需要在docker02及03的服务器上分别运行一次: [root@docker02 ~]# systemctl daemon-reload [root@docker02 ~]# systemctl restart docker

在私有仓库完成后,最好测试一下是否可以正常使用,如下:

#docker01将httpd镜像上传到私有仓库 [root@docker01 ~]# docker tag 192.168.20.6:5000/lvjianzhao:latest [root@docker01 ~]# docker push 192.168.20.6:5000/lvjianzhao:latest #在dokcer02上进行下载,测试是否可以正常下载 [root@docker02 ~]# docker pull 192.168.20.6:5000/lvjianzhao:latest #可以正常下载,说明私有仓库可用

在上面搭建私有仓库的过程,并没有实现数据的持久化,若需要基于数据持久化搭建私有仓库,可以参考博文:Docker之Registry私有仓库+Harbor私有仓库的搭建。

五、docker01部署docker Swarm群集的web UI界面

[root@docker01 ~]# docker run -d -p 8000:8080 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer #执行上述命令后,即可客户端访问其8000访问,可以看到群集内的节点信息 #若节点发生故障,则会立即检测到

访问docker01的8000端口,即可看到以下界面(该界面只能看,不能进行任何配置):

配置至此,docker Swarm的群集基本完善了,接下来,开始展示该群集,究竟可以做些什么?也就是到了配置其service服务阶段。

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

1、在docker01(必须在manager角色的主机)上,发布一个任务,使用刚刚测试时上传的~]# docker service create --replicas 6 --name lvjianzhao -p 80 192.168.20.6:5000/lvjianzhao:latest #上述命令中,“--replicas”选项就是用来指定要运行的容器数量

当运行六个容器副本后,可以查看群集的web UI界面,显示如下:

注意:docker03并没有下载相应的镜像,但是也会运行~]# docker service ls #查看service的状态 ID NAME MODE REPLICAS IMAGE PORTS 13zjbf5s02f8 lvjianzhao replicated 6/6 192.168.20.6:5000/lvjianzhao:latest *:30000->80/tcp

七、实现docker容器的扩容及缩容

何为扩容?何为缩容?无非就是在容器无法承担当前负载压力的情况下,扩增几个一样的容器,缩容呢?也就是在大量容器资源闲置的情况下,减少几个一样的容器而已。

1、下面是针对上述创建的6个~]# docker service scale lvjianzhao=9 #将运行的 UI界面显示如下:

2)容器的缩容

[root@docker01 ~]# docker service scale lvjianzhao=3 将9个~]# docker node update --availability drain docker01 #设置主机docker01以后不运行容器,但已经运行的容器并不会停止 # “--availability”选项后面共有三个选项可配置,如下: # “active”:工作;“pause”:暂时不工作;“drain”:永久性的不工作

八、附加——docker Swarm群集常用命令

[root@docker01 ~]# docker node ls #查看群集的信息(只可以在manager角色的主机上查看) [root@docker01 ~]# docker swarm join-token worker #如果后期需要加入worker端,可以执行此命令查看令牌(也就是加入时需要执行的命令) [root@docker01 ~]# docker swarm join-token manager #同上,若要加入manager端,则可以执行这条命令查看令牌。 [root@docker01 ~]# docker service scale web05=6 #容器的动态扩容及缩容 [root@docker01 ~]# docker service ps web01 #查看创建的容器运行在哪些节点 [root@docker01 ~]# docker service ls #查看创建的服务 #将docker03脱离这个群集 [root@docker03 ~]# docker swarm leave #docker03脱离这个群集 [root@docker01 ~]# docker node rm docker03 #然后在manager角色的服务器上移除docker03 [root@docker01 ~]# docker node promote docker02 #将docker02从worker升级为manager。 #升级后docker02状态会为Reachable [root@docker01 ~]# docker node demote docker02 #将docker02从manager角色降级为worker [root@docker01 ~]# docker node update --availability drain docker01 #设置主机docker01以后不运行容器,但已经运行的容器并不会停止 [root@docker01 ~]# docker node update --label-add mem=max docker03 #更改docker03主机的标签为mem=max [root@docker01 ~]# docker service update --replicas 8 --image 192.168.20.6:5000/lvjianzhao:v2.0 --container-label-add 'node.labels.mem == max' lvjianzhao05 #将服务升级为8个容器,并且指定在mem=max标签的主机上运行

九、docker Swarm总结

在我对docker Swarm群集进行一定了解后,得出的结论如下: 参与群集的主机名一定不能冲突,并且可以互相解析对方的主机名; 集群内的所有节点可以都是manager角色,但是不可以都是worker角色; 当指定运行的镜像时,如果群集中的节点本地没有该镜像,那么它将会自动下载对应的镜像; 当群集正常工作时,若一个运行着容器的docker服务器发生宕机,那么,其所运行的所有容器,都将转移到其他正常运行的节点之上,而且,就算发生宕机的服务器恢复正常运行,也不会再接管之前运行的容器;

关于docker Swarm群集的更多功能,可以阅读博文:Docker Swarm群集配置实战(2)

———————— 本文至此结束,感谢阅读 ————————

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用Spring静态注入实现读取配置工具类新方式
下一篇:一文详解高级可扩展接口
相关文章

 发表评论

暂时没有评论,来抢沙发吧~