以下是关于
docker-compose.yaml
文件格式及常用参数的详细介绍,结合官方文档和实际案例:
1. 基本结构
docker-compose.yaml
文件通过 YAML 格式定义服务、网络、数据卷等配置。其基本结构如下:
version: "3.x" # 指定 Compose 文件版本
services: # 定义服务(容器)
service_name1:
# 服务配置项
service_name2:
# 服务配置项
volumes: # 定义数据卷(可选)
networks: # 定义网络(可选)
2. 常用参数详解
2.1 version
- 作用:指定 Docker Compose 文件格式的版本(如
3.8
、2.4
等)。 - 示例:
version: "3.8"
- 版本兼容性:
3.x
:支持 Docker 1.13.0+,适合 Swarm 模式。2.x
:支持 Docker 1.10.0+,不支持 Swarm。1.x
:已过时,不推荐使用。
2.2 services
定义容器化服务,每个服务是一个容器实例。常用配置项如下:
2.2.1 image
- 作用:指定服务使用的镜像(可直接使用镜像名,或通过
build
构建(如果image指定的镜像不存在,就会去找build标签构建))。 - 示例:
image: nginx:latest
2.2.2 build
- 作用:指定本地 Dockerfile 路径或构建上下文,用于构建镜像。
- 示例:
build: context: ./dir # Dockerfile 所在目录 dockerfile: Dockerfile.dev # 指定 Dockerfile 名称 args: - VERSION=1.0 # 构建参数
2.2.3 ports
- 作用:映射容器端口到宿主机端口。
- 格式:
"宿主机端口:容器端口"
。 - 示例:
ports: - "80:80" - "443:8043"
2.2.4 volumes
- 作用:挂载宿主机目录到容器内,或使用命名卷。
- 格式:
宿主机路径:容器路径
卷名称:容器路径
- 示例:
volumes: - ./data:/app/data # 挂载本地目录 - my_volume:/app/logs # 使用命名卷
2.2.5 environment
/ env_file
- 作用:设置环境变量,或从
.env
文件读取。 - 示例:
environment: - MYSQL_ROOT_PASSWORD=123456 - DEBUG=on env_file: - .env
2.2.6 depends_on
- 作用:定义服务启动顺序(仅控制启动顺序,不保证服务已就绪)。
- 示例:
depends_on: - db - redis
2.2.7 networks
- 作用:配置服务使用的网络。
- 示例:
networks: - front-tier - back-tier
2.2.8 restart
- 作用:定义容器重启策略。
- 选项:
no
:不自动重启(默认)always
:始终重启on-failure
:失败时重启
- 示例:
restart: always
2.2.9 command
- 作用:覆盖容器启动命令。
- 示例:
command: ["python", "app.py"]
2.2.10 healthcheck
- 作用:定义健康检查命令。
- 示例:
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s
2.3 volumes
(顶级配置)
- 作用:定义命名卷(可跨服务共享)。
- 示例:
volumes: my_volume: driver: local
2.4 networks
(顶级配置)
- 作用:定义自定义网络。
- 示例:
networks: front-tier: driver: bridge
3. 完整示例
以下是一个部署 MySQL、Redis 和 Nginx 的 docker-compose.yaml
示例:
version: "3.8"
services:
# MySQL 服务
mysql:
image: mysql:8.0.33
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: "mydb"
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- backend
# Redis 服务
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- backend
# 后端服务
backend:
image: my-backend:latest
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "5000:5000"
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_USER=root
- DB_PASSWORD=123456
- DB_NAME=mydb
- REDIS_HOST=redis
- REDIS_PORT=6379
volumes:
- ./backend:/app
depends_on:
- mysql
- redis
networks:
- backend
# 前端服务
frontend:
image: my-frontend:latest
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "3000:3000"
volumes:
- ./frontend:/app
environment:
- VITE_API_URL=http://backend:5000
networks:
- frontend
- backend
depends_on:
- backend
# Nginx 服务
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- frontend
- backend
networks:
- frontend
- backend
volumes:
mysql_data:
redis_data:
networks:
frontend:
backend:
服务网络关系图
解释
服务/网络 | 说明 |
---|---|
backend_network | 包含 MySQL、Redis、Backend、Nginx,用于后端逻辑和数据库交互。 |
frontend_network | 包含 Frontend 和 Nginx,用于前端页面和静态资源托管。 |
MySQL / Redis | 提供数据库和缓存服务,仅连接到 backend 网络。 |
Backend | 后端服务,依赖 MySQL 和 Redis,连接到 backend 网络。 |
Frontend | 前端服务,连接到 frontend 和 backend 网络,调用 Backend API。 |
Nginx | 反向代理,连接两个网络,将请求转发到 Frontend 或 Backend。 |
4. 常用命令
命令 | 说明 |
---|---|
docker-compose up | 启动所有服务 |
docker-compose up -d | 后台启动服务 |
docker-compose down | 停止并删除容器、网络、卷 |
docker-compose logs | 查看日志 |
docker-compose ps | 列出运行中的容器 |
docker-compose build | 构建镜像 |
5. 注意事项
1. 版本兼容性:确保 version
与 Docker 版本匹配(如 3.8
需要 Docker 20.10+)。
2. 路径问题:volumes
和 build.context
的路径需使用相对路径或绝对路径。
3. 环境变量:优先级:environment
> env_file
> .env
文件。
4. 依赖管理:depends_on
仅控制启动顺序,需结合健康检查(healthcheck
)确保服务就绪。
通过合理配置 docker-compose.yaml
,可以快速定义和管理复杂的应用程序栈。