<返回目录     Powered by claude/xia兄

第8课: Docker Compose

什么是Docker Compose?

Docker Compose是用于定义和运行多容器Docker应用的工具。通过YAML文件配置应用服务,一条命令即可启动所有服务。

安装Docker Compose

# Linux
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

# Docker Desktop自带Compose V2
docker compose version

基本结构 - compose.yml

version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - app-network

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: myapp
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  db-data:

常用命令

# 启动所有服务
docker-compose up

# 后台启动
docker-compose up -d

# 停止服务
docker-compose stop

# 停止并删除容器
docker-compose down

# 停止并删除容器、网络、数据卷
docker-compose down -v

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs

# 实时查看日志
docker-compose logs -f

# 重启服务
docker-compose restart

# 构建镜像
docker-compose build

# 构建并启动
docker-compose up --build

完整示例 - Web应用栈

version: '3.8'

services:
  # Nginx反向代理
  nginx:
    image: nginx:alpine
    container_name: my-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/html:/usr/share/nginx/html:ro
    depends_on:
      - app
    networks:
      - frontend
    restart: unless-stopped

  # Python应用
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    container_name: my-app
    environment:
      - DB_HOST=db
      - DB_PORT=3306
      - DB_USER=root
      - DB_PASSWORD=123456
      - REDIS_HOST=redis
    depends_on:
      - db
      - redis
    networks:
      - frontend
      - backend
    restart: unless-stopped

  # MySQL数据库
  db:
    image: mysql:8.0
    container_name: my-mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: myapp
      MYSQL_USER: appuser
      MYSQL_PASSWORD: apppass
    volumes:
      - mysql-data:/var/lib/mysql
      - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - backend
    restart: unless-stopped

  # Redis缓存
  redis:
    image: redis:alpine
    container_name: my-redis
    command: redis-server --appendonly yes
    volumes:
      - redis-data:/data
    networks:
      - backend
    restart: unless-stopped

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

volumes:
  mysql-data:
  redis-data:
关键配置说明:

环境变量配置

# compose.yml
services:
  app:
    image: myapp
    env_file:
      - .env
      - .env.production
    environment:
      - NODE_ENV=production
      - API_KEY=${API_KEY}

# .env文件
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=secret
API_KEY=your-api-key

构建配置

services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile.prod
      args:
        - VERSION=1.0
        - BUILD_DATE=2024-01-01
      target: production
    image: myapp:latest

健康检查

services:
  web:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

资源限制

services:
  app:
    image: myapp
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M

扩展服务

# 启动多个实例
docker-compose up -d --scale app=3

# compose.yml配置
services:
  app:
    image: myapp
    deploy:
      replicas: 3

覆盖配置

# docker-compose.yml (基础配置)
services:
  app:
    image: myapp
    environment:
      - ENV=production

# docker-compose.override.yml (开发环境覆盖)
services:
  app:
    volumes:
      - ./app:/app
    environment:
      - ENV=development
      - DEBUG=true

# 使用特定配置文件
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

实用技巧

# 只启动特定服务
docker-compose up nginx db

# 在服务中执行命令
docker-compose exec app python manage.py migrate

# 查看服务配置
docker-compose config

# 验证配置文件
docker-compose config --quiet

# 拉取所有镜像
docker-compose pull

# 删除停止的容器
docker-compose rm

最佳实践

实践练习

  1. 创建一个包含Nginx、Python应用、MySQL的compose.yml
  2. 使用环境变量配置数据库连接
  3. 添加数据卷持久化MySQL数据
  4. 配置健康检查确保服务正常运行
  5. 使用docker-compose up -d启动所有服务
  6. 测试服务间的网络连接