Docker Swarm
# 创建集群
docker swarm init
初始化集群
输出示例:
Swarm initialized: current node (1dayw2jss8e7pseq1dxaufo7s) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0dm85ix64fa5j62hricif97kds21jj4aharkoqfuzfw22n10mc-9tlq05a1xafxnqtujj94t288k 10.0.10.131:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2
3
4
5
6
7
如果服务器有多个网卡,可以在初始化时手动指定IP:docker swarm init --advertise-addr [ip]
初始化之后,当前节点就默认成了管理节点,初始化成功后,会给出加入Swarm集群的命令信息, 默认给出的命令使用的是以Worker节点加入集群的的Token,可以通过命令获取Manager节点的命令和Token
# 获取Manager节点加入命令
docker swarm join-token manager
# 获取Worker节点加入命令
docker swarm join-token worker
2
3
4
5
6
# 查看节点
docker node ls
STATUS
列显示节点的状态Ready
: 节点已准备好接收任务。Down
: 节点不可用,可能是由于网络问题或节点宕机。Disconnected
: 节点与集群管理器失去连接。Unknown
: 节点状态未知,可能是由于网络问题或节点未响应。
AVAILABILITY
列显示节点的可用性Active
: 节点可用。Pause
: 节点已暂停,不接受新任务。Drain
: 节点已暂停,不接受新任务,并且正在停止现有任务。
设置可用性
docker node update --availability [可用性] [节点名]
MANAGER STATUS
列显示节点的管理器状态Leader
: 节点是集群的管理器领导者。Reachable
: 节点是管理器,但不是领导者。Unreachable
: 节点是管理器,但无法与其他管理器通信。
# 查看节点IP
for node in $(docker node ls -q); do
echo "Node: $node"
docker node inspect "$node" --format 'Hostname: {{ .Description.Hostname }}, IP: {{ .Status.Addr }},'
done
2
3
4
# 节点标签
给节点添加标签: docker node update --label-add [标签名]=[标签值] [节点名]
删除标签: docker node update --label-rm [标签名] [节点名]
查看节点标签:
docker node inspect --format '{{json .Spec.Labels}}' [节点名]
更新服务以添加约束条件: docker service update --constraint-add 'node.labels.role == worker' <service_name>
# 角色
Manager
:管理节点,负责集群管理,调度任务,维护集群状态Worker
:工作节点,负责运行任务
Manager
转为Worker
:docker node demote [节点名]
Worker
转为Manager
:docker node promote [节点名]
# 部署或更新服务
# 使用docker部署集群服务
创建一个服务
docker service create --name [服务名] [镜像名]
更新服务
docker service update --image [镜像名] [服务名]
扩展服务
docker service scale [服务名]=[数量]
删除服务
docker service rm [服务名]
服务列表
docker service ls
查看服务详情
docker service inspect [服务名]
查看单个服务下的具体实例
docker service ps [服务名]
docker service ps --no-trunc [服务名]
显示完整信息,如果服务启动失败,可以查看错误信息
查看服务日志
docker service logs [服务名]
重启服务
docker service update --force [服务名]
# 服务参数
--mode
指定服务的调度模式,有global和replicated两种模式--replicas
指定服务的副本数量--update-parallelism
指定更新服务时的并发数--update-delay
指定更新服务时的延迟时间--update-failure-action
指定更新服务失败时的处理方式--restart-condition
指定服务重启的条件--mount-add
指定挂载目录--limit-cpu
指定cpu限制--limit-memory
指定内存限制--constraint
指定服务部署在某个节点上
# 更新服务
更新挂载目录 docker service update --mount-add source=[目录],target=[容器目录] [服务名]
查看挂载目录
docker service inspect --format '{{json .Spec.TaskTemplate.ContainerSpec.Mounts}}' [服务名]
查看cpu和内存限制
docker service inspect --format '{{json .Spec.TaskTemplate.Resources}}' [服务名]
更新cpu和内存限制 docker service update --limit-cpu 0.5 --limit-memory 2g [服务名]
# 回滚
docker service update --rollback [服务名]
# 指定节点
通过--constraint
参数可以指定服务部署在某个节点上:
# 部署
docker service create --name [服务名] --constraint 'node.role==worker' [镜像名]
# 扩容缩容
docker service scale [服务名]=[数量] --constraint 'node.role==worker'
2
3
4
--constraint
参数可选的值有:
node.role==manager
和node.role==worker
,分别表示部署在管理节点和工作节点上node.hostname==[hostname]
,表示部署在指定主机上node.labels.[label]==[value]
,表示部署在具有指定标签的节点上
# 使用docker-compose部署集群服务
# 在docker-compose.yml文件中定义服务
配置文件例如:
version: '3.8'
services:
redis:
image: redis:alpine
deploy:
replicas: 3
placement:
constraints:
- node.role == manager
update_config:
parallelism: 2
delay: 10s
failure_action: rollback
restart_policy:
condition: on-failure
2
3
4
5
6
7
8
9
10
11
12
13
14
15
deploy参数说明:
- mode 指定服务的调度模式,有global和replicated两种模式, global表示每个节点上都运行一个实例,replicated,默认值,表示指定副本数量
- replicas 服务副本数量
- placement.constraints 指定服务的部署位置
- update_config.parallelism 指定更新服务时的并发数
- update_config.delay 指定更新服务时的延迟时间
- update_config.failure_action 指定更新服务失败时的处理方式
- restart_policy.condition 指定服务重启的条件
这里引入了stack
的概念,stack
是一组服务的集合,可以通过docker-compose.yml
文件来定义服务,然后通过docker stack deploy
命令来部署服务.
这些服务拥有一个共同的服务栈名称,可以通过docker stack
命令来管理这些服务。
创建一个服务栈
docker stack deploy -c [docker-compose.yml] [服务栈名]
,--detach=false
可以查看部署过程查看服务栈
docker stack services [服务栈名]
查看服务栈中的服务
docker stack ps [服务栈名]
删除服务栈
docker stack rm [服务栈名]
更新服务栈
docker stack deploy -c [docker-compose.yml] [服务栈名]
只有配置发生变化的服务会更新,其他服务不受影响
而对于每一个服务栈中的服务,依然可以通过docker service
命令来管理,只是服务的名称会变成服务栈名称_服务名称
的形式。
# docker-compose.yml变化
用于集群部署的docker-compose.yml文件与单机部署的文件有一些不同
主要是增加了deploy
字段,用于指定服务的部署策略。
之前设置的restart
字段也在deploy
字段中设置。
设置cpu和内存限制也在deploy
字段中设置。
deploy:
replicas: 1
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
restart_policy:
condition: on-failure
resources:
limits:
cpus: '0.5'
memory: 2g
2
3
4
5
6
7
8
9
10
11
12
# 集群网络
创建一个网络 docker network create --driver overlay [网络名]