flag92 flag92
部署教程

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 不懂 K8sSwarm
要做 CI/CD GitOpsK8s(ArgoCD 等更成熟)

站内搜索

按 ⌘ K 随时唤起