Docker Swarm 多机集群:K8s 的轻量替代
当 3-5 台机器需要联动但又不想上 K8s,Docker Swarm 是甜蜜点。本文给出 init、加节点、滚动升级的完整流程。
Docker Swarm (3-10 节点) 90 分钟
为什么仍值得考虑 Swarm#
Swarm 在 2024 年被 Docker 官方「淡化」但仍然维护。它的甜蜜点:
- 3-10 台机器,想要负载均衡 + 滚动升级 + 服务发现
- 团队不熟 K8s
- 用 docker-compose.yml 直接跑(加少量 deploy 字段)
初始化集群#
# 第一台机器(manager)
docker swarm init --advertise-addr <PUBLIC_IP>
# 输出会给一个 join token,在其他机器跑:
docker swarm join --token <TOKEN> <MANAGER_IP>:2377
部署 Stack#
把 docker-compose.yml 加上 deploy 字段:
version: '3.8'
services:
chatwoot-rails:
image: chatwoot/chatwoot:v4.x
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
order: start-first
restart_policy:
condition: on-failure
networks: [ai-support]
secrets: [chatwoot_env]
postgres:
image: postgres:16
deploy:
placement:
constraints: [node.labels.role == db]
volumes:
- pg-data:/var/lib/postgresql/data
networks:
ai-support:
driver: overlay
secrets:
chatwoot_env:
external: true
部署:
docker stack deploy -c stack.yml ai-support
关键概念#
| 概念 | 说明 |
|---|---|
| Service | 一个长期运行的容器组 |
| Replica | 每个 Service 跑多少份 |
| Overlay Network | 跨节点的内部网络 |
| Secret | 加密存储的敏感信息 |
| Placement Constraint | 限制服务跑在哪些节点 |
滚动升级#
docker service update --image chatwoot/chatwoot:v4.5.1 ai-support_chatwoot-rails
update_config.order: start-first 保证新版本先起来才停旧版本,零停机。
监控#
# 全栈状态
docker service ls
# 看某服务任务
docker service ps ai-support_chatwoot-rails
# 实时日志
docker service logs -f ai-support_chatwoot-rails
加 Prometheus + cAdvisor + Grafana 上仪表盘。
Swarm vs K8s 选择#
| 场景 | 推荐 |
|---|---|
| 3-10 台机器 | Swarm |
| > 20 节点 / 多团队 | K8s |
| 需要 Helm / Operator 生态 | K8s |
| 团队懂 Docker 不懂 K8s | Swarm |
| 要做 CI/CD GitOps | K8s(ArgoCD 等更成熟) |