Docker Swarm群集配置实战(1)

前言:

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

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

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

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

须要注意的是,在一个Docker Swarm群集中,每台docker服务器的角色能够都是manager,可是,不能够都是worker,也就是说,不能够群龙无首,而且,参与群集的全部主机名,千万不能够冲突。服务器

这里经过一个案例来展现Docker Swarm集群的配置。架构


博文大纲:
1、环境准备
2、配置主机docker01
3、配置docker02及docker03加入Swarm群集
4、搭建registry私有仓库
5、docker01部署docker Swarm群集的web UI界面
6、docker Swarm群集的service服务配置
7、实现docker容器的扩容及缩容
8、附加——docker Swarm群集经常使用命令
9、docker Swarm总结ssh

1、环境准备

Docker  Swarm群集配置实战(1)

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

2、配置主机docker01

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

#因为须要在三台主机间复制一些配置文件,因此在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  Swarm群集配置实战(1)

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

3、配置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”选项
#最后一个删除后,这个群集也就不存在了

4、搭建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 httpd:latest 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私有仓库的搭建

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

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

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

Docker  Swarm群集配置实战(1)

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

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

一、在docker01(必须在manager角色的主机)上,发布一个任务,使用刚刚测试时上传的httpd镜像,运行六个容器,命令以下:

[root@docker01 ~]# docker service create --replicas 6 --name lvjianzhao -p 80 192.168.20.6:5000/lvjianzhao:latest 
#上述命令中,“--replicas”选项就是用来指定要运行的容器数量

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

Docker  Swarm群集配置实战(1)

注意:docker03并无下载相应的镜像,可是也会运行httpd服务,那么就能够得出一个结论:若docker主机没有指定的镜像,那么它将会自动去下载相应的镜像。

能够看到,在进行上述配置后,群集中的三台服务器基于httpd镜像运行了两个容器。共六个:

[root@docker01 ~]# 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

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

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

一、下面是针对上述建立的6个httpd服务的容器的扩容及缩容:

1)容器的扩容:

[root@docker01 ~]# docker service scale lvjianzhao=9    #将运行的httpd容器扩容到9个

扩容后,其web UI界面显示以下:

Docker  Swarm群集配置实战(1)

2)容器的缩容

[root@docker01 ~]# docker service scale lvjianzhao=3
将9个httpd服务的容器缩减到3个

缩容后,其UI界面显示以下:
Docker  Swarm群集配置实战(1)

二、设置某个docker服务器不运行容器

在上述的配置中,若运行指定数量的容器,那么将是群集中的全部docker主机进行轮询的方式运行,直到运行够指定的容器数量,那么,若是不想让docker01这个manager角色运行容器呢?(公司领导也不会去一线搬砖的嘛),能够进行如下配置:

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

8、附加——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标签的主机上运行

9、docker Swarm总结

在我对docker Swarm群集进行必定了解后,得出的结论以下:

  • 参与群集的主机名必定不能冲突,而且能够互相解析对方的主机名;
  • 集群内的全部节点能够都是manager角色,可是不能够都是worker角色;
  • 当指定运行的镜像时,若是群集中的节点本地没有该镜像,那么它将会自动下载对应的镜像;
  • 当群集正常工做时,若一个运行着容器的docker服务器发生宕机,那么,其所运行的全部容器,都将转移到其余正常运行的节点之上,并且,就算发生宕机的服务器恢复正常运行,也不会再接管以前运行的容器;

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

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

相关文章
相关标签/搜索