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,就好比将多个dockerhost封装成一个单个大型的docker主机,所有的操作都针对的是这个大型的docker主机,映射端口的时候,我们只需要指定一个端口给这个大型docker,而组成集群的的其它dockerhost都会生效,并且如果是网站服务,自带负载均衡服务,任意一个dockerhost:port对应的是整个集群
管理节点用于Swarm集群的管理, docker swarm
命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为leader ,leader 通过raft
协议实现。
PS:工作节点可以有多个,但必须有一个管理节点
docker自带的服务,不需要安装任何东西!
前提准备:
关闭防火墙、禁用selinux、3台dockerhost区别主机名、时间同步,docker版本必须是v1.12以上才支持
实验环境:
服务 | 主机 | 备注 |
---|---|---|
manager | 172.16.46.111 | 管理节点,也工作,相当于经理,主管 |
worker | 172.16.46.112 | 工作节点,相当于员工 |
worker | 172.16.46.113 | 工作节点,相当与员工 |
[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 join-token worker
加入集群worker命令,会生成“口令”,复制dockerhost运行
docker swarm join-token manager
加入集群manager命令,会生成“口令”,复制dockerhost运行
PS:令牌有效期只有24小时,过期之后需要按照上面的命令生成新的令牌
可以使用docker swarm --help查看swarm帮助
docker node --help 查看node管理命令,只有manager权限
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不可以在被降级
离开集群的步骤:
docker service命令用来管理集群服务(重要)
语法:docker node update --availability drain|pause|active node_xxx
自定义部署集群网络,创建service服务我们不指定网络name的时候,默认是ingress
#docker17.05版本以上支持自定义网络
docker network create -d overlay --attachable docker
PS:在创建网络的时候,我们并没有部署一个存储服务,比如consul,那是因
为docker swarm自带存储,从而解决了跨主机网络的问题。
//attachable: 创建网络的时候参数必须要加,否则不能用于容器。
搭建好集群以后,部署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 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 run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
更多参考docker私有仓库的文档!
修改docker.service文件
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 ~]#
[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
平滑的升级
[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
指定时间间隔的更新
PS: 默认情况下,swarm一次只更新一个副本,并且两个副本之间没有等 待时间,我们可以通过
--update-parallelism;
设置并行更新的副本数量。
--update-delay:
指定滚动更新的时间间隔
docker service update --image 172.16.46.111:5000/httpd:v3 --update-parallelism 2 --update-delay 30s web1
验证方式很多
可以访问网站的跟目录,可以看docker ps 看版本
这里是在容器管理界面看
[root@docker01 ~]# docker service rollback web1
已经回退到了v2版本
docker swarm集群数据一致性,并且还要保证数据可以持久化所以我们需要一台存储服务器NFS
在集群使用docker service create
创建服务时,添加mount项挂载目录,指定volume方式挂载,跟正常持久化方式一样,不过需要添加是上nfs的共享目录
如下图
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 service scale nginx=6
挂载情况
查看集群
[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
添加标签
[root@lzs01 ~]# docker node update --label-add disk=good lzs03
lzs03
查看标签
或者
服务部署条件约束
关键字 --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
验证