Docker Swarm

# 创建集群

  1. 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.
1
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

1
2
3
4
5
6

# 查看节点

docker node ls

  • STATUS 列显示节点的状态

    1. Ready: 节点已准备好接收任务。

    2. Down: 节点不可用,可能是由于网络问题或节点宕机。

    3. Disconnected: 节点与集群管理器失去连接。

    4. Unknown: 节点状态未知,可能是由于网络问题或节点未响应。

  • AVAILABILITY 列显示节点的可用性

    1. Active: 节点可用。

    2. Pause: 节点已暂停,不接受新任务。

    3. Drain: 节点已暂停,不接受新任务,并且正在停止现有任务。

    设置可用性 docker node update --availability [可用性] [节点名]

  • MANAGER STATUS 列显示节点的管理器状态

    1. Leader: 节点是集群的管理器领导者。

    2. Reachable: 节点是管理器,但不是领导者。

    3. 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
1
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部署集群服务

  1. 创建一个服务 docker service create --name [服务名] [镜像名]

  2. 更新服务 docker service update --image [镜像名] [服务名]

  3. 扩展服务 docker service scale [服务名]=[数量]

  4. 删除服务 docker service rm [服务名]

  5. 服务列表 docker service ls

  6. 查看服务详情 docker service inspect [服务名]

  7. 查看单个服务下的具体实例 docker service ps [服务名]

  • docker service ps --no-trunc [服务名] 显示完整信息,如果服务启动失败,可以查看错误信息
  1. 查看服务日志 docker service logs [服务名]

  2. 重启服务 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'
1
2
3
4

--constraint参数可选的值有:

  1. node.role==managernode.role==worker,分别表示部署在管理节点和工作节点上
  2. node.hostname==[hostname],表示部署在指定主机上
  3. 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
1
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
1
2
3
4
5
6
7
8
9
10
11
12

# 集群网络

创建一个网络 docker network create --driver overlay [网络名]

上次更新: 2025/02/27, 14:40:57
最近更新
01
G1垃圾收集器的参数调优
02-23
02
内存占用过大排查
01-14
03
docker-compose笔记
01-12
更多文章>