Docker Swarm
# 场景
需求在众多 Docker 主机中运行独立程序,程序直接无需通信。
# 概念
# Nodes 节点
# Docker node
一个 Docker 主机即为一个节点
# Manager node
- 用于管理这些 Docker 主机(节点)的节点,称作管理节点。
- 管理节点还执行维持集群所需状态所需的编排和集群管理功能。管理节点会选择一个领导者来执行编排任务。
# Worker node
工作节点接收并执行管理节点调度的任务。 默认情况下,管理器节点也作为工作节点运行服务,但可以将它们配置为仅运行管理器任务并且仅供管理器使用节点。
# Services and tasks 服务和任务
# Load balancing 负载均衡
# 常见命令
# 查看节点列表
docker node ls
# 查看节点详情
docker node inspect <node-name>
# 最佳实践
# 所有节点 - 安装 Docker
# todo
# 管理节点 - 创建集群
docker swarm init --advertise-addr <MANAGER-IP>
# docker swarm init --advertise-addr 192.168.99.100
--advertise-addr
标志将管理节点配置为将其地址发布为 192.168.99.100
。Swarm 中的其他节点必须能够通过该 IP 地址访问管理节点。
执行命令后的输出中,包含工作节点加入集群的命令。工作节点将根据 --token
的值以管理节点或工作节点的身份加入。
# 查看集群信息
docker info
# output
Containers: 2
Running: 0
Paused: 0
Stopped: 2
...snip...
Swarm: active # swarm信息
NodeID: dxn1zf6l61qsb1josjja83ngz
Is Manager: true
Managers: 1
Nodes: 1
...snip...
# 查看节点信息;节点 ID 旁边的 `*` 表示当前已连接到该节点。
docker node ls
# output
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
dxn1zf6l61qsb1josjja83ngz * manager1 Ready Active Leader
# Swarm会根据主机名(host name)来命名节点
# 工作节点 - 加入集群
将上面创建集群时输出的加入集群的命令,粘贴到工作节点
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
# 如果提示This node is already part of a swarm.则需要先退出:
# docker swarm leave
如果丢失了加入命令,可在管理节点输入以下命令,查找:
docker swarm join-token worker
# 管理节点 - 部署服务
docker service create --replicas 1 --name helloworld alpine ping docker.com
docker service create
命令创建服务。--name
标志将服务命名为helloworld
。--replicas
标志指定1
个正在运行的实例的所需状态。- 参数
alpine ping docker.com
将服务定义为执行命令ping docker.com
Alpine Linux 容器。
正在运行的服务列表
docker service ls
查看服务详细信息
docker service inspect --pretty <SERVICE-ID>
# docker service inspect --pretty helloworld
# docker service inspect helloworld # 去除--pretty,以JSON格式返回
查看哪些节点正在运行该服务
docker service ps <SERVICE-ID>
# docker service ps helloworld
# 管理节点 - 扩展服务
docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
# docker service scale helloworld=5 # 扩展helloworld到5个实例
# 管理节点 - 删除服务
docker service rm helloworld
# 检查是否已删除
docker service inspect helloworld
# 管理节点 - 滚动更新服务
创建一个 redis 服务
docker service create \
--replicas 3 \
--name redis \
--update-delay 10s \
redis:7.4.0
0u6a4s31ybk7yw2wyvtikmu50
--update-delay
标志配置服务任务或任务集更新之间的时间延迟。您可以将时间T
描述为秒数Ts
、分钟数Tm
或小时数Th
的组合。因此10m30s
表示延迟 10 分钟 30 秒。- 默认情况下,调度程序每次更新
1
个任务。你可以传递--update-parallelism
标志用于配置调度程序同时更新的最大服务任务数。 - 默认情况下,当对单个任务的更新返回
RUNNING
,调度程序会安排另一个任务进行更新,直到所有任务都更新完毕。如果在更新过程中,任何任务返回FAILED
,则 调度程序暂停更新。您可以使用docker service create
--update-failure-action
标志或docker service update
。
升级 redis 服务
docker service update --image redis:7.4.1 redis
查看滚动更新的情况
docker service ps <SERVICE-ID>
# docker service ps redis
# 管理节点 - 指定节点部署
向节点添加标签
docker node update --label-add <key>=<value> <node-name>
# docker node update --label-add role=webserver node1
# 查看节点信息
docker node inspect <node-name>
# docker node inspect node1
部署服务
docker service create --name my-service --constraint 'node.labels.role==webserver' my-image
# 可视化面板 - Portainer
# 安装
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts
上次更新: 2025/04/18, 19:09:23