docker-compose.yml 是 Docker Compose 的配置文件,用于定义和管理多容器应用的配置。它支持多种参数,用于指定服务的镜像、端口、环境变量、卷、网络、依赖关系等。以下是一个详细的 docker-compose.yml 参数说明,以及一个包含常用配置的完整示例。
1. docker-compose.yml 中的主要参数
以下是 docker-compose.yml 文件中常用的顶层字段和参数,按功能分类:
顶层字段
version:
- 指定 Docker Compose 文件格式的版本(例如
"3.8" 或 "3")。版本决定了支持的语法和功能。
- 示例:
version: "3.8"
- 备注:最新版本建议使用
"3.8" 或更高(截至 2025 年),具体取决于 Docker Compose 版本。
services:
networks:
volumes:
configs 和 secrets:
服务级字段(services.<service_name> 下)
每个服务可以包含以下常用参数:
image:
- 指定容器使用的镜像(例如
nginx:latest)。可以是 Docker Hub 或私有仓库的镜像。
- 示例:
image: dokploy/dokploy:latest
build:
container_name:
- 自定义容器名称(默认是
项目名_服务名_编号)。
- 示例:
container_name: my-web
ports:
- 映射主机和容器的端口,支持
HOST:CONTAINER 格式或单独指定。
- 示例:
ports: ["80:80", "443:443"]
environment:
env_file:
- 指定外部文件加载环境变量(例如
.env)。
- 示例:
env_file: .env
volumes:
networks:
- 指定服务连接的网络,可以是默认或自定义网络。
- 示例:
networks: [my-network]
depends_on:
- 定义服务启动顺序,表示当前服务依赖其他服务。
- 示例:
depends_on: [db]
- 备注:仅控制启动顺序,不保证服务完全就绪。
restart:
- 定义容器重启策略(
no, always, on-failure, unless-stopped)。
- 示例:
restart: always
command:
- 覆盖容器启动时的默认命令。
- 示例:
command: ["nginx", "-g", "daemon off;"]
entrypoint:
- 覆盖容器默认的入口点。
- 示例:
entrypoint: /bin/bash
healthcheck:
labels:
- 为容器添加元数据标签。
- 示例:
labels: { com.example.description: "Web server" }
deploy (主要用于 Swarm 模式):
logging:
secrets 和 configs:
- 引用顶层定义的
secrets 或 configs,将敏感数据挂载到容器。
- 示例:
secrets: [db-password]
网络级字段(networks.<network_name> 下)
driver:
- 指定网络驱动(如
bridge, overlay, host)。
- 示例:
driver: bridge
external:
- 指定使用外部创建的网络。
- 示例:
external: true
name:
- 自定义网络名称。
- 示例:
name: my-custom-network
卷级字段(volumes.<volume_name> 下)
driver:
- 指定卷驱动(如
local)。
- 示例:
driver: local
external:
- 指定使用外部创建的卷。
- 示例:
external: true
2. 完整的 docker-compose.yml 示例
以下是一个包含常见配置的完整 docker-compose.yml 示例,涵盖服务、环境变量、卷、网络等:
version: "3.8"
services:
web:
image: nginx:latest
container_name: web-server
ports:
- "80:80"
- "443:443"
environment:
- NGINX_PORT=80
- APP_ENV=${APP_ENV}
env_file:
- .env
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- web-data:/var/www/html
networks:
- app-network
depends_on:
- app
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
labels:
com.example.description: "Web server"
app:
build:
context: .
dockerfile: Dockerfile
container_name: app-server
environment:
- DB_HOST=db
- DB_USER=${DB_USER}
env_file:
- .env
volumes:
- app-data:/app/data
networks:
- app-network
depends_on:
db:
condition: service_healthy
restart: on-failure
deploy: # Swarm 模式下使用
replicas: 2
resources:
limits:
cpus: "0.5"
memory: 512M
db:
image: mysql:8.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: myapp
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
restart: unless-stopped
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
secrets:
- db-password
networks:
app-network:
driver: bridge
name: my-app-network
volumes:
web-data:
driver: local
app-data:
driver: local
db-data:
driver: local
secrets:
db-password:
file: ./db-password.txt
对应的 .env 文件示例:
APP_ENV=production
DB_USER=myuser
DB_ROOT_PASSWORD=secretpassword
3. 说明与注意事项
- 版本选择:使用最新版本(如
"3.8")以支持更多功能。检查 Docker Compose 版本兼容性(docker-compose --version)。
- 环境变量:
- 在
.env 中定义变量,通过 ${VARIABLE_NAME} 在 docker-compose.yml 中引用。
- 使用
env_file 指定额外的环境变量文件。
- 网络:
- 默认情况下,Compose 创建一个桥接网络,服务可相互通信。
- 自定义网络(如
app-network)可以更好地隔离服务。
- 卷:
- 使用命名卷(如
db-data)确保数据持久化。
- 外部卷(
external: true)需要事先用 docker volume create 创建。
- Swarm 模式:
deploy 字段仅在 Swarm 模式下生效,适合集群环境。
- Compose 文件在单机和 Swarm 模式下大多兼容,但某些字段(如
deploy)仅限 Swarm。
- 验证配置:
- 使用
docker compose config 检查 docker-compose.yml 的语法和解析结果。
- 运行
docker compose up -d 后,用 docker compose ps 查看服务状态。
4. 与问题背景的关联
- 如果你修改了
.env 文件中的变量(如 APP_ENV 或 DB_ROOT_PASSWORD),运行 docker compose up -d 即可应用变化,Compose 会重启受影响的容器(如 web 或 db),无需 docker compose down。
- 如果修改了
docker-compose.yml 中的其他参数(如 ports、volumes),行为类似,up -d 通常足够。
- 如果需要清理资源或强制重置(如网络或卷变化),可先运行
docker compose down。
5. 总结
docker-compose.yml 支持丰富的配置参数,涵盖镜像、端口、环境变量、卷、网络等,适合定义复杂的多容器应用。上述示例展示了常见参数的用法,适用于大多数场景。根据你的需求(如更新 .env 或其他配置),通常直接运行 docker compose up -d 即可,无需 down,除非需要完全重置状态。
如果需要更具体的配置建议或针对某参数的解释,请提供更多细节!