6月6日 20:29

Docker Swarm 怎么用?集群部署和运维命令

Docker Swarm 是 Docker 自带的容器编排工具——不需要额外安装,几条命令就能把多台服务器组成集群,部署高可用服务。和 Kubernetes 比,Swarm 简单得多,适合中小规模部署。

Swarm vs Kubernetes:怎么选

维度Docker SwarmKubernetes
复杂度低(几条命令)高(概念多、配置复杂)
学习成本半天几周
适用规模3-50 节点10-10000+ 节点
自动扩缩容手动自动(HPA)
自愈能力有(重启失败容器)强(多种控制器)
生态Docker 原生CNCF 全家桶

选 Swarm 的情况:团队小、服务器少、不想花时间学 K8s 选 K8s 的情况:大规模部署、需要自动扩缩容、团队有 K8s 经验

初始化集群

Manager 节点

bash
# 在第一台服务器上初始化 docker swarm init --advertise-addr 192.168.1.10 # 输出加入命令 # docker swarm join --token SWMTKN-xxx 192.168.1.10:2377

Worker 节点

bash
# 在其他服务器上执行加入命令 docker swarm join --token SWMTKN-xxx 192.168.1.10:2377

查看集群状态

bash
# 查看所有节点 docker node ls # 输出 # ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS # abc123 * node1 Ready Active Leader # def456 node2 Ready Active # ghi789 node3 Ready Active

Manager 节点负责调度和管理,Worker 节点只跑容器。Manager 也会跑容器——小集群不需要单独的管理节点。

节点管理

bash
# 标记节点角色(让某些任务只跑在特定节点) docker node update --label-add role=backend node2 docker node update --label-add role=database node3 # 排空节点(维护时把容器迁移走) docker node update --availability drain node2 # 恢复节点 docker node update --availability active node2

部署服务

基本部署

bash
# 部署一个服务,3 个副本 docker service create \ --name myapp \ --replicas 3 \ --publish 3000:3000 \ myapp:latest

Swarm 自动把 3 个副本分散到不同节点,内置负载均衡——访问任意节点的 3000 端口都会被路由到健康的副本。

使用 docker-compose 部署

yaml
# docker-compose.yml services: api: image: myapp:latest ports: - "3000:3000" deploy: replicas: 3 update_config: parallelism: 1 # 每次更新 1 个副本 delay: 10s # 间隔 10 秒 failure_action: rollback # 失败自动回滚 rollback_config: parallelism: 0 # 回滚时一次全部替换 restart_policy: condition: on-failure delay: 5s max_attempts: 3 resources: limits: cpus: '1.0' memory: 2G redis: image: redis:7 deploy: replicas: 1 placement: constraints: - node.role == manager # 只跑在 manager 节点 postgres: image: postgres:16 volumes: - pg_data:/var/lib/postgresql/data deploy: replicas: 1 placement: constraints: - node.labels.role == database # 只跑在标记了 database 的节点 volumes: pg_data:
bash
# 部署 docker stack deploy -c docker-compose.yml myapp # 查看服务 docker service ls # 查看某个服务的副本 docker service ps myapp_api

滚动更新

bash
# 更新镜像版本 docker service update --image myapp:v2.0 myapp_api # 查看更新进度 docker service ps myapp_api

update_config 控制更新策略:

  • parallelism: 1 每次只更新 1 个副本
  • delay: 10s 每个副本更新后等 10 秒再更新下一个
  • failure_action: rollback 新版本启动失败时自动回滚到旧版本

手动回滚

bash
# 回滚到上一版本 docker service rollback myapp_api

Overlay 网络:跨主机通信

Swarm 模式下的 Overlay 网络让不同主机上的容器直接通信:

bash
# 创建 Overlay 网络 docker network create -d overlay my-net
yaml
services: api: networks: - my-net redis: networks: - my-net networks: my-net: external: true

api 容器在 node1,redis 在 node2——通过 redis:6379 直接访问,和单机体验一样。

配置和敏感信息

Config(非敏感配置)

bash
# 创建配置 echo "server.port=8080" | docker config create app_config -
yaml
services: api: configs: - source: app_config target: /app/config.properties configs: app_config: external: true

Secret(敏感信息)

bash
# 创建 Secret echo "db_password_123" | docker secret create db_password -
yaml
services: api: secrets: - db_password secrets: db_password: external: true

Secret 在容器内挂载为 /run/secrets/db_password,只有容器内可读,不会出现在 docker inspect 里。

常用运维命令

bash
# 查看服务日志 docker service logs myapp_api # 扩缩容 docker service scale myapp_api=5 # 查看服务详情 docker service inspect myapp_api # 删除服务 docker service rm myapp_api # 删除整个 Stack docker stack rm myapp # 查看集群事件 docker events --filter type=service

什么时候该从 Swarm 迁移到 K8s

  • 需要自动扩缩容(HPA)
  • 需要 CronJob(定时任务)
  • 需要 Ingress 控制器(7 层路由)
  • 需要 Pod 级别的健康检查
  • 集群超过 50 个节点

在以上需求出现之前,Swarm 够用且省心。

标签:Docker