Docker Compose 完整指南
1. Docker Compose 简介
1.1 什么是 Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用 的工具。它使用 YAML 文件 配置应用程序的所有服务(可单容器或多容器组成),支持通过简单命令一键完成服务的启动、停止、重建等操作。

1.2 为什么需要 Docker Compose
部署多容器应用时,需解决以下核心问题:
- 控制容器启动顺序(如先启动数据库,再启动依赖它的应用)
- 避免重复执行繁琐的 docker run 命令
- 统一管理容器依赖、网络、数据卷等配置
Docker Compose 通过单个 YAML 文件声明所有配置,执行 docker-compose up 即可一键部署,大幅提升多容器应用的部署效率和可维护性。
2. docker-compose.yml 文件的基本结构
2.1 版本 (version)
新版本 Docker Compose 中,version 属性已弃用(version is obsolete),可直接省略。若需兼容旧版本,可指定版本号:
plain
version: '3.8' # 可选,兼容旧版 Docker Compose
2.2 服务 (services)
services 是核心配置块,用于定义应用中的各个服务实例,每个服务对应一个或多个容器。
基础示例
plain
services:
web: # 自定义服务名称(需唯一)
image: nginx:1.26.2 # 服务使用的镜像(名称:版本)
ports:
- "80:80" # 端口映射:主机端口:容器端口
volumes:
- ./html:/usr/share/nginx/html # 目录挂载:主机目录:容器目录
networks:
- app-network # 关联的网络名称
2.2.1 核心配置关键字详解
| 关键字 | 作用 | 示例 |
|---|---|---|
| image | 指定已存在的镜像 | image: nginx:1.27.3 |
| build | 通过 Dockerfile 构建镜像 | ```yaml |
| build: | ||
| context: ./build # 构建上下文路径 | ||
| dockerfile: Dockerfile.dev # 自定义 Dockerfile 名称 | ||
| args: {BUILD_VERSION: 1.0} |
plain
| `container_name` | 自定义容器名称(唯一)| `container_name: my-nginx` |
| `restart` | 容器重启策略 | `restart: always`(可选值:no/always/on-failure/unless-stopped) |
| `depends_on` | 定义服务依赖(控制启动顺序) | `depends_on: [db, redis]` |
| `environment` | 设置环境变量 | ```yaml
environment:
- NGINX_HOST=example.com
- NGINX_PORT=8080
```|
| `env_file` | 引用外部环境变量文件 | `env_file: ./web.env`(文件内格式:`KEY=VALUE`) |
| `ports` | 端口映射(主机:容器)| `- "8080:80"`(随机端口:`- "80"`) |
| `volumes` | 数据卷挂载(持久化/共享数据) | `- ./logs:/var/log/nginx`(命名卷:`- web-data:/var/www/html`) |
| `networks` | 关联自定义网络 | `- app-network` |
> ⚠️ 注意:`depends_on` 仅保证依赖服务**先启动**,不等待依赖服务"就绪"(如数据库完全启动),需在应用内处理服务就绪检测。
### 2.3 网络 (networks)
定义应用的网络环境,实现服务间隔离或通信。
#### 配置示例
```yaml
# 声明网络(默认使用 bridge 驱动)
networks:
app-network: # 自定义网络名称
driver: bridge # 网络驱动(可选,默认 bridge)
backend-network:
# 服务关联网络
services:
web:
image: nginx:1.27.3
networks:
- app-network # 可关联多个网络
- backend-network
2.4 数据卷 (volumes)
定义数据卷,实现容器数据的持久化存储和服务间数据共享。
配置示例
plain
# 声明命名数据卷
volumes:
web-data: # 自定义数据卷名称
db-data:
# 服务挂载数据卷
services:
web:
image: nginx:1.27.3
volumes:
- web-data:/var/www/html # 命名卷挂载
- ./local-dir:/var/log/nginx # 主机目录绑定挂载
db:
image: mysql:8.0
volumes:
- db-data:/var/lib/mysql # 数据持久化
3. 常用 Docker Compose 命令
| 命令 | 作用 | 扩展用法 |
|---|---|---|
| docker-compose up | 启动所有服务(前台运行) | -d:后台运行(守护进程模式)build`:启动前重新构建镜像 |
| docker-compose down | 停止并删除容器、网络 | -v:同时删除命名数据卷 all`:删除服务使用的镜像 |
| docker-compose ps | 查看运行中的服务状态 | -a:显示所有服务(包括停止的) |
| docker-compose logs | 查看服务日志 | -f:实时跟踪日志:查看指定服务日志 |
| docker-compose stop | 停止运行中的服务(不删除容器) | ` 指定服务 |
| docker-compose start | 启动已停止的服务 | >:启动指定服务 |
| docker-compose restart | 重启服务 | >:重启指定服务 |
| docker-compose images | 列出所有服务使用的镜像 | - |
| docker-compose exec | 进入运行中的容器 | `docker-compose exec |
4. 完整 docker-compose.yml 示例(WordPress + MySQL)
4.1 配置文件
plain
version: '3.8'
services:
# WordPress 服务
wordpress:
image: wordpress:6.7.2
restart: always # 总是自动重启
ports:
- "9090:80" # 主机 9090 端口映射容器 80 端口
environment:
WORDPRESS_DB_HOST: db # 数据库服务名称(容器间通信)
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
TZ: Asia/Shanghai # 时区配置
volumes:
- ./wp-content:/var/www/html/wp-content # 主题/插件持久化
depends_on:
- db # 依赖 db 服务,启动顺序:db → wordpress
# MySQL 数据库服务
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: somewordpress # root 密码
TZ: Asia/Shanghai
volumes:
- db-data:/var/lib/mysql # 数据库数据持久化
# 声明数据卷(持久化 MySQL 数据)
volumes:
db-data:
# 默认网络(无需额外配置,服务自动加入)
networks:
default:
4.2 操作步骤
- 启动服务:
plain
docker-compose up -d # 后台启动,首次运行会下载镜像
- 访问应用:
打开浏览器访问 http://localhost:9090,进入 WordPress 安装界面。
- 修改默认语言:
安装完成后,在 WordPress 后台 → 设置 → 常规 → 站点语言,选择 "简体中文"。
- 停止服务:
plain
docker-compose down # 仅停止服务,数据保留
# docker-compose down -v # 停止服务并删除数据卷(谨慎使用)
5. 进阶使用技巧
5.1 多环境配置
通过 docker-compose -f 指定不同环境的配置文件:
- 基础配置:docker-compose.yml
- 开发环境:docker-compose.dev.yml
- 生产环境:docker-compose.prod.yml
启动命令:
plain
# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
5.2 配置复用
使用 extends 关键字复用其他 Compose 文件的服务配置:
plain
# docker-compose.base.yml
services:
web:
image: nginx:1.27.3
ports:
- "80:80"
# docker-compose.dev.yml
services:
web:
extends:
file: docker-compose.base.yml
service: web
volumes:
- ./dev-html:/usr/share/nginx/html # 开发环境额外配置