docker compose yml文件 常用的配置

以下是一个功能齐全的 docker-compose.yml 文件示例,包含最常用的配置项,并逐行解释其含义:

# 指定 Compose 文件格式版本(与 Docker Engine 版本相关)
version: '3.8'

# 定义所有服务(容器)
services:
  # 服务1:Web 应用
  webapp:
    # 从 Dockerfile 构建镜像(上下文路径为当前目录)
    build: 
      context: .
      dockerfile: Dockerfile
      args:
        APP_ENV: production  # 构建时传递的参数

    # 使用现有镜像(与 build 二选一)
    # image: nginx:alpine

    # 容器名称(默认生成随机名称)
    container_name: my-webapp

    # 设置环境变量
    environment:
      - NODE_ENV=production
      - DB_HOST=db

    # 从文件加载环境变量
    env_file:
      - .env

    # 端口映射(主机端口:容器端口)
    ports:
      - "8080:80"
      - "443:443"

    # 数据卷挂载
    volumes:
      - ./app:/app           # 绑定挂载(宿主机路径:容器路径)
      - static_data:/var/www  # 命名卷(需在外部 volumes 定义)

    # 依赖其他服务(先启动 db 再启动 webapp)
    depends_on:
      - db

    # 容器启动后执行的命令(覆盖 Dockerfile 中的 CMD)
    command: ["python", "app.py"]

    # 重启策略
    restart: unless-stopped

    # 网络配置
    networks:
      - frontend
      - backend

    # 资源限制
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: 512M

  # 服务2:数据库
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - pgdata:/var/lib/postgresql/data  # 持久化数据库数据
    networks:
      - backend

# 定义所有数据卷(需提前创建或自动创建)
volumes:
  static_data:  # 命名卷(Docker 自动管理路径)
  pgdata:
    driver: local  # 使用本地驱动

# 定义所有网络(默认会创建 bridge 网络)
networks:
  frontend:  # 前端网络(用于用户访问)
    driver: bridge
  backend:   # 后端网络(内部服务通信)
    driver: bridge

关键配置详解

1. version

  • 作用:指定 Compose 文件格式版本,不同版本支持的功能不同。

  • 示例:version: '3.8'(推荐使用 3.x 版本以兼容较新 Docker 功能)。

2. services

  • 作用:定义所有需要运行的容器(服务)。

  • 每个服务的关键子项:

    • build:从 Dockerfile 构建镜像。

      • context:构建上下文路径(通常为 . 表示当前目录)。

      • dockerfile:指定 Dockerfile 文件名(默认 Dockerfile)。

      • args:构建时传递的变量(对应 Dockerfile 中的 ARG)。

    • image:直接使用现有镜像(与 build 二选一)。

    • environment:设置环境变量(优先级高于 Dockerfile 的 ENV)。

    • env_file:从文件加载环境变量(每行格式 KEY=VALUE)。

    • ports:端口映射(格式 "主机端口:容器端口")。

    • volumes:挂载数据卷。

      • 绑定挂载:./host/path:/container/path(宿主机路径需存在)。

      • 命名卷:volume_name:/container/path(需在外部 volumes 定义)。

    • depends_on:控制服务启动顺序(不保证依赖服务完全就绪,仅顺序启动)。

    • networks:指定连接的网络(需在外部 networks 定义)。

    • restart:容器退出时的重启策略:

      • no(默认):不重启。

      • always:总是重启。

      • on-failure:非 0 退出时重启。

      • unless-stopped:除非手动停止,否则重启。

3. volumes

  • 作用:声明命名卷供服务使用(数据持久化)。

  • 示例:

    volumes:
      my_volume:  # 自动创建
      custom_volume:
        driver: local  # 使用本地驱动
        driver_opts:
          type: nfs    # 高级选项(如 NFS)

4. networks

  • 作用:定义自定义网络(隔离容器通信)。

  • 示例:

    networks:
      frontend:
        driver: bridge  # 默认驱动
        attachable: true  # 允许其他容器动态加入

5. deploy(仅 Swarm 模式)

  • 作用:指定部署配置(适用于 Docker Swarm)。

  • 示例:

    deploy:
      replicas: 3  # 启动 3 个副本
      resources:
        limits:
          cpus: "0.5"
          memory: 512M

常用配置速查表

配置项用途示例
build 从 Dockerfile 构建镜像 build: ./dir
ports 暴露容器端口 "80:8080"
volumes 挂载数据卷 ./data:/app/data
environment 设置环境变量 DEBUG=true
depends_on 定义服务依赖顺序 depends_on: [db]
networks 连接自定义网络 networks: [backend]
restart 容器重启策略 restart: always
command 覆盖默认启动命令 command: ["npm", "start"]

最佳实践

  1. 多环境配置:使用 docker-compose.override.yml 覆盖开发环境配置。

  2. 敏感数据:将密码等放入 .env 文件(需在 .gitignore 中排除)。

  3. 资源限制:生产环境务必设置 deploy.resources.limits 防止单个容器耗尽资源。

  4. 网络隔离:为不同服务组分配独立网络(如 frontend/backend)。

通过合理组合这些配置,可以高效管理复杂的多容器应用! 🐳

posted @ 2025-06-20 22:00  郭慕荣  阅读(308)  评论(0)    收藏  举报