1. 什么是 Docker Swarm
Docker Swarm 是用来管理 Docker 集群的工具,从 Docker v1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中。官方文档:Docker Swarm Official。
2. 与 Docker Compose 的异同
两者都是为了简化容器化应用程序的部署、管理扩展的工具:
- 1. 相同点:两者都是为了简化容器化应用程序的部署和管理。
- 2. 不同点:
- Docker Compose:适用于单机上的容器化应用程序编排。
- Docker Swarm:用于容器化应用程序在生产环境中的需求,提供集群管理和容器编排功能。
3. Docker Swarm 的工作原理
3.1 基本概念
- 节点 (Node):Swarm 集群中的每个 Docker 主机。
- Manager 节点:负责集群管理和控制,可以有多个,但只有一个 Leader。
- Worker 节点:接收来自 Manager 节点的任务并执行相应的容器操作。
- Raft 协议:用于选举Manager节点的Leader(至少2个Manager节点参与选举),并确保Manager节点之间的状态信息同步。
3.2 工作流程
- 集群初始化:使用
docker swarm init
初始化集群,执行该命令的主机会自动成为 Manager 节点(Leader)。 - 节点加入:其他 Docker 主机可以通过 Manager 节点提供的 token 加入集群。
- 服务定义:用户定义服务来描述容器应用程序,Manager 节点负责任务调度(任务是swarm中的最小调度单位,表现为一个单一的容器。服务是一组任务的集合且定义了任务属性)。
- 调度策略:Leader节点根据调度策略(spread-默认,binpack和random),在集群中选择合适的节点来部署容器实例。
- 容器编排:Leader节点负责对容器进行编排和管理,包括创建、启动、停止、重启容器实例等操作。
4. Swarm 集群管理
4.1 准备工作
- 2 个 Manager 节点和 2 个 Worker 节点
- Manager1:192.168.5.101,hostname=manager1
- Manager2:192.168.5.102,hostname=manager2
- Worker1:192.168.5.103,hostname=worker1
- Worker2:192.168.5.104,hostname=worker2
4.2 初始化集群
- 在 Manager1 上执行命令:
docker swarm init --advertise-addr=192.168.5.101
- 说明:参数–advertise-addr叫做广播地址。指定其他节点用来与当前节点通信的IP(端口默认2377)这一参数是可选的,当节点上有多个IP时(多网卡情况),最好指定使用哪个IP。
- 特别说明:命令执行成功后,Swarm会自动将当前节点作为Manager节点并自动生成集群的token。
- token分两类:管理token和工作token,分别用于其他的管理节点和工作节点加入集群使用。
docker swarm join-token worker #管理节点查看工作token
docker swarm join-token manager #管理节点查看管理token
4.3 加入节点
- 加入Manager2节点。Manager2上执行如下命令:
- docker swarm join --advertise-addr=Manager2的广播地址 --token 管理token Manager1广播地址:2377
- 例如:docker swarm join --advertise-addr=192.168.5.102 --token SWMTKN-1-2e40bfiw4djkimlzzfk3o88893bj69qtb5pe9shc4qlflexg6u-8yhth9a72fd5ebiiaae1qqfox 192.168.5.101:2377。
- 加入worker1、worker2节点。在对应的节点上执行如下命令:
- docker swarm join --advertise-addr=Worker的广播地址 --token 工作token Manager1广播地址:2377。
- 例如:docker swarm join --advertise-addr=192.168.5.103 --token SWMTKN-1-2e40bfiw4djkimlzzfk3o88893bj69qtb5pe9shc4qlflexg6u-6u24u39mfkvhklsv4xd4l86xe 192.168.5.101:2377。
4.4 集群解散
docker swarm leave --force # 节点退出集群,manager节点退出加--force
docker node rm 退出节点的主机名 # Manager上操作
5. 节点管理
注意:节点管理命令均在管理节点上操作,工作节点无操作权限。
5.1查看集群节点
docker node ls #查看集群所有节点
docker node inspect 节点的主机名 #查看集群指定节点
5.2节点升级和降级
docker node promote 节点的主机名 # worker升级成manager
docker node demote 节点的主机名 # manager降级成worker
5.3 节点下线
docker node update --availability drain 节点的主机名 #节点暂停接受任务
5.4节点上线
docker node update --availability active 节点的主机名 #节点重新接受任务
6. 服务管理
注意:节点管理命令均在管理节点上操作,工作节点无操作权限。
6.1 服务定义
docker service create --name 服务名 [-d] [-p] [-e] [--network] [--replicas] [--mount] image:tag
说明:
-d 代表后台运行
-p 代表端口映射
-e 代表环境变量
--network 代表使用的网络
--replicas 代表副本数量
--mount 代表文件系统挂载
image:tag 代表基础镜像和tag
6.2服务查看
docker service ls #查看集群中的所有服务
docker service ps 服务名 #查看集群中的指定服务(包含服务运行的节点)
6.3 服务移除
docker service rm服务名 #移除集群中的一个或多个服务
6.4服务模式
docker service create ... --mode replicated ...
说明:副本服务模式(默认)。在每个 node 上可以运行一个或多个副本
docker service create ... --mode global ...
说明:全局服务模式。强制在每个 node 上都运行一个副本(例如收集所有容器的日志)
6.5 服务日志
docker service logs 服务名
7. Swarm 集群的弹性伸缩
弹性伸缩就是动态的增加或减少集中某个服务的任务数目:
docker service create -d --name mydb --replicas=2 \
-p 3306:3306
-e MYSOL ROOT PASSWORD=123456 \
mysql:5.7
7.1 实现方式一
docker service update --replicas 新副本数 服务名
7.2 实现方式二
docker service scale 服务名=新副本数
8. Swarm 集群服务的滚动更新
滚动更新允许在不停止服务的情况下更新服务,也称为灰度更新。
docker service update
--image 基础镜像
--update-delay 定义滚动更新的时间间隔(默认0),单位如s、m、h,1h28m30s即1小时20分30秒
--update-parallelism 定义并行更新的最大数量(正更新的这些任务不可用)
服务名
8.1 visualizer镜像
可让Swarm的服务滚动更新实时显示在UI界面上,便于观察滚动更新的过程。
- manager1节点上执行:
docker service create \
--name=viz \
--publish=888:8080/tcp \
--constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
dockersamples/visualizer
- 访问manager1节点的viz服务:
- http://manager1节点IP:8088/
- http://192.168.5.101:8088
8.2 实验:升级MySQL服务基础镜像(v5.7 --> v8.0),由原来2个副本扩展到5个副本,每60秒扩容5个
9. Swarm中使docker compose
在Swarm上运行Docker Compose是一种将Docker Compose文件部署到Docker Swarm集群的方法。Docker Compose是一个用于定义和运行多个Docker容器的工具,而Swarm是Docker的原生容器编排和集群管理工具。
Docker Compose文件是一个YAML格式的文件,用于定义应用程序的各个服务、网络、卷等配置。通过在Swarm集群上运行Docker Compose文件,可以实现在多个主机上同时部署和管理应用程序。
- 注意:docker create service的缺点,一个命令仅能创建一个service,对于多service的应用程序而言,实属繁琐
9.1 docker compose
docker-compose.yml中有关swarm集群的属性
version: '3.8'
services:
my_service:
image: your_image_name # 替换为你的镜像名
deploy:
replicas: 2 # 服务的副本数量
mode: replicated # 服务的模式(副本模式)
placement: # 服务部署的目标节点
constraints:
- node.id==nodeid # 根据节点id部署任务
- node.hostname==nodehostname # 根据节点主机名部署任务
restart_policy: # 指定服务部署的重启策略
condition: on-failure # none不重启; on-failure容器故障时
delay: 10s # 尝试重启的时间间隔(默认5s)
max_attempts: 3 # 最多的尝试次数(默认无限制)
- 说明:docker-compose up方式会忽略 deploy 部分的内容!
9.2 docker stack
Swarm堆栈管理工具,可以结合docker-compose实现多service应用程序的部署。
官网文档:https://docs.docker.com/reference/cli/docker/stack/。
docker stack deploy -c yml文件 自定义STACK名
docker stack ls
docker stack ps 自定义STACK名
docker statck down 自定义STACK名