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

集群架构示例

图1

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 的角色:

图2

版本注意

  • 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 ComposeDocker SwarmKubernetes
适用场景开发环境中小型生产大规模生产
学习曲线
服务发现容器名称DNS轮询强大DNS服务
自动扩缩容不支持有限支持完整支持
社区生态完善一般极其丰富

五、实战建议

  1. 开发阶段

    • 使用 Compose 的 --profile 功能管理不同环境
    • 利用 docker-compose watch 实现代码热更新(Docker Desktop 4.8+)
  2. 生产部署

    # Swarm 部署最佳实践
    docker stack deploy -c docker-compose.prod.yml myapp
    
    # 查看服务状态
    docker service ps myapp_web
  3. 迁移到 Kubernetes

    • 使用 kompose convert 将 Compose 文件转为 K8s 资源
    • 逐步迁移,从无状态服务开始
  4. 监控方案

    # Swarm 集群监控
    docker stats $(docker ps -q)
    
    # 使用 cAdvisor + Prometheus + Grafana 完整方案

常见问题排查

Q1:Compose 服务启动顺序问题?
A:使用 healthcheck 结合 depends_oncondition 属性

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 以适应不同规模的业务需求。

添加新评论