目录
Docker Compose 配置参考
Docker Compose
是一个用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose.yml
文件,你可以轻松地配置多个服务、网络和卷,并一次性启动所有相关的容器。本节将详细介绍 docker-compose.yml
文件的常用配置项和最佳实践,帮助你构建高效、灵活的多容器应用。
1. 基本结构
docker-compose.yml
文件通常遵循 YAML 格式,包含三个主要部分:version
、services
、networks
和 volumes
。以下是一个简单的 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)
services
是 docker-compose.yml
文件的核心部分,用于定义应用程序中的各个服务。每个服务可以指定镜像、端口映射、环境变量、依赖关系等。
3.1 基础配置
-
image:指定要使用的 Docker 镜像。
深色版本
image: nginx:latest
-
build:如果需要从本地构建镜像,可以使用
build
指令指定 Dockerfile 的路径或上下文。深色版本
build: context: ./app dockerfile: Dockerfile
-
container_name:为容器指定一个自定义名称,默认情况下容器名称为
项目名_服务名_编号
。深色版本
container_name: my_web_container
-
depends_on:指定服务之间的依赖关系,确保某些服务在其他服务之前启动。
深色版本
depends_on: - db
注意:
depends_on
只控制启动顺序,不会等待服务完全就绪。如果需要确保服务在启动时已经准备好,建议使用健康检查(healthcheck
)。
3.2 端口映射
-
ports:将主机端口映射到容器端口,格式为
主机端口:容器端口
。深色版本
ports: - "8080:80"
-
expose:仅在内部网络中暴露端口,不映射到主机。
深色版本
expose: - "80"
3.3 环境变量
-
environment:设置环境变量,可以在服务之间传递配置信息。
深色版本
environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=mydb
-
env_file:从外部文件加载环境变量,适合管理大量环境变量。
深色版本
env_file: - .env
3.4 卷挂载
-
volumes:将主机目录或命名卷挂载到容器中,方便数据持久化或共享文件。
深色版本
volumes: - ./data:/var/lib/postgresql/data # 主机目录挂载 - db_data:/var/lib/postgresql/data # 命名卷挂载
-
tmpfs:将临时文件系统挂载到容器中,适合存储临时数据。
深色版本
tmpfs: - /run - /tmp
3.5 网络配置
-
networks:指定服务所属的网络,方便服务之间的通信。
深色版本
networks: - webnet
-
extra_hosts:为容器添加额外的主机名解析。
深色版本
extra_hosts: - "myhost:127.0.0.1"
3.6 健康检查
-
healthcheck:定义健康检查命令,确保服务在启动后处于健康状态。
深色版本
healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3
3.7 资源限制
-
deploy:设置资源限制和重启策略,适用于 Swarm 模式下的服务。
深色版本
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:覆盖镜像中的默认命令。
深色版本
command: ["python", "app.py"]
-
entrypoint:设置固定的入口点命令,通常与
command
结合使用。深色版本
entrypoint: ["./entrypoint.sh"]
4. 网络(Networks)
networks
用于定义自定义网络,方便服务之间的通信。Docker Compose 默认会为每个项目创建一个桥接网络,但你可以根据需要定义多个网络。
4.1 自定义网络
-
driver:指定网络驱动类型(如
bridge
、overlay
等)。深色版本
networks: webnet: driver: bridge
-
external:使用外部网络,适合与现有网络集成。
深色版本
networks: webnet: external: true
4.2 网络别名
-
aliases:为服务在网络中设置别名,方便服务之间的 DNS 解析。
深色版本
services: web: networks: webnet: aliases: - webserver
5. 卷(Volumes)
volumes
用于定义命名卷,方便数据持久化和共享。命名卷由 Docker 管理,具有更好的性能和隔离性。
5.1 命名卷
-
driver:指定卷驱动类型(如
local
、nfs
等)。深色版本
volumes: db_data: driver: local
-
external:使用外部卷,适合与现有卷集成。
深色版本
volumes: db_data: external: true
5.2 卷权限
-
permissions:设置卷的权限模式,确保容器对挂载目录有正确的读写权限。
深色版本
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
文件,你可以轻松管理和部署多容器应用。遵循最佳实践,如使用命名卷、健康检查、环境变量管理等,可以帮助你构建高效、灵活且易于维护的应用架构。