Docker Swarm Mode 是 Docker 原生提供的容器编排解决方案,它最大的特点就是"简单"。作为一个长期使用各种编排工具的老兵,我必须说 Swarm 在易用性方面确实做到了极致。想象一下,你只需要在单台机器上熟悉的 Docker 命令,现在可以直接用来管理整个集群,这种无缝过渡的体验对于运维人员来说简直是福音。
Swarm 特别适合以下场景:
提示:虽然Kubernetes现在很火,但对于80%的中小型应用来说,Swarm已经足够好用,而且学习成本只有K8s的1/10。
一个Swarm集群由两种节点组成:
| 节点类型 | 职责 | 推荐配置 |
|---|---|---|
| Manager节点 | 负责集群状态管理、任务调度和API响应 | 生产环境至少3个Manager保证高可用 |
| Worker节点 | 执行容器工作负载 | 根据应用需求动态扩展 |
在实际部署中,我通常会:
--availability drain参数控制)Service是Swarm的核心抽象概念,它定义了应用的期望状态。我最常使用的是两种服务模式:
副本服务(Replicated):指定固定数量的任务副本
bash复制docker service create --name web --replicas 5 nginx:latest
全局服务(Global):在每个符合条件的节点上运行一个任务
bash复制docker service create --name monitor --mode global prom/node-exporter
经验:对于有状态服务,一定要配合Docker Volume使用,避免数据丢失。
Swarm采用声明式API,你只需要定义"想要什么",而不是"如何实现"。比如这个创建PostgreSQL服务的命令:
bash复制docker service create \
--name postgres \
--replicas 3 \
--mount type=volume,source=pgdata,destination=/var/lib/postgresql/data \
--env POSTGRES_PASSWORD=mysecretpassword \
--network my-overlay-net \
postgres:13
这个命令背后Swarm会自动处理:
Swarm内置了DNS轮询负载均衡。假设你有名为"web"的服务:
web主机名访问这是Swarm最实用的功能之一。更新服务时:
bash复制docker service update \
--image nginx:1.21 \
--update-parallelism 2 \
--update-delay 10s \
web
这个更新过程会:
如果更新后发现问题,一键回滚:
bash复制docker service rollback web
初始化第一个Manager节点:
bash复制docker swarm init --advertise-addr <MANAGER-IP>
获取加入令牌:
bash复制# Worker加入令牌
docker swarm join-token worker
# Manager加入令牌(用于扩展管理节点)
docker swarm join-token manager
创建跨主机的虚拟网络:
bash复制docker network create -d overlay --attachable my-overlay-net
关键参数说明:
--attachable:允许独立容器连接到网络--subnet:手动指定子网(避免自动分配冲突)--opt encrypted:启用节点间通信加密Swarm默认的ingress网络处理外部流量:
bash复制docker service create \
--name web \
--publish published=8080,target=80 \
nginx:latest
这个配置会让:
适合单节点持久化:
bash复制docker service create \
--name db \
--mount type=volume,source=dbdata,destination=/var/lib/mysql \
mysql:5.7
推荐生产环境使用:
--mount type=volume,source=nfsvol,destination=/data,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:<nfs-export-path>,volume-opt=o=addr=<nfs-server-ip>查看服务详情:
bash复制docker service inspect --pretty web
查看服务日志:
bash复制docker service logs -f web
查看节点状态:
bash复制docker node ls
可能原因:
docker service logsdocker node ps <node-id>诊断步骤:
docker network lsdocker exec -it <container> ping web推荐监控栈:
global模式部署node-exporterbash复制docker swarm init --advertise-addr <ip> --default-addr-pool <cidr> --data-path-port <port> --cert-expiry 2160h
bash复制docker swarm ca --rotate
bash复制docker node update --availability drain <manager-node>
为服务设置资源约束:
bash复制docker service update \
--limit-cpu 2 \
--limit-memory 1GB \
--reserve-cpu 0.5 \
--reserve-memory 512MB \
web
关键数据备份:
bash复制docker swarm init --force-new-cluster
bash复制docker service inspect web > web-backup.json
经过多个生产环境的实践验证,Swarm在稳定性方面表现优异。我维护的一个30节点Swarm集群已经稳定运行3年,期间只因为硬件故障进行过几次节点替换,服务始终保持可用。对于不需要Kubernetes复杂功能的中小型项目,Swarm绝对是性价比最高的选择。