Docker Swarm教程
doc: https://docs.docker.com/engine/swarm/
# 基础概念
- Docker Swarm是Docker的集群管理工具,它提供了标准的Docker API,所有任何已经与Docker守护程序通信的工具都可以使用Swarm轻松地扩展到多个主机
- Docker Swarm就是用来管理Docker集群的,但是现在基本上使用的很少,一般都是用的K8S
# 运行原理
Swarm集群由多个运行在swarm mode的docker主机组成,docker主机分为管理节点(manager)和工作节点(work node)两种类型
管理节点(manager):负责整个集群的管理工作包括集群配置、服务管理,服务的创建和调度等
工作节点(work node):负责运行相应的服务来执行任务(运行容器服务)
manager节点也可以运行的容器服务,但是一般不这么做,只是让它管理work node
Swarm集群的优点:
在线修改Service的配置,包括networks和volumes,不需要重启docker服务
可以将其它standalone模式的docker主机加入到Swarm集群(Standalone模式简单点说就是 manager 和 work 的一种管理关系模式)
在Docker Swarm中有几个基本概念:nodes、Service、tasks、load balancing
# 1. nodes
Node是加入到Swarm集群中的Docker实例,即是一个docker节点,包含上面说的【管理节点(manager)和工作节点(work node)】
在部署应用到Swarm集群的时候,会向管理节点提交service定义,管理节点会将这些这些work也就是tasks分发到work节点中
Work节点接收并执行管理节点分配的任务,work节点也会将当前tasks的状态通知到管理节点以维护节点的状态信息。
管理节点(manager node)
- Manager节点主要通过raft算法实现整个集群和运行的service的内部状态维护,Docker官方建议一个集群最好使用基数manager节点数(最大使用7个manager节点)保证可用性 ,Manager节点主要工作是完成以下tasks:
- 维护cluster state
- scheduling服务
- service swarm mode集群服务
- Manager节点主要通过raft算法实现整个集群和运行的service的内部状态维护,Docker官方建议一个集群最好使用基数manager节点数(最大使用7个manager节点)保证可用性 ,Manager节点主要工作是完成以下tasks:
工作节点(work node)
Work节点是容器实际运行的实例节点,在默认情况下manager节点也是work节点,而且在在Swarm集群中必须存在manager节点
manager节点状态、信息的同步根据Raft consensus group(Raft一致性算法)的网络进行通信同步的,而worker之间的通信依靠的是Gossip network通信协议实现的。
管理节点与工作节点的切换
在多节点的Swarm集群中,节点有两种模式:【Active模式,Drain模式】。
Swarm调度不会将任务分配到Drain模式,只会在Active模式的节点上分配任务。因此可以将manager节点设置为Drain模式(避免调度任务运行在manager节点,manager指做管理)
docker node promote: 命令可以修改节点模式,将worker节点变为manager节点,也可以将manager节点转换为worker节点。
# 2. Service 与 tasks
Service是manage和work节点上执行的task的定义,创建service的时候可以指定使用哪个container image以及执行的命令
当Service部署到Swarm集群的时候,swarm管理节点会将service为标准(container image以及执行的命令),然后将service调度到集群的节点上,以一个或多个tasks执行,这些nodes上运行的tasks之间是相互独立的。
在replicated service模式下,swarm管理节点会根据desired state中设置的scale分发replica tasks
在globalservice模式,swarm集群会向每个可用的节点运行tasks
如上service中有三个replicas tasks,每个实例是Swarm集群中的一个task
Task是Swarm集群中调度的最小单元,当创建或更新service时候给定了desired state,集群会调度tasks来实现这种理想状态
Task是一种单向机制,它整个周期过程中会完成一系列的状态(assigned、prepared和running等),tasks运行失败集群会remove这个tasks并创建新的tasks来替代。
# 3 load balancing
负载均衡:Swarm集群使用ingress loading balancing提供集群服务,Swarm集群会自动为service分配PublishedPort,默认使用30000-32767范围
# 安装部署
# 1. 准备工作
官方地址 https://docs.docker.com/engine/swarm/
添加私服仓库地址
由于官方镜像下载比较慢,由于网络原因可能拉取不下来,而集群的每个节点都需要安装镜像,所以使用私有仓库会快很多,当然也可以不使用私有仓库,直接自己下载上传。
#编辑配置文件 vi /etc/docker/daemon.json #增加仓库配置信息 # 在daemon.json中添加以下 key,保存退出。此步用于让 docker 信任私有仓库地址 {"insecure-registries":["192.168.242.130:5000"]} #重新加载docker配置 systemctl daemon-reload #重启docker systemctl restart docker
1
2
3
4
5
6
7
8
9
10
11
# 2. docker-swarm安装
这里模拟安装集群,以三个节点搭建集群在加上一个Harbor节点,节点信息如下
节点 | Ip | 说明 |
---|---|---|
manager-01 | 192.168.242.131 | swarm-manager 节点 |
work-01 | 192.168.242.132 | swarm-work节点 |
work-02 | 192.168.242.133 | swarm-work节点 |
harbor | 192.168.242.130 | harbor 私服 |
安装上述配置,克隆出相应的虚拟机,其中harbor之前已经存在,这里用之前的,所以一共克隆出三个服务器
查看网络情况
docker network ls
1初始化manager管理节点
初始化manager管理节点
#这里使用192.168.242.131这台主机作为manager 所以以下命令在192.168.242.131上执行 端口默认是2377 docker swarm init --advertise-addr 192.168.242.131:2377 --listen-addr 192.168.242.131:2377 # --advertise-addr 指定其他节点连接manager时的地址 # --listen-addr 监控swarm集群manager的IP和端口
1
2
3
4执行上面命令后,就会初始化swarm集群,并且会告诉我们如何增加wrok 节点和manager节点
再次查看网络情况
#集群初始化后会新增集群网络 docker network ls
1
2查看节点
docker node ls
1新加一个work节点
通过上面初始化manager返回的命令,给集群加入新的节点,只需要在对应的主机上执行该命令即可
docker swarm join --token your-token 192.168.242.131:2377
1
重新获取token
#获取一个worker加入集群的token docker swarm join-token worker
1
2新加一个manager节点
一个集群要有多个manager节点,上面加入了work节点,接下来在集群中加入一个manager节点,加入方式一样的,先获取manager的token
获取manager节点的token
#获取一个manager加入集群的token ,这个命令要在之前的那个manager 192.168.242.131 上执行 docker swarm join-token manager
1
2加入集群: 这里就用 192.168.242.133 这个主机作为一个manager加入集群
# 3. swarm节点说明
swarm集群中,只有manager节点可以执行swarm命令(比如docker node ls),work节点会报错,因为只有manager节点才可以管理集群,执行集群相关的命令
work 节点只是不能执行swarm的集群命令,但是docker本身的命令是可以执行的,比如docker ps等
可以分别在manager和node中查看节点的swarm信息,对比差异
docker info
1在使用docker node ls 命令查看集群的节点信息的时候,有两列需要注意一下:AVAILABILITY,MANAGER STATUS
Leader:该节点是集群管理和编排决策的主要管理器节点。
Reachable:该节点是管理者节点正在参与Raft选举。如果Leader节点不可用,则该节点有资格被选为新领导者。
Unavailable:该节点属于不能与其他manager通信的manager。如果manager节点不可用,可以将它加入群集,或者将工作器节点升级为管理器。
Active:调度程序可以将任务分配给当前节点。
Pause:调度程序不会将新任务分配给当前节点,但现有任务仍在运行。
Drain:调度程序不会向当前节点分配新任务。调度程序关闭所有现有任务并在可用节点上重新调度这些任务。
AVAILABILITY: 决定当前节点可用性,是否用于运容器,它有三个值;
改变节点的可用性(availability)
docker node update --availability drain 节点Id/名称
1MANAGER STATUS
表示manger节点的状态,work节点为空,它也有三个状态值
# 4. 集群节点管理
节点权限提升/降低
节点manager和work两种,他们的权限不一样,我们可以手动的对节点权限提升/降低,也是将manager降级为work,将work升级为manager节点
升级降级的命令都要在manager节点执行。
将work升级为manager节点
#将worker节点提升为manager节点,在manager节点执行如下命令: docker node promote 节点名称|节点ID
1
2
将manager降级为work
将manager节点降低为worker节点,在manager节点执行如下命令: docker node demote 节点名称|节点ID docker node ls
1
2
3work脱离集群
#在要脱离集群的节点上使用一下命令, 主动离开集群,让节点处于down状态,才能删除 docker swarm leave #指向完后,等一会在manager节点使用命令:docker node ls 就会发现该节点已经脱离集群管理
1
2
3删除脱离集群的节点
docker node rm 节点名称|节点ID
1manager脱离集群
manager节点不能脱离集群,使用docker swarm leave会报错。
manager节点不能脱离集群,只能强制退出,manager退出后意味着整个swarm 不复存在。
#manager节点强制退出 docker swarm leave --force
1
2
# 5. Docker-swarm 命令汇
swarm命令汇总
命令 描述 docker swarm init 初始化一个 swarm 群集 docker swarm join 加入群集作为节点或管理器 docker swarm join-token 管理用于加入群集的令牌 docker swarm leave 离开 swarm 群集 docker swarm unlock 解锁 swarm 群集 docker swarm unlock-key 管理解锁钥匙 docker swarm update 更新 swarm 群集 node命令汇总
命令 描述 docker node demote 从 swarm 群集管理器中降级一个或多个节点 docker node promote 将一个或多个节点推入到群集管理器中(也就是升级节点) docker node inspect 显示一个或多个节点的详细信息 docker node ls 列出 swarm 群集中的节点 docker node ps 列出在一个或多个节点上运行的任务,默认为当前节点 docker node rm 从 swarm 群集删除一个或多个节点 docker node update 更新一个节点
# 图形界面
docker-swarm的图形界面需要安装在manager节点上,不然无法操作节点
#docker官网地址 https://hub.docker.com/r/dockersamples/visualizer
1
2拉取镜像
docker pull dockersamples/visualizer:latest
1运行镜像
# /var/run/docker.sock 是必须要的挂载目录 HOST是指定Ip,需要是manager节点的Ip docker run -itd --name visualizer -p 8099:8080 -e HOST=192.168.198.131 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock 192.168.242.130:5000/edwinedu/dockersamples/visualizer:latest
1
2访问图形界面
http://192.168.242.131:8099/
1