← 返回首页
🔧

Docker Compose:多容器编排

📂 devops ⏱ 2 min 385 words

Docker Compose:多容器编排

Docker Compose简介

Docker Compose是一个用于定义和运行多容器Docker应用的工具。通过一个YAML文件配置应用的服务,然后一键创建和启动所有服务。

安装与配置

# 安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \
    -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

# V2版本(作为Docker插件)
docker compose version

docker-compose.yml详解

基本结构

version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - frontend
    depends_on:
      - app
    restart: unless-stopped

  app:
    build: ./app
    environment:
      - DB_HOST=db
      - DB_PORT=3306
    networks:
      - frontend
      - backend
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - backend

volumes:
  db_data:

networks:
  frontend:
  backend:

服务配置

services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile.prod
      args:
        NODE_ENV: production
    ports:
      - "3000:3000"
      - "3001:3001"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=mysql://db:3306/myapp
    env_file:
      - .env
    volumes:
      - ./app:/app
      - /app/node_modules
    depends_on:
      db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 1G
        reservations:
          cpus: '0.5'
          memory: 512M
    restart: unless-stopped

网络配置

自定义网络

services:
  web:
    networks:
      frontend:
        aliases:
          - web.local

  api:
    networks:
      frontend:
      backend:
        aliases:
          - api.local

  db:
    networks:
      backend:

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # 不与外部网络连接

数据卷管理

命名卷

volumes:
  db_data:
    driver: local
  redis_data:
    driver: local

绑定挂载

services:
  app:
    volumes:
      - ./config:/app/config:ro
      - ./logs:/app/logs
      - app_data:/app/data

常用命令

# 启动所有服务
docker-compose up -d

# 后台启动并自动重建
docker-compose up -d --build

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f
docker-compose logs -f web

# 停止服务
docker-compose down

# 停止并删除数据卷
docker-compose down -v

# 扩展服务
docker-compose up -d --scale web=3

# 执行一次性命令
docker-compose run --rm app python manage.py migrate

环境配置

环境变量文件

# .env文件
DB_ROOT_PASSWORD=rootpass
DB_NAME=myapp
REDIS_PASSWORD=redispw
APP_SECRET=mysecret
# docker-compose.yml引用
services:
  db:
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}

多环境配置

# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

实践:完整Web应用栈

# docker-compose.yml
version: '3.8'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
    depends_on:
      - app
    networks:
      - frontend
    restart: unless-stopped

  app:
    build: ./app
    environment:
      - DB_HOST=mysql
      - REDIS_HOST=redis
    networks:
      - frontend
      - backend
    depends_on:
      mysql:
        condition: service_healthy
    restart: unless-stopped

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
      MYSQL_DATABASE: myapp
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - backend
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    secrets:
      - db_root_password
    restart: unless-stopped

  redis:
    image: redis:alpine
    command: redis-server --requirepass ${REDIS_PASSWORD}
    volumes:
      - redis_data:/data
    networks:
      - backend
    restart: unless-stopped

volumes:
  mysql_data:
  redis_data:

networks:
  frontend:
  backend:
    internal: true

secrets:
  db_root_password:
    file: ./secrets/db_root_password.txt

性能优化

# 使用BuildKit构建
DOCKER_BUILDKIT=1 docker-compose build

# 并行构建
docker-compose build --parallel

# 使用缓存
docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1

故障排查

# 查看服务日志
docker-compose logs --tail=100 web

# 检查服务配置
docker-compose config

# 进入容器调试
docker-compose exec web sh

# 检查网络
docker network ls
docker network inspect myapp_frontend

总结

Docker Compose是开发和测试环境中编排多容器应用的理想工具。掌握Compose的配置和使用,可以快速搭建复杂的开发环境。