Skip to content

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 myweb

Secret 与 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 / rm

Swarm vs Kubernetes ​

维度Docker SwarmKubernetes
学习成本低(复用 Docker 概念)高
功能深度中等极深
生态较小庞大(Helm/Operator/CRD)
适用规模中小集群任意规模

需要高级调度、弹性、生态集成时,建议直接上 Kubernetes(见 Kubernetes)。Swarm 适合快速落地与边缘场景。

最佳实践 ​

  1. Manager 节点奇数个(3/5),跨可用区部署避免脑裂。
  2. 用 Stack + Compose 文件声明式管理,而非手动 service create。
  3. 敏感信息一律走 secret,不进环境变量/镜像。
  4. 配置滚动更新策略(update_config)实现零停机发布。
  5. 监控组件用 mode: global 每节点部署,并正确挂载宿主机目录。