Docker原生的容器编排平台,将多个Docker主机集群化为一个虚拟系统,实现高可用和弹性扩展。
容器编排 是指自动化容器的部署、管理、扩展和网络连接的流程。在微服务架构中,通常需要运行多个容器实例,编排工具帮助管理这些容器的生命周期。
Docker Swarm是Docker官方提供的容器编排工具,内置在Docker引擎中,无需额外安装。
主要编排功能包括:
Swarm集群中的Docker主机,分为管理节点和工作节点。
要执行的任务的定义,包括使用的镜像、副本数量、网络配置等。
服务调度的原子单位,一个任务对应一个运行的容器。
Overlay网络实现跨主机容器通信,ingress网络处理外部流量。
数据卷和配置对象,用于持久化存储和配置管理。
管理节点负责集群管理任务,维护集群状态,调度服务,并充当集群的HTTP API端点。
工作节点接收并执行从管理节点调度的任务,运行实际的容器工作负载。
在第一台机器上初始化Swarm,创建管理节点
添加更多管理节点以实现高可用
添加工作节点以扩展计算能力
在集群中部署和管理服务
# 在第一个节点上初始化Swarm(管理节点)
docker swarm init --advertise-addr <MANAGER-IP>
# 输出示例:
# Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
#
# To add a worker to this swarm, run the following command:
#
# docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.99.100:2377
#
# To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# 获取添加工作节点的令牌
docker swarm join-token worker
# 获取添加管理节点的令牌
docker swarm join-token manager
# 在工作节点上运行加入命令
docker swarm join --token <WORKER-TOKEN> <MANAGER-IP>:2377
# 在管理节点上运行加入命令
docker swarm join --token <MANAGER-TOKEN> <MANAGER-IP>:2377
# 查看所有节点
docker node ls
# 查看节点详情
docker node inspect <NODE-ID>
# 查看服务列表
docker service ls
# 查看服务详情
docker service inspect <SERVICE-NAME>
# 创建简单服务
docker service create --name web --replicas 3 -p 80:80 nginx
# 创建服务并指定网络
docker service create --name api --network my-network --replicas 5 my-api:latest
# 创建全局服务(每个节点运行一个实例)
docker service create --name global-app --mode global nginx
# 扩展服务副本数量
docker service scale web=5
# 或者使用update命令
docker service update --replicas 10 web
# 缩减服务副本数量
docker service scale web=2
# 更新服务镜像
docker service update --image my-app:2.0 web
# 滚动更新配置
docker service update \
--update-parallelism 2 \
--update-delay 10s \
--image my-app:2.0 \
web
# 回滚到上一个版本
docker service update --rollback web
Overlay网络允许不同节点上的容器相互通信,就像它们在同一个网络上一样。
# 创建Overlay网络
docker network create -d overlay my-overlay-net
# 在服务中使用Overlay网络
docker service create \
--name my-service \
--network my-overlay-net \
--replicas 3 \
my-app:latest
Ingress网络是特殊的Overlay网络,用于处理从外部到Swarm服务的流量。
# 发布服务端口(自动使用Ingress网络)
docker service create \
--name web \
--publish published=80,target=80 \
--replicas 3 \
nginx
Stack允许使用Compose文件在Swarm集群中部署完整的应用程序栈。
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- target: 80
published: 80
protocol: tcp
mode: ingress
deploy:
replicas: 3
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
resources:
limits:
cpus: '0.50'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints:
- node.role == manager
networks:
- webnet
networks:
webnet:
# 部署Stack
docker stack deploy -c docker-compose.yml myapp
# 查看Stack服务
docker stack services myapp
# 查看Stack详情
docker stack ps myapp
# 删除Stack
docker stack rm myapp
| 特性 | Docker Swarm | Kubernetes | Docker Compose |
|---|---|---|---|
| 学习曲线 | 简单 | 陡峭 | 简单 |
| 集群规模 | 中小型 | 大型 | 单机 |
| 安装复杂度 | 低(内置) | 高 | 低 |
| 高可用性 | 内置 | 内置 | 无 |
| 自动伸缩 | 基础 | 高级 | 无 |
| 服务发现 | 内置DNS | 内置DNS | 容器名称 |
| 适用场景 | 简单集群 | 企业级 | 开发测试 |
在生产环境中部署奇数个管理节点(3或5个),确保集群管理的高可用性。
为服务设置适当的资源限制和预留,防止单个服务消耗过多资源影响其他服务。
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
为服务配置适当的健康检查,确保Swarm能够正确检测服务状态并进行故障恢复。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
配置适当的滚动更新策略,确保服务更新过程中保持可用性。
deploy:
update_config:
parallelism: 2
delay: 10s
order: start-first
failure_action: rollback
使用节点标签和服务约束控制服务调度,确保服务运行在合适的节点上。
# 为节点添加标签
docker node update --label-add disk=ssd node1
# 在服务中使用节点约束
docker service create \
--name cache \
--constraint node.labels.disk==ssd \
redis:alpine
问题描述: 工作节点无法加入Swarm集群。
解决方案:
# 检查Docker守护进程日志
journalctl -u docker
# 重新生成加入令牌
docker swarm join-token worker
# 检查防火墙规则
sudo ufw status
问题描述: 同一Swarm集群中的服务无法通过服务名称相互访问。
解决方案:
# 检查服务网络配置
docker service inspect --format='{\{.Spec.TaskTemplate.Networks}}' service-name
# 测试服务间DNS解析
docker exec -it container-name nslookup service-name
# 创建共享的Overlay网络
docker network create -d overlay shared-net
问题描述: Swarm管理节点故障导致集群管理功能受影响。
解决方案:
# 查看当前集群状态
docker node ls
# 提升工作节点为管理节点
docker node promote worker-node-name
# 从集群中移除故障节点
docker node rm failed-node-name
# 备份Swarm配置
docker swarm init --force-new-cluster
恭喜!您已经掌握了Docker Swarm容器编排的核心知识。现在可以构建和管理高可用的容器化应用程序集群。