免费加速镜像,付费体验更佳 — 限时低至5元

Docker Compose 参考

Docker Compose 概述

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

基本结构

一个典型的 docker-compose.yml 文件包含以下主要部分:services(服务)、networks(网络)和 volumes(数据卷)。

version: "3.8"
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=secret
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

networks:
  frontend:
  backend:

服务配置参考

构建配置

用于配置服务的构建选项

配置项说明
build指定构建上下文路径
context构建的上下文路径
dockerfile指定 Dockerfile 文件名
args构建参数

运行配置

用于配置服务的运行时选项

配置项说明
command覆盖默认命令
entrypoint覆盖默认入口点
environment设置环境变量
env_file从文件加载环境变量

网络配置

Docker Compose 允许您定义多个网络,服务可以连接到这些网络。

networks:
  frontend:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.238.0/24
  backend:
    driver: bridge

数据卷配置

数据卷用于持久化数据和共享数据。

volumes:
  db_data:
    driver: local
  cache:
    driver: local
    driver_opts:
      type: tmpfs
      device: tmpfs
      o: size=100m

完整示例

以下是一个包含多个服务、网络和数据卷的完整示例。

version: "3.8"
services:
  web:
    build: 
      context: ./web
      dockerfile: Dockerfile
    ports:
      - "80:80"
    depends_on:
      - api
    networks:
      - frontend
      - backend
    environment:
      - API_URL=http://api:3000

  api:
    build: ./api
    ports:
      - "3000:3000"
    depends_on:
      - db
      - redis
    networks:
      - backend
    environment:
      - DB_HOST=db
      - REDIS_HOST=redis

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

  redis:
    image: redis:alpine
    networks:
      - backend
    volumes:
      - redis_data:/data

volumes:
  db_data:
  redis_data:

networks:
  frontend:
  backend:

最佳实践

版本控制

将 docker-compose.yml 文件纳入版本控制系统

  • 使用 .env 文件存储敏感信息
  • 在 .gitignore 中排除 .env 文件
  • 提供 .env.example 作为模板

服务命名

采用清晰的服务命名规范

  • 使用有意义的服务名称
  • 避免使用特殊字符
  • 保持命名一致性

网络规划

合理规划网络结构

  • 按功能分离网络
  • 限制服务的网络访问
  • 使用自定义网络而不是 links

数据持久化

正确管理数据持久化

  • 使用命名卷而不是绑定挂载
  • 为重要数据配置备份策略
  • 注意数据卷的权限设置