主题
Docker Swarm
Docker Swarm 是 Docker 官方提供的容器编排工具,将一组 Docker 引擎组成集群,作为一个单一虚拟系统管理,实现服务的自动化部署、伸缩与负载均衡。相比 Kubernetes,Swarm 学习成本低、与 Docker CLI/Compose 无缝衔接,适合中小团队快速落地集群。
核心概念
- Manager 节点:负责集群管理、维持服务期望状态、调度任务、处理编排请求。建议奇数个(3/5)以保证 quorum。
- Worker 节点:执行 Manager 分配的任务(运行容器)。
- Service:定义在 Swarm 上运行的服务(镜像、副本数、端口、策略)。
- Task:Service 调度出的单个容器实例。
- Stack:用 Compose 文件一次性部署的一组 Service。
- Overlay 网络:跨节点的容器通信网络。
集群搭建
初始化管理节点
bash
# 单网卡可直接 init;多网卡需指定 advertise 地址
docker swarm init --advertise-addr 192.168.1.10
# 输出中包含 worker 加入令牌,manager 加入令牌用下方命令查看
docker swarm join-token worker
docker swarm join-token manager加入工作节点
在 worker 机器上执行 Manager 给出的命令:
bash
docker swarm join --token SWMTKN-1-xxx 192.168.1.10:2377节点管理
bash
docker node ls # 列出节点
docker node ps # 当前节点任务
docker node promote <id> # worker 升为 manager
docker node demote <id> # manager 降为 worker
docker node update --availability drain <id> # 排空(下线维护)
docker swarm leave --force # 节点离开集群服务与栈管理
创建服务
bash
docker service create \
--name web \
--replicas 3 \
--publish published=8080,target=80 \
--update-parallelism 1 \
--update-delay 10s \
nginx:latest扩缩容
bash
docker service scale web=5
docker service ls
docker service ps web用 Stack 部署(Compose 文件)
yaml
# stack.yml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
networks:
- webnet
networks:
webnet:bash
docker stack deploy -c stack.yml myweb
docker stack ls
docker stack services myweb
docker stack rm mywebSecret 与 Config
敏感信息(密码、证书)使用 secret,避免写进镜像或环境变量:
bash
# 从文件创建 secret
echo "my_db_password" | docker secret create db_password -
# Compose 中引用
services:
app:
image: myapp
secrets:
- db_password
secrets:
db_password:
external: true配置文件用 config:
bash
docker config create nginx_conf ./nginx.conf滚动更新与回滚
bash
# 更新镜像(逐个替换,间隔 10s)
docker service update --image myapp:v2 --update-delay 10s web
# 回滚到上一版本
docker service rollback web监控类容器挂载实战
Swarm 中运行 cAdvisor 等监控组件时,同样需要宿主机目录挂载才能采集容器指标。以 stack.yml 为例(参考天眼 Alloy 经验,容器指标三要件缺一不可):
yaml
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker:/var/lib/docker:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
deploy:
mode: global # 每节点一个,采集本机
resources:
limits:
memory: 512M
ports:
- "8080:8080"若只挂
/sys:/host/sys:ro(给 node_exporter 用)而缺/sys:/sys:ro,cAdvisor 读不到宿主机 cgroup,会报 "failed to identify the read-write layer ID",导致 docker driver 全军覆没。
常用命令汇总
bash
docker swarm init / join / leave / join-token
docker node ls / ps / promote / demote / update / rm
docker service create / ls / ps / inspect / scale / update / rollback / rm
docker stack deploy / ls / services / ps / rm
docker secret ls / create / inspect / rm
docker config ls / create / inspect / rmSwarm vs Kubernetes
| 维度 | Docker Swarm | Kubernetes |
|---|---|---|
| 学习成本 | 低(复用 Docker 概念) | 高 |
| 功能深度 | 中等 | 极深 |
| 生态 | 较小 | 庞大(Helm/Operator/CRD) |
| 适用规模 | 中小集群 | 任意规模 |
需要高级调度、弹性、生态集成时,建议直接上 Kubernetes(见 Kubernetes)。Swarm 适合快速落地与边缘场景。
最佳实践
- Manager 节点奇数个(3/5),跨可用区部署避免脑裂。
- 用 Stack + Compose 文件声明式管理,而非手动
service create。 - 敏感信息一律走 secret,不进环境变量/镜像。
- 配置滚动更新策略(
update_config)实现零停机发布。 - 监控组件用
mode: global每节点部署,并正确挂载宿主机目录。