Docker Compose 配置参考

目录

Docker Compose 配置参考

1. 基本结构

2. 版本选择

3. 服务(Services)

3.1 基础配置

3.2 端口映射

3.3 环境变量

3.4 卷挂载

3.5 网络配置

3.6 健康检查

3.7 资源限制

3.8 命令和入口点

4. 网络(Networks)

4.1 自定义网络

4.2 网络别名

5. 卷(Volumes)

5.1 命名卷

5.2 卷权限

6. 配置文件扩展

6.1 多文件配置

6.2 环境变量替换

7. 常见问题及解决方案

7.1 服务启动顺序问题

7.2 数据持久化问题

7.3 环境变量管理

总结


Docker Compose 配置参考

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose.yml 文件,你可以轻松地配置多个服务、网络和卷,并一次性启动所有相关的容器。本节将详细介绍 docker-compose.yml 文件的常用配置项和最佳实践,帮助你构建高效、灵活的多容器应用。


1. 基本结构

docker-compose.yml 文件通常遵循 YAML 格式,包含三个主要部分:versionservicesnetworksvolumes。以下是一个简单的 docker-compose.yml 文件示例:

 

Yaml

深色版本

version: '3.8'  # 指定 Docker Compose 文件版本

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    networks:
      - webnet

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - webnet

networks:
  webnet:

volumes:
  db_data:

2. 版本选择

Docker Compose 支持多个版本的文件格式,每个版本都有不同的功能和语法。建议使用最新的稳定版本(如 3.8),以确保兼容性和性能优化。不同版本之间的差异可以通过 官方文档 查看。

  • 版本 3.x:适用于大多数场景,支持多主机部署、资源限制、健康检查等功能。
  • 版本 2.x:较旧的版本,主要用于单主机部署,不支持某些高级功能。
 

Yaml

深色版本

version: '3.8'

3. 服务(Services)

servicesdocker-compose.yml 文件的核心部分,用于定义应用程序中的各个服务。每个服务可以指定镜像、端口映射、环境变量、依赖关系等。

3.1 基础配置
  • image:指定要使用的 Docker 镜像。

     Yaml 

    深色版本

    image: nginx:latest
  • build:如果需要从本地构建镜像,可以使用 build 指令指定 Dockerfile 的路径或上下文。

     Yaml 

    深色版本

    build:
      context: ./app
      dockerfile: Dockerfile
  • container_name:为容器指定一个自定义名称,默认情况下容器名称为 项目名_服务名_编号

     Yaml 

    深色版本

    container_name: my_web_container
  • depends_on:指定服务之间的依赖关系,确保某些服务在其他服务之前启动。

     Yaml 

    深色版本

    depends_on:
      - db

    注意depends_on 只控制启动顺序,不会等待服务完全就绪。如果需要确保服务在启动时已经准备好,建议使用健康检查(healthcheck)。

3.2 端口映射
  • ports:将主机端口映射到容器端口,格式为 主机端口:容器端口

     Yaml 

    深色版本

    ports:
      - "8080:80"
  • expose:仅在内部网络中暴露端口,不映射到主机。

     Yaml 

    深色版本

    expose:
      - "80"
3.3 环境变量
  • environment:设置环境变量,可以在服务之间传递配置信息。

     Yaml 

    深色版本

    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mydb
  • env_file:从外部文件加载环境变量,适合管理大量环境变量。

     Yaml 

    深色版本

    env_file:
      - .env
3.4 卷挂载
  • volumes:将主机目录或命名卷挂载到容器中,方便数据持久化或共享文件。

     Yaml 

    深色版本

    volumes:
      - ./data:/var/lib/postgresql/data  # 主机目录挂载
      - db_data:/var/lib/postgresql/data  # 命名卷挂载
  • tmpfs:将临时文件系统挂载到容器中,适合存储临时数据。

     Yaml 

    深色版本

    tmpfs:
      - /run
      - /tmp
3.5 网络配置
  • networks:指定服务所属的网络,方便服务之间的通信。

     Yaml 

    深色版本

    networks:
      - webnet
  • extra_hosts:为容器添加额外的主机名解析。

     Yaml 

    深色版本

    extra_hosts:
      - "myhost:127.0.0.1"
3.6 健康检查
  • healthcheck:定义健康检查命令,确保服务在启动后处于健康状态。

     Yaml 

    深色版本

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3
3.7 资源限制
  • deploy:设置资源限制和重启策略,适用于 Swarm 模式下的服务。

     Yaml 

    深色版本

    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
3.8 命令和入口点
  • command:覆盖镜像中的默认命令。

     Yaml 

    深色版本

    command: ["python", "app.py"]
  • entrypoint:设置固定的入口点命令,通常与 command 结合使用。

     Yaml 

    深色版本

    entrypoint: ["./entrypoint.sh"]

4. 网络(Networks)

networks 用于定义自定义网络,方便服务之间的通信。Docker Compose 默认会为每个项目创建一个桥接网络,但你可以根据需要定义多个网络。

4.1 自定义网络
  • driver:指定网络驱动类型(如 bridgeoverlay 等)。

     Yaml 

    深色版本

    networks:
      webnet:
        driver: bridge
  • external:使用外部网络,适合与现有网络集成。

     Yaml 

    深色版本

    networks:
      webnet:
        external: true
4.2 网络别名
  • aliases:为服务在网络中设置别名,方便服务之间的 DNS 解析。

     Yaml 

    深色版本

    services:
      web:
        networks:
          webnet:
            aliases:
              - webserver

5. 卷(Volumes)

volumes 用于定义命名卷,方便数据持久化和共享。命名卷由 Docker 管理,具有更好的性能和隔离性。

5.1 命名卷
  • driver:指定卷驱动类型(如 localnfs 等)。

     Yaml 

    深色版本

    volumes:
      db_data:
        driver: local
  • external:使用外部卷,适合与现有卷集成。

     Yaml 

    深色版本

    volumes:
      db_data:
        external: true
5.2 卷权限
  • permissions:设置卷的权限模式,确保容器对挂载目录有正确的读写权限。

     Yaml 

    深色版本

    volumes:
      db_data:
        driver: local
        driver_opts:
          type: none
          o: bind
          device: /path/to/host/dir
        permissions: "0777"

6. 配置文件扩展

Docker Compose 支持通过 extends 或多个 docker-compose.yml 文件来扩展配置。这有助于在不同环境中复用相同的配置,同时根据需要进行定制。

6.1 多文件配置

你可以使用多个 docker-compose.yml 文件来分隔不同环境的配置。例如,docker-compose.override.yml 文件可以覆盖 docker-compose.yml 中的默认配置。

 

Bash

深色版本

docker-compose -f docker-compose.yml -f docker-compose.override.yml up
6.2 环境变量替换

Docker Compose 支持通过环境变量替换配置文件中的值。你可以在 .env 文件中定义环境变量,并在 docker-compose.yml 中使用 ${VARIABLE} 语法引用它们。

 

Yaml

深色版本

services:
  web:
    image: ${WEB_IMAGE:-nginx:latest}
    ports:
      - "${WEB_PORT:-8080}:80"

7. 常见问题及解决方案
7.1 服务启动顺序问题

如果你发现某些服务在依赖的服务未准备好时启动失败,可以使用 depends_on 结合 healthcheck 来确保服务按顺序启动并处于健康状态。

 

Yaml

深色版本

services:
  db:
    image: postgres:13
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

  web:
    image: myapp
    depends_on:
      db:
        condition: service_healthy
7.2 数据持久化问题

为了确保数据在容器重启后不会丢失,建议使用命名卷来挂载数据库或其他需要持久化的数据目录。

 

Yaml

深色版本

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

volumes:
  db_data:
7.3 环境变量管理

对于敏感信息(如 API 密钥、数据库密码等),建议使用 .env 文件或 Docker Secrets 来管理,避免将敏感信息硬编码到 docker-compose.yml 文件中。

 

Yaml

深色版本

services:
  web:
    environment:
      - DATABASE_URL=${DATABASE_URL}
      - SECRET_KEY=${SECRET_KEY}

# .env 文件
DATABASE_URL=postgres://user:password@db:5432/mydb
SECRET_KEY=mysecretkey

总结

通过合理配置 docker-compose.yml 文件,你可以轻松管理和部署多容器应用。遵循最佳实践,如使用命名卷、健康检查、环境变量管理等,可以帮助你构建高效、灵活且易于维护的应用架构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值