Docker Swarm
Docker Swarm 是 Docker 的原生集群管理工具。本文将详细介绍 Docker Swarm 的概念、架构、配置方法和最佳实践。
Swarm 基础概念
什么是 Docker Swarm?
Docker Swarm 是 Docker 的原生集群管理和编排工具,它允许 IT 管理员和开发人员在多个 Docker 主机上创建和管理容器集群。
Swarm 的主要特性
- 集群管理集成:使用 Docker Engine CLI 管理集群
- 分散式设计:采用分散式设计,无单点故障
- 声明式服务模型:声明所需的服务状态
- 服务扩展:支持服务的动态扩展
- 状态协调:自动协调服务状态
- 多主机网络:支持多主机网络
- 服务发现:内置服务发现机制
- 负载均衡:内置负载均衡功能
- 安全通信:节点间的安全通信
- 滚动更新:支持服务的滚动更新
Swarm 架构
节点类型
管理节点(Manager Nodes)
- 维护集群状态
- 调度服务
- 提供 Swarm API
工作节点(Worker Nodes)
- 执行容器
- 不参与集群管理决策
- 只执行管理节点分配的任务
服务和任务
服务(Services)
- 定义要在管理节点或工作节点上运行的任务
- 是集群的中心结构
任务(Tasks)
- 服务的执行单元
- 每个任务代表一个容器实例
Swarm 集群管理
初始化 Swarm
bash
# 初始化 Swarm 集群
docker swarm init --advertise-addr <MANAGER-IP>
# 查看加入命令
docker swarm join-token worker # 获取工作节点加入命令
docker swarm join-token manager # 获取管理节点加入命令节点管理
bash
# 列出节点
docker node ls
# 查看节点详细信息
docker node inspect <NODE-ID>
# 提升节点为管理节点
docker node promote <NODE-ID>
# 降级管理节点为工作节点
docker node demote <NODE-ID>
# 删除节点
docker node rm <NODE-ID>
# 更新节点
docker node update --availability drain <NODE-ID>标签和约束
bash
# 添加节点标签
docker node update --label-add region=us-east <NODE-ID>
# 使用标签约束部署服务
docker service create \
--constraint 'node.labels.region==us-east' \
nginx服务管理
创建服务
bash
# 创建基本服务
docker service create --name my-web nginx
# 创建带有复制数量的服务
docker service create \
--name my-web \
--replicas 3 \
nginx
# 创建带有配置的服务
docker service create \
--name my-web \
--publish 80:80 \
--replicas 3 \
--mount type=volume,source=my-vol,target=/app \
--env MYSQL_ROOT_PASSWORD=secret \
nginx服务管理命令
bash
# 列出服务
docker service ls
# 查看服务详情
docker service inspect my-web
# 查看服务日志
docker service logs my-web
# 查看服务任务
docker service ps my-web
# 更新服务
docker service update \
--image nginx:1.21 \
--update-parallelism 2 \
--update-delay 20s \
my-web
# 扩展服务
docker service scale my-web=5
# 删除服务
docker service rm my-web服务配置
bash
# 配置更新策略
docker service create \
--name my-web \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action rollback \
nginx
# 配置重启策略
docker service create \
--name my-web \
--restart-condition any \
--restart-delay 5s \
--restart-max-attempts 3 \
nginx
# 配置资源限制
docker service create \
--name my-web \
--limit-cpu 0.5 \
--limit-memory 512M \
nginx网络管理
创建覆盖网络
bash
# 创建覆盖网络
docker network create \
--driver overlay \
--attachable \
my-network
# 创建加密的覆盖网络
docker network create \
--driver overlay \
--opt encrypted \
my-secure-network服务网络配置
bash
# 将服务连接到网络
docker service create \
--name my-web \
--network my-network \
nginx
# 将服务连接到多个网络
docker service create \
--name my-web \
--network frontend \
--network backend \
nginx数据管理
配置管理
bash
# 创建配置
docker config create nginx.conf nginx.conf
# 使用配置
docker service create \
--name my-web \
--config source=nginx.conf,target=/etc/nginx/nginx.conf \
nginx密钥管理
bash
# 创建密钥
docker secret create my-secret secret.txt
# 使用密钥
docker service create \
--name my-web \
--secret my-secret \
nginx高可用性配置
管理节点高可用
bash
# 配置管理节点
docker swarm init --advertise-addr <MANAGER1-IP>
# 添加额外的管理节点
docker swarm join --token <MANAGER-TOKEN> <MANAGER1-IP>:2377
# 配置管理节点仲裁
docker swarm update --task-history-limit 5备份和恢复
bash
# 备份 Swarm 状态
tar -zvcf swarm-backup.tar.gz /var/lib/docker/swarm/
# 恢复 Swarm 状态
tar -zxvf swarm-backup.tar.gz -C /var/lib/docker/swarm/监控和日志
服务监控
bash
# 查看服务状态
docker service ps my-web
# 查看服务日志
docker service logs my-web
# 查看节点资源使用
docker node inspect <NODE-ID>使用外部监控工具
yaml
# docker-compose.yml for monitoring
version: '3.8'
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
depends_on:
- prometheus安全配置
TLS 配置
bash
# 创建 CA 和证书
docker swarm init --external-ca防火墙配置
需要开放的端口:
- TCP 2377:集群管理通信
- TCP/UDP 7946:节点间通信
- UDP 4789:覆盖网络流量
bash
# 配置防火墙规则
ufw allow 2377/tcp
ufw allow 7946/tcp
ufw allow 7946/udp
ufw allow 4789/udp生产环境最佳实践
1. 高可用性配置
bash
# 使用奇数个管理节点(推荐3或5个)
docker swarm init
docker swarm join-token manager # 添加其他管理节点2. 服务部署策略
bash
# 使用更新策略
docker service create \
--name my-web \
--replicas 3 \
--update-parallelism 1 \
--update-delay 30s \
--update-failure-action rollback \
nginx3. 资源管理
bash
# 设置资源限制
docker service create \
--name my-web \
--limit-cpu 0.5 \
--limit-memory 512M \
--reserve-cpu 0.2 \
--reserve-memory 256M \
nginx4. 网络隔离
bash
# 创建隔离的网络
docker network create --driver overlay --internal backend5. 日志管理
bash
# 配置日志驱动
docker service create \
--name my-web \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx故障排查
常见问题解决
- 节点通信问题
bash
# 检查节点状态
docker node ls
# 检查网络连接
docker network inspect ingress- 服务部署问题
bash
# 检查服务状态
docker service ps --no-trunc my-web
# 查看详细日志
docker service logs my-web- 网络问题
bash
# 检查网络连接
docker network inspect overlay-network
# 测试容器间通信
docker exec -it container1 ping container2实际应用案例
1. Web 应用部署
yaml
version: '3.8'
services:
web:
image: nginx
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- frontend
api:
image: api-service
deploy:
replicas: 2
networks:
- frontend
- backend
db:
image: postgres
deploy:
placement:
constraints:
- node.role == worker
networks:
- backend
volumes:
- db-data:/var/lib/postgresql/data
networks:
frontend:
backend:
driver: overlay
internal: true
volumes:
db-data:2. 负载均衡配置
bash
# 创建负载均衡服务
docker service create \
--name lb \
--publish 80:80 \
--network frontend \
nginx
# 配置 DNS 轮询
docker service create \
--name web \
--replicas 3 \
--network frontend \
--endpoint-mode dnsrr \
nginx总结
Docker Swarm 提供了强大的容器编排和集群管理功能。通过本文的学习,你应该能够:
理解 Swarm 架构
- 节点类型和角色
- 服务和任务概念
- 集群管理机制
掌握基本操作
- 集群的创建和管理
- 服务的部署和扩展
- 网络和存储配置
实施最佳实践
- 高可用性配置
- 安全性设置
- 监控和日志管理
- 故障排查方法
应用实际场景
- Web 应用部署
- 负载均衡配置
- 数据持久化
- 服务发现
在下一章中,我们将探讨 Docker 的企业实践,包括大规模部署、监控告警、持续集成等高级主题。