目录
Docker swarm
基本概念
Swarm是Docker 引擎内置(原生)的集群管理和编排工具。Docker Swarm是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是Docker 官方对容器云生态进行支持的核心方案。
使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。Swarm mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 Swarm 集群具备与Mesos、Kubernetes 竞争的实力。使用 Swarm 集群之前需要了解以下几个概念。
node节点
Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。节点分为管理 (manager) 节点和工作 (worker) 节点 。
管理节点用于Swarm集群的管理, docker swarm 命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为leader ,leader 通过raft协议实现。
工作节点是任务执行节点,管理节点将服务 ( service ) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。
docker swarm集群:三剑客之一
实验环境:
node01 | node02 | node03 |
---|---|---|
192.168.1.20 | 192.168.1.21 | 192.168.1.22 |
关闭防火墙、禁用selinux、3台dockerhost区别主机名
同步时间
[root@node01 ~]# yum -y install ntp
[root@node01 ~]# systemctl start ntpd
[root@node01 ~]# ntpstat
[root@node01 ~]# date
docker版本必须是: v1.12版本开始。
Swarm: 作用运行docker engin(引擎)的多个主机组成的集群。
node: 每一个docker engin都是一个node(节点),分为 manager 和worker。
manager node: 负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,他们会自动协调并选举出一个Leader执行编排任务。但相反,不能没有manager node。
worker node: 接受并执行由manager node 派发的任务,并且默认manager node也是一个work node,不过可以将它设置为manager-only node.让它只负责编排和管理工作。
service: 用来定义worker上执行的命令。
swarm
1)初始化集群
[root@node01 ~]# docker swarm init --advertise-addr 192.168.1.20
Swarm initialized: current node (shziicd4ffn9xpz9g587pa5o1) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2hwhlc8vs4qgr52iyeg014n3h2caggrskao7pyih9kh1abl7bm-7qn732mle4a23aawbxgrprfal 192.168.1.20:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
//–advertise-addr:指定与其他Node通信的地址。
上边返回的结果告诉我们:初始化成功,并且,如果想要添加work节点运行下面的命令:
在node02和node03执行
[root@node02 ~]# docker swarm join --token SWMTKN-1-2hwhlc8vs4qgr52iyeg014n3h2caggrskao7pyih9kh1abl7bm-7qn732mle4a23aawbxgrprfal 192.168.1.20:2377
This node joined a swarm as a worker.
[root@node03 ~]# docker swarm join --token SWMTKN-1-2hwhlc8vs4qgr52iyeg014n3h2caggrskao7pyih9kh1abl7bm-7qn732mle4a23aawbxgrprfal 192.168.1.20:2377
This node joined a swarm as a worker.
PS: 这里注意,token只有24小时的有效期。
如果想要添加manager 节点: 运行下边的命令:
docker swarm join-token manager
当其他两个节点加入成功之后,我们可以执行docker node ls 查看节点详情
[root@node01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
shziicd4ffn9xpz9g587pa5o1 * node01 Ready Active Leader 18.09.0
8mu10ingeds8ne1x6jt6q5mw7 node02 Ready Active 18.09.0
6klim48yqfijk3nd2w6fuud22 node03 Ready Active 18.09.0
基本操作命令:
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.
docker node update --availability (“active”|“pause”|“drain”)
PS: 可以通过设置节点的状态,让manager节点不参加实际的运行容器的
任务。
2) 部署docker swarm集群网络
overlay:覆盖型网络。
[root@node01 ~]# docker network create -d overlay --attachable docker
vs18iquob7pdb9td1hlkbiqh6
[root@node01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
vs18iquob7pd docker overlay swarm
//attachable: 这个参数必须要加,否则不能用于容器。在创建网络的时候,我们并没有部署一个存储服务,比如consul,那是因为docker swarm自带存储。
并且,我们在node1上创建的此网络,但在swarm的其他节点,是查看不到此网络信息的。但却能够直接使用此网络。
3)部署一个图形化webUI 界面。
[root@node01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.20 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
然后可以通过浏览器访问验证。
如果访问不到网页,需开启路由转发
[root@node01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@node01 ~]# sysctl -p
4)创建service(服务)
[root@node01 ~]# docker service create --replicas 1 --network docker --name web1 -p 80 nginx
//–replicas: 副本数量。
大概可以理解为;一个副本等于一个容器。
//查看service:
[root@node01 ~]# docker service ls
//查看service 信息:
[root@node01 ~]# docker service ps web1
//设置manager node 不参加工作
[root@node01 ~]# docker node update node01 --availability drain
[root@node01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
shziicd4ffn9xpz9g587pa5o1 * node01 Ready Drain Leader 18.09.0
8mu10ingeds8ne1x6jt6q5mw7 node02 Ready Active 18.09.0
6klim48yqfijk3nd2w6fuud22 node03 Ready Active 18.09.0
恢复
[root@node01 ~]# docker node update node01 --availability active
可以看帮助:
[root@node01 ~]# docker node update node01 --help
5)搭建私有仓库并自定义镜像
我基于nginx镜像做的三个自定义镜像,并更改了主访问界面内容
下载registry镜像
[root@node01 ~]# docker run -itd --name registry --restart=always -p 5000:5000 registry:2
//编辑docker配置文件
[root@node01 ~]# vim /usr/lib/systemd/system/docker.service
添加:
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.20:5000
[root@node01 ~]# scp /usr/lib/systemd/system/docker.service root@192.168.1.21:/usr/lib/systemd/system/
[root@node01 ~]# scp /usr/lib/systemd/system/docker.service root@192.168.1.22:/usr/lib/systemd/system/
这里注意更改完一定要重启
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl restart docker
下载nginx镜像
//web01
[root@node01 ~]# docker run -itd --name web01 nginx
[root@node01 ~]# docker exec -it web01 bash
root@62acfe960104:/# echo 111 > usr/share/nginx/html/index.html
[root@node01 ~]# docker commit web01 web01
//web02
[root@node01 ~]# docker run -itd --name web02 nginx
[root@node01 ~]# docker exec -it web02 bash
root@62acfe960104:/# echo 222 > usr/share/nginx/html/index.html
[root@node01 ~]# docker commit web02 web02
//web03
[root@node01 ~]# docker run -itd --name web03 nginx
[root@node01 ~]# docker exec -it web03 bash
root@62acfe960104:/# echo 333 > usr/share/nginx/html/index.html
[root@node01 ~]# docker commit web03 web03
//镜像重命名
[root@node01 ~]# docker tag web01:latest 192.168.1.20:5000/web01:v1
[root@node01 ~]# docker tag web02:latest 192.168.1.20:5000/web02:v2
[root@node01 ~]# docker tag web03:latest 192.168.1.20:5000/web03:v3
//上传私有仓库
[root@node1 ~]# docker push 192.168.1.20:5000/web01:v1
[root@node1 ~]# docker push 192.168.1.20:5000/web02:v2
[root@node1 ~]# docker push 192.168.1.20:5000/web03:v3
6)发布一个服务,基于上述镜像
要求: 副本数量为3个。服务的名称为:bdqn.
[root@node1 ~]# docker service create --replicas 3 --name bdqn -p 80:80 192.168.1.20:5000/web01:v1
默认的Ingress 网络,包括创建的自定义overlay网络,为后端真正为用户提供服务的container,提供了一个统一的入口。
7)服务的扩容与缩容
[root@node01 ~]# docker service scale bdqn=6
扩容与缩容直接直接通过scale进行设置副本数量。
8)服务的升级与回滚
[root@node01 ~]# docker service update --image 192.168.1.20:5000/web02:v2 bdqn
//平滑的更新。
PS: 默认情况下,swarm一次只更新一个副本,并且两个副本之间没有等待时间,我们可以通过:
–update-parallelism;设置并行更新的副本数量。
–update-delay:指定滚动更新的时间间隔。
//回滚操作
[root@node01 ~]# docker service rollback bdqn
PS:注意,docker swarm的回滚操作,默认只能回滚到上一次操作的状态,并不能连续回滚操作
9)指定容器运行节点
[root@node01 ~]# docker node update --help
--label-add list Add or update a node label
(key=value)
给节点添加标签
//假设,这里我们给node02上添加一个标签(磁盘容量最大)。
[root@node01 ~]# docker node update --label-add disk=max node02
//查看标签信息。
[root@node01 ~]# docker node inspect node02
[
{
"ID": "rc60akwe59lupkrm1ze4jfmnf",
"Version": {
"Index": 201
},
"CreatedAt": "2021-02-13T05:17:28.996757577Z",
"UpdatedAt": "2021-02-13T06:19:07.033869045Z",
"Spec": {
"Labels": {
"disk": "max"
},
···
//删除标签。
[root@node01 ~]# docker node update --label-rm disk node02
//运行服务,指定节点。
[root@node01 ~]# docker service create --name test --replicas 3 --constraint 'node.labels.disk == max' nginx
[root@node01 ~]# docker service ls
[root@node01 ~]# docker service ps test