docker swarm集群

docker swarm 集群

docker swarm 的概念

dockerhost主机可以主动初始化(init)成一个swarm集群,也可以加入一个已经存在的集群,这样,这个主机就成为了一个swarm集群的node节点,node节点分为管理者(manager)工作节点(worker)

Swarm是Docker 引擎内置(原生)的集群管理和编排工具。Docker Swarm是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是Docker 官方对容器云生态进行支持的核心方案。

node节点分为manager和worker,manager负责管理编排,worder是工作节点 ​

manager node: 负责执行容器的编排和集群的管理工作,保持并维护 swarm处于期望的状态swarm可以有多个manager node,他们会自动协调并选举出一个Leader执行编排任务。但相反,不能没有manager

worker node: 接受并执行由manager node 派发的任务,并且默认 manager node也是一个work node,不过可以将它设置为manager-only node.让它只负责编排和管理工作

docker swarm怎么工作的官方给出了最合理的解释:

生产环境docker swarm集群manager最少建议还是3台,最多7台,如果只有一台的manager,如果它宕机了,下面的所有的worker节点都无法正常工作。

PS: raft算法会保证每一台master上面运行状态一致!

docker swarm集群_第1张图片

docker swarm理解

使用docker swarm,就好比将多个dockerhost封装成一个单个大型的docker主机,所有的操作都针对的是这个大型的docker主机,映射端口的时候,我们只需要指定一个端口给这个大型docker,而组成集群的的其它dockerhost都会生效,并且如果是网站服务,自带负载均衡服务,任意一个dockerhost:port对应的是整个集群

node节点特性

管理节点用于Swarm集群的管理, docker swarm命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为leader ,leader 通过raft协议实现。

PS:工作节点可以有多个,但必须有一个管理节点

Docker Swarm部署

docker自带的服务,不需要安装任何东西!

前提准备:

关闭防火墙、禁用selinux、3台dockerhost区别主机名、时间同步,docker版本必须是v1.12以上才支持

实验环境:

服务 主机 备注
manager 172.16.46.111 管理节点,也工作,相当于经理,主管
worker 172.16.46.112 工作节点,相当于员工
worker 172.16.46.113 工作节点,相当与员工

1)初始化集群

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

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

    docker swarm join --token SWMTKN-1-50qjoehiuhvytay7b73pr36f0ji2vit8py70j690ptvbou0z3q-1ifl7qlfxh0xfobygfpf407r9 172.16.46.111:2377

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

[root@docker01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
j7lam7zskgmcmf6z2r6j7eu2o *   docker01            Ready               Active              Leader              18.09.0

//–advertise-addr:指定与其他Node通信的地址

初始化完成以后,返回2条命令

docker swarm集群_第2张图片

docker swarm join-token worker 加入集群worker命令,会生成“口令”,复制dockerhost运行

docker swarm join-token manager 加入集群manager命令,会生成“口令”,复制dockerhost运行

PS:令牌有效期只有24小时,过期之后需要按照上面的命令生成新的令牌​ ​

swarm集群的操作命令

可以使用docker swarm --help查看swarm帮助

docker swarm集群_第3张图片

docker node --help 查看node管理命令,只有manager权限

docker swarm集群_第4张图片

docker swarm leave : 申请离开一个集群,之后查看节点状态会变成down.然后可以通过manager node 将其删除。
docker node rm xxx: 删除某个节点。
docker swarm join-token [manager | worker]:生成令牌,可以是manager身份或worker身份。
docker node demote(降级):将swarm节点的manager降级为work.
docker node promote(升级): 将warm节点的work升级为manager

PS:当只有最后一个manager的时候,最后一个manager不可以在被降级

离开集群的步骤:

  • worker节点在全局集群离开,docker swarm leave ==> down
  • manager节点上删除 docker node rm HOSTNAME/ID

docker service命令用来管理集群服务(重要)

docker swarm集群_第5张图片

设置节点的工作状态
docker swarm集群_第6张图片
节点工作的3种模式:

语法:docker node update --availability drain|pause|active node_xxx

  • active 活跃态,工作状态
  • pause 暂停工作
  • drain 不工作

2)部署docker swarm集群网络

自定义部署集群网络,创建service服务我们不指定网络name的时候,默认是ingress

#docker17.05版本以上支持自定义网络
docker network create -d overlay --attachable docker

PS:在创建网络的时候,我们并没有部署一个存储服务,比如consul,那是因
为docker swarm自带存储,从而解决了跨主机网络的问题。

//attachable: 创建网络的时候参数必须要加,否则不能用于容器。
docker swarm集群_第7张图片

3)部署图形化web界面

搭建好集群以后,部署visualizer服务来图形化显示状态信息

docker run -d -p 8080:8080 -e HOST=172.16.46.111 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer

然后可以通过浏览器访问验证。

如果访问不到网页,需开启路由转发。

echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf  
sysctl -p

docker swarm集群_第8张图片

4) 创建service服务

docker service create --replicas 1 --network docker --name web1 -p 80 nginx

//–replicas: 副本数量。大概可以理解为;一个副本等于一个容器。
//查看service: docker service ls
//查看service 信息:docker service ps xxx.
//设置manager node 不参加工作: docker node update node-01 --availability drain

docker swarm集群_第9张图片

如果运行多个服务,都会在这里显示出来,不同的颜色代表不一样的容器

案例模拟服务的升级与回滚

搭建自己的私有仓库

docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2

更多参考docker私有仓库的文档!

修改docker.service文件

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

systemctl daemon-reload
systemctl restart docker

保证其他节点可以下载到镜像,也需要修改docker.service

scp /usr/lib/systemd/system/docker.service [email protected]:/usr/lib/systemd/system/docker.service
scp /usr/lib/systemd/system/docker.service [email protected]:/usr/lib/systemd/system/docker.service

重新加载docker

systemctl daemon-reload
systemctl restart docker

自定义镜像

其中每一次都有修改镜像内的网站根目录,分别是:111,222,333

  246  docker tag httpd:latest 172.16.46.111:5000/httpd:v1
  247  docker tag httpd:latest 172.16.46.111:5000/httpd:v2
  248  docker tag httpd:latest 172.16.46.111:5000/httpd:v3

上传镜像到私有仓库

  250  docker push 172.16.46.111:5000/httpd:v1
  251  docker push 172.16.46.111:5000/httpd:v2
  252  docker push 172.16.46.111:5000/httpd:v3

PS:如果想使用阿里云的作为私有仓库,因为无法自动去根据位置下载镜像。

所以还是要用阿里云的私有仓库,需要手动上传镜像到阿里云再再下载镜像到其他2个dockerhost

基于镜像发布服务

[root@docker01 ~]# docker service create --replicas 6 --name bdqn -p80 172.16.46.111:5000/httpd:v1
sqfdc1ermfvsv3xzhuwfikyeq
overall progress: 6 out of 6 tasks 
1/6: running   [==================================================>] 
2/6: running   [==================================================>] 
3/6: running   [==================================================>] 
4/6: running   [==================================================>] 
5/6: running   [==================================================>] 
6/6: running   [==================================================>] 
verify: Service converged 
[root@docker01 ~]# 

docker swarm集群_第10张图片

服务的扩容与收缩

[root@docker01 ~]# docker service scale 
 lzs=   web1=  
#选择一个服务,扩容与缩容直接直接通过scale进行设置副本数量,实现扩容与收缩
[root@docker01 ~]# docker service scale web1=3
bdqn scaled to 3
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 

docker swarm集群_第11张图片

服务的升级与回滚

平滑的升级

[root@docker01 ~]# docker service update bdqn --image 172.16.46.111:5000/httpd:v2
bdqn
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 

docker swarm集群_第12张图片

指定时间间隔的更新

PS: 默认情况下,swarm一次只更新一个副本,并且两个副本之间没有等 待时间,我们可以通过

--update-parallelism; 设置并行更新的副本数量。

--update-delay: 指定滚动更新的时间间隔

docker service update --image 172.16.46.111:5000/httpd:v3 --update-parallelism 2 --update-delay 30s web1

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

验证方式很多

可以访问网站的跟目录,可以看docker ps 看版本

这里是在容器管理界面看

docker swarm集群_第13张图片

版本回退

[root@docker01 ~]# docker service rollback web1

已经回退到了v2版本

docker swarm集群_第14张图片

docker swarm 集群数据持久化

docker swarm集群数据一致性,并且还要保证数据可以持久化所以我们需要一台存储服务器NFS

在集群使用docker service create创建服务时,添加mount项挂载目录,指定volume方式挂载,跟正常持久化方式一样,不过需要添加是上nfs的共享目录

如下图

docker swarm集群_第15张图片

PS:docker01,02, 03可能会有多个nginx服务,不过他们挂载的内容与nfs共享的内容都是一致的且同步的

PS:不需要手动去挂载nfs的共享目录,创建的时候指定会自动挂载

实现集群的数据持久化

搭建nfs服务略

要保证都可以连接上nfs服务

集群创建nginx服务

docker service create --mount 'type=volume,src=nfs-test,dst=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=172.16.46.111:/nfsshare,"volume-opt=o=addr=172.16.46.111,vers=4,soft,timeo=180,bg,tcp,rw"' -p 8888:80 --name nginx nginx

PS:此时,nfs共享目录和容器内的nfs-test目录还有nginx网页根目录 /usr/share/nginx/html 已经形成了一致

如下图:

docker swarm集群_第16张图片

服务扩容

docker service scale nginx=6

挂载情况

docker swarm集群_第17张图片

添加标签——服务部署条件约束

查看集群

[root@lzs02 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
2ts115ffyncs4kecfuinx24hx     lzs01               Ready               Active              Reachable           18.09.0
onwzkgpiy08orbjzs437bpnie *   lzs02               Ready               Active              Reachable           18.09.0
35yeeb5zmhg4j6fssfvwtpm6x     lzs03               Ready               Active              Leader              18.09.0

添加标签

docker swarm集群_第18张图片

[root@lzs01 ~]# docker node update --label-add disk=good lzs03
lzs03

查看标签

docker swarm集群_第19张图片

或者

docker swarm集群_第20张图片

服务部署条件约束

关键字 --constraint 后添加限制条件即可

[root@lzs01 ~]# docker service create --name web --replicas 6 --constraint 'node.labels.disk == good' -p80 httpd
25uqr58blgbnoy40y1evqd08c
overall progress: 6 out of 6 tasks 
1/6: running   [==================================================>] 
2/6: running   [==================================================>] 
3/6: running   [==================================================>] 
4/6: running   [==================================================>] 
5/6: running   [==================================================>] 
6/6: running   [==================================================>] 
verify: Service converged 

验证

docker swarm集群_第21张图片

你可能感兴趣的:(docker,docker,docker,swarm)