Docker编排与集群实战:Compose/Swarm/K8s指南
Docker 编排与集群实战指南
一、Docker Compose:简化多容器应用管理
1. 多容器应用定义(docker-compose.yml)
Docker Compose 通过 YAML 文件定义多容器应用的架构。一个典型的 docker-compose.yml
包含以下关键部分:
version: '3.8'
services:
webapp:
image: my-webapp:latest
ports:
- "8080:80"
volumes:
- ./app:/var/www/html
environment:
- DB_HOST=db
db:
image: postgres:13
volumes:
- db_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=secret
volumes:
db_data:
实践建议:
- 使用
version: '3.8'
以获得最新功能支持 - 服务命名采用小写和下划线组合(如
redis_cache
) - 优先使用命名卷而非匿名卷
2. 服务依赖管理(depends_on)
控制服务启动顺序的两种方式:
services:
web:
depends_on:
- db
- redis
db:
image: postgres
redis:
image: redis
注意:depends_on
仅控制启动顺序,不保证服务就绪。对于需要等待服务完全可用的场景,建议:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
3. 环境变量与配置文件(.env)
.env
文件用于集中管理环境变量:
# .env 文件示例
DB_USER=admin
DB_PASS=secret123
TZ=Asia/Shanghai
在 docker-compose.yml
中引用:
environment:
- DB_USER=${DB_USER}
- DB_PASS=${DB_PASS}
安全提示:
- 将
.env
加入.gitignore
- 敏感信息建议使用 Docker Secrets
二、Docker Swarm:原生集群解决方案
1. 集群部署(Manager/Worker 节点)
初始化 Swarm 集群:
# 在第一个节点上初始化
docker swarm init --advertise-addr <MANAGER_IP>
# 添加工作节点
docker swarm join --token <TOKEN> <MANAGER_IP>:2377
查看节点状态:
docker node ls
集群架构示例:
2. 服务(Service)与副本(Replica)
创建服务:
docker service create --name web --replicas 3 -p 80:80 nginx
动态扩缩容:
docker service scale web=5
更新服务:
docker service update --image nginx:1.21 web
最佳实践:
- 生产环境至少部署 3 个 Manager 节点
- 使用
--update-delay
控制滚动更新间隔 - 结合
--restart-condition
配置重启策略
三、Kubernetes 集成
1. Docker 作为 Kubernetes 的容器运行时
Kubernetes 架构中 Docker 的角色:
版本注意:
- Kubernetes v1.20+ 开始逐步弃用 Docker
- 替代方案:containerd 或 CRI-O
2. Pod 与 Docker 容器的关系
一个 Pod 可能包含多个 Docker 容器:
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: nginx
image: nginx
- name: log-collector
image: fluentd
关键区别:
- Pod 是 Kubernetes 最小调度单位
- 同一 Pod 的容器共享网络和存储命名空间
- Docker Compose 的 "service" ≈ Kubernetes 的 "Deployment"
四、编排工具对比
特性 | Docker Compose | Docker Swarm | Kubernetes |
---|---|---|---|
适用场景 | 开发环境 | 中小型生产 | 大规模生产 |
学习曲线 | 低 | 中 | 高 |
服务发现 | 容器名称 | DNS轮询 | 强大DNS服务 |
自动扩缩容 | 不支持 | 有限支持 | 完整支持 |
社区生态 | 完善 | 一般 | 极其丰富 |
五、实战建议
开发阶段:
- 使用 Compose 的
--profile
功能管理不同环境 - 利用
docker-compose watch
实现代码热更新(Docker Desktop 4.8+)
- 使用 Compose 的
生产部署:
# Swarm 部署最佳实践 docker stack deploy -c docker-compose.prod.yml myapp # 查看服务状态 docker service ps myapp_web
迁移到 Kubernetes:
- 使用
kompose convert
将 Compose 文件转为 K8s 资源 - 逐步迁移,从无状态服务开始
- 使用
监控方案:
# Swarm 集群监控 docker stats $(docker ps -q) # 使用 cAdvisor + Prometheus + Grafana 完整方案
常见问题排查
Q1:Compose 服务启动顺序问题?
A:使用 healthcheck
结合 depends_on
的 condition
属性
Q2:Swarm 服务无法跨节点通信?
A:确保 overlay
网络正确创建:
docker network create --driver overlay my-net
Q3:Kubernetes Pod 一直处于 Pending 状态?
A:检查节点资源是否充足:
kubectl describe pod <pod-name>
通过合理选择编排工具,可以显著提升容器化应用的部署效率和可靠性。建议从 Docker Compose 开始,逐步过渡到 Swarm 或 Kubernetes 以适应不同规模的业务需求。