Docker Compose 基础配置

概述

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用程序的服务,然后使用一个命令就可以创建并启动所有服务。

docker-compose.yml 文件结构

基本结构

version: '3.8'

services:
  service_name:
    # 服务配置

volumes:
  # 卷配置

networks:
  # 网络配置

版本说明

  • version: 指定 Compose 文件格式版本
  • 常用版本:
    • 3.8: 支持 Docker Engine 19.03.0+
    • 3.7: 支持 Docker Engine 18.06.0+
    • 3.6: 支持 Docker Engine 18.02.0+

常用配置项

1. 服务配置 (services)

基本服务定义

services:
  web:
    image: nginx:latest
    container_name: my-nginx
    restart: always

使用 Dockerfile 构建

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - NODE_ENV=production

端口映射

services:
  web:
    image: nginx
    ports:
      - "80:80"          # 主机端口:容器端口
      - "443:443"
      - "8080-8090:8080-8090"  # 端口范围

环境变量

services:
  app:
    image: node:14
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
    env_file:
      - .env
      - .env.local

卷挂载

services:
  app:
    image: nginx
    volumes:
      - ./html:/usr/share/nginx/html:ro  # 只读挂载
      - ./config:/etc/nginx/conf.d
      - data_volume:/var/lib/data        # 命名卷

2. 网络配置 (networks)

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # 内部网络,不能访问外部

services:
  web:
    image: nginx
    networks:
      - frontend

  api:
    image: node:14
    networks:
      - frontend
      - backend

3. 卷配置 (volumes)

volumes:
  postgres_data:
    driver: local
  redis_data:
    external: true  # 使用外部已存在的卷

services:
  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data

4. 依赖关系

services:
  web:
    image: nginx
    depends_on:
      - api
      - db

  api:
    image: node:14
    depends_on:
      - db

  db:
    image: postgres:13

5. 重启策略

services:
  app:
    image: nginx
    restart: always        # 总是重启
    # restart: unless-stopped  # 除非手动停止
    # restart: on-failure     # 失败时重启
    # restart: no             # 不重启(默认)

完整示例

version: '3.8'

services:
  # Web 服务器
  nginx:
    image: nginx:alpine
    container_name: web-server
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./html:/usr/share/nginx/html:ro
      - ./ssl:/etc/nginx/ssl:ro
    depends_on:
      - app
    networks:
      - frontend
    restart: unless-stopped

  # 应用服务
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    container_name: node-app
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://user:password@db:5432/myapp
    volumes:
      - ./app:/usr/src/app
      - /usr/src/app/node_modules
    depends_on:
      - db
      - redis
    networks:
      - frontend
      - backend
    restart: unless-stopped

  # 数据库
  db:
    image: postgres:13-alpine
    container_name: postgres-db
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    networks:
      - backend
    restart: unless-stopped

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

# 卷定义
volumes:
  postgres_data:
    driver: local
  redis_data:
    driver: local

# 网络定义
networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true

最佳实践

1. 文件组织

  • docker-compose.yml 放在项目根目录
  • 使用 .env 文件管理环境变量
  • 将配置文件放在专门的目录中

2. 命名规范

  • 使用有意义的服务名称
  • 容器名称使用项目前缀
  • 卷和网络使用描述性名称

3. 安全考虑

  • 不要在 compose 文件中硬编码敏感信息
  • 使用 secrets 管理敏感数据
  • 限制容器权限
services:
  app:
    image: myapp
    user: "1000:1000"  # 非 root 用户
    read_only: true     # 只读文件系统
    tmpfs:
      - /tmp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE

4. 资源限制

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

常见问题

1. 端口冲突

  • 检查主机端口是否被占用
  • 使用不同的主机端口
  • 使用端口范围映射

2. 卷挂载问题

  • 确保主机路径存在
  • 检查文件权限
  • 使用绝对路径或相对路径

3. 网络连接问题

  • 确保服务在同一网络中
  • 使用服务名称进行通信
  • 检查防火墙设置

总结

Docker Compose 基础配置涵盖了服务定义、网络配置、卷管理等核心概念。掌握这些基础配置是使用 Docker Compose 的第一步,为后续的高级功能奠定基础。

通过合理的配置和最佳实践,可以构建出稳定、可维护的多容器应用程序。

powered by Gitbook© 2025 编外计划 | 最后修改: 2025-08-29 15:40:15

results matching ""

    No results matching ""