Docker Swarn
Docker Swarm 是 Docker 官方项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。它是Docker公司推出的官方容器集群平台,基于Go语言实现,代码在https://github.com/docker/swarm,使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。
Docker Swarm是原生支持Docker集群管理的工具。它可以把多个Docker主机组成的系统转换为单一的虚拟Docker主机,使得容器可以组成跨主机的子网网络。 在很多台机器上部署Docker,组成一个Docker集群,并把整个集群的资源抽象成资源池,使用者部署Docker应用的时候,只需要将应用交给Swarm,Swarm会根据整个集群资源的使用情况来分配资源给部署的Docker应用,可以将这个集群的资源利用率达到最大。
1:Swarm主从架构
Swarm集群通过Raft协议在多个管理节点中实现共识,工作节点上运行agent接受管理节点的统一管理和任务分配。
2:基本概念
1、Swarm集群
Swarm集群为一组被统一管理起来的Docker主机。集群是Swarm所管理的对象,这些主机通过Docker引擎的Swarm模式相互沟通,其中部分主机可能作为管理节点响应外部的管理请求,其他主机作为工作节点来实际运行Docker容器。
当用户使用Swarm集群时,首先定义一个服务(指定状态,复制个数,网络,存储,端口等)然后通过管理节点发出启动服务的指令,管理节点随后会按照指定的服务规则进行调度,在集群中启动起来整个服务,并确保它正常运行。
2、节点
节点(Node)是Swarm集群中最小的资源单位,每个节点实际上都是一台Docker主机。
Swarm集群中节点分为两种:
管理节点(Manager):负责响应外部对集群的操作请求,并维持集群中资源,分发任务给工作节点。同时,多个管理节点之间通过Raft协议构成共识。一般推荐每个集群设置5-7个管理节点。
工作节点(Worker):负责执行管理节点安排的具体任务。默认情况下,管理节点自身也同时是工作节点。用户可以通过docker node promote 命令来提升一个工作节点为管理节点;或者通过docker node demote命令来将一个管理节点降级为工作节点。
3、服务和任务
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
服务有两种模式:
replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
global services 每个工作节点上运行一个任务
两种模式通过 docker service create 的 –mode 参数指定。
4、服务的外部访问
Swarm集群中的服务要被集群外部访问,必须要能允许任务的响应端口映射出来。Swarm中支持入口负载均衡(ingress load balancing)的映射模式,该模式下,每个服务都会被分配一个公开端口,该端口在集群中任意节点上都可以访问到,并被保留给改服务。当有请求发送到任意节点的公开端口时,该节点若并没有实际执行服务相关的容器,则会通过路由机制将请求转发给实际执行了服务容器的工作节点。
3:创建Swarm集群
1、使用swarm
docker 版本: Version: 20.10.12
Swarm集群主要操作命令:
swarm init: 在管理节点上创建一个集群
node list: 列出集群中的节点信息
swarm join: 加入一个新的节点到已有集群中
swarm update: 更新一个swarm集群
swarm leave: 离开一个集群
docker service 命令等
2、创建集群
# 时间必须同步!
# 初始化集群,会自动把当前节点设置为管理节点
# 时间同步(所有节点操作)
[root@manager ~]# systemctl start chronyd
[root@manager ~]# chronyc sources -v
# 配置加速
{
"registry-mirrors": ["https://4pwh0wn5.mirror.aliyuncs.com"],
"insecure-registries": ["registry.kubernetes.com"]
}
[root@manager ~]# docker swarm init --advertise-addr 10.0.0.10
Swarm initialized: current node (uve2jirf6duxbyl247dmy48ug) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2iypbo9pqbrfxr0h5khkphw2wxc20u41inb02qegrwc885lzdp-6erb2jmi46jdwa8ui4vixdgcz 10.0.0.10:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# 查看swarm worker的连接令牌
docker swarm join-token worker
# 查看swarm manager的连接令牌
docker swarm join-token manager
注意提示返回的token就是节点加入集群需要的信息。这里是两个管理节点 按照提示执行’docker swarm join-token manager’ 查看返回的token,在Host2中执行加入集群。
# 加入节点
[root@worker-1 ~]# docker swarm join --token SWMTKN-1-2iypbo9pqbrfxr0h5khkphw2wxc20u41inb02qegrwc885lzdp-6erb2jmi46jdwa8ui4vixdgcz 10.0.0.10:2377
This node joined a swarm as a worker.
[root@worker-2 ~]# docker swarm join --token SWMTKN-1-2iypbo9pqbrfxr0h5khkphw2wxc20u41inb02qegrwc885lzdp-6erb2jmi46jdwa8ui4vixdgcz 10.0.0.10:2377
This node joined a swarm as a worker.
3:查看集群节点信息
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
uve2jirf6duxbyl247dmy48ug * manager Ready Active Leader 20.10.12
scacp78dh13v0id9fskntjxac worker-1 Ready Active 20.10.12
itrdnclq3y3f572v1tu071yh9 worker-2 Ready Active 20.10.12
4:升降级节点
# 将节点升级为manager
[root@manager ~]# docker node promote worker-1
Node worker-1 promoted to a manager in the swarm.
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
uve2jirf6duxbyl247dmy48ug * manager Ready Active Leader 20.10.12
scacp78dh13v0id9fskntjxac worker-1 Ready Active Reachable 20.10.12
itrdnclq3y3f572v1tu071yh9 worker-2 Ready Active 20.10.12
# 将节点降级为worker
[root@manager ~]# docker node demote worker-1
Manager worker-1 demoted in the swarm.
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
uve2jirf6duxbyl247dmy48ug * manager Ready Active Leader 20.10.12
scacp78dh13v0id9fskntjxac worker-1 Ready Active 20.10.12
itrdnclq3y3f572v1tu071yh9 worker-2 Ready Active 20.10.12
4:部署集群服务
1、在集群中创建一个nginx服务,副本数为2,映射端口80>80,镜像为nginx:alpine
[root@manager ~]# docker service create --replicas 2 --name nginx -p 80:80 nginx:alpine
y049hnkiku3no3y9jchnh04um
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
y049hnkiku3n nginx replicated 2/2 nginx:alpine *:80->80/tcp
2、列出服务的任务信息
[root@manager ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
hznur5kwqixr nginx.1 nginx:alpine worker-1 Running Running about a minute ago
xhtvulwgy4b0 nginx.2 nginx:alpine manager Running Running about a minute ago
3、使用scale命令参数弹性伸缩服务个数。
[root@manager ~]# docker service scale nginx=4
nginx scaled to 4
overall progress: 4 out of 4 tasks
1/4: running [==================================================>]
2/4: running [==================================================>]
3/4: running [==================================================>]
4/4: running [==================================================>]
verify: Service converged
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
y049hnkiku3n nginx replicated 4/4 nginx:alpine *:80->80/tcp
4、测试访问
[root@manager ~]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Fri, 04 Feb 2022 06:20:51 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 Dec 2021 18:48:00 GMT
Connection: keep-alive
ETag: "61cb5be0-267"
Accept-Ranges: bytes
5、服务镜像升级与回滚
[root@manager ~]# docker service update --image nginx:latest --update-parallelism 2 --update-delay 10s nginx
nginx
overall progress: 4 out of 4 tasks
1/4: running [==================================================>]
2/4: running [==================================================>]
3/4: running [==================================================>]
4/4: running [==================================================>]
verify: Service converged
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
y049hnkiku3n nginx replicated 4/4 nginx:latest *:80->80/tcp
–update-parallelism: 同时更新的最大任务数量
–update-delay:更新服务的时间间隔
#回滚
[root@manager ~]# docker service update --rollback nginx
nginx
rollback: manually requested rollback
overall progress: rolling back update: 4 out of 4 tasks
1/4: running [> ]
2/4: running [> ]
3/4: running [> ]
4/4: running [> ]
verify: Service converged
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
y049hnkiku3n nginx replicated 4/4 nginx:alpine *:80->80/tcp
可以看到两次的镜像有所改变
5:Docker service 命令列表
命令 描述
docker service create 创建一个新服务
docker service inspect 显示一个或多个服务的详细信息
docker service logs 获取服务或任务的日志
docker service ls 列出服务列表
docker service ps 列出一个或多个服务的任务
docker service rm 删除一个或多个服务
docker service rollback 还原对服务的更改
docker service scale 伸缩服务的数量
docker service update 更新服务