在容器化已成主流的今天,大部分人可能已经熟悉 Docker,但当需要同时管理多个容器、配置复杂参数、保证可重复部署时,Docker Compose 才是提升效率的关键武器。
理解 Docker Compose核心概念、学会编写 compose.yml、掌握常用命令,并通过三个典型场景展示如何真正"把它用起来"。
什么是 Docker Compose?
Docker Compose 是一个用于定义和运行多容器应用的工具。你只需要在一个 YAML 文件中描述:
-
有哪些容器?
-
每个容器如何构建?
-
需要哪些端口、环境变量、卷?
-
它们之间如何互联?
然后一条命令:
docker compose up -d
多容器环境瞬间启动!实现环境配置的真正"一键重现"。
为什么要使用 Docker Compose?
| 功能 | 单独执行 docker | Docker Compose |
|---|---|---|
| 启动多个容器 | 繁琐重复 | 一个命令统一管理 |
| 环境变量 | 需要手动传递 | YAML 结构化配置 |
| 网络互通 | 需要手动创建网络 | 自动创建默认网络 |
| 卷管理 | 手动 -v 挂载 | 声明式配置 |
| 项目迁移 | 复杂 | 拷贝配置即可部署 |
Docker Compose = 可复制、可维护、多容器协作的最佳实践。
Docker Compose 文件结构详解
Docker Compose 采用 compose.yml 文件,一般包含这些核心部分:
version: "3.9"
services:
web:
image: nginx:1.27
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: "123456"
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
关键配置说明
| 字段 | 作用 |
|---|---|
| services | 定义每个容器服务 |
| image | 指定要运行的镜像 |
| build | 从本地 Dockerfile 构建镜像 |
| ports | 宿主机与容器的端口映射 |
| volumes | 数据持久化或挂载目录 |
| environment | 环境变量 |
| depends_on | 设置服务启动顺序 |
| networks | 配置容器网络 |
常用 Docker Compose 命令
启动 / 停止相关命令
docker compose up
-
会创建容器
-
创建网络
-
创建卷
-
启动所有服务
常用参数:
-
-d # 后台运行(最常用)
-
--build # 重新构建镜像
作用:
启动所有服务
使用场景:
-
启动整个项目
-
重启开发环境
-
部署生产服务
docker compose down
常用参数:
-
-v # 删除 volume
-
--rmi all # 删除所有镜像
作用:
停止所有服务并删除容器、网络
使用场景:
-
清理整个项目
-
测试环境重复部署
-
重置开发环境
docker compose stop
docker compose start
-
stop:停止容器,但不删除
-
start:仅启动已有容器
使用场景:
维护容器但不删除数据时
docker compose restart
使用场景:
修改配置后快速重启服务
查看容器状态 / 日志
docker compose ps
作用:
查看当前 compose 项目所有容器状态(相当于 docker ps 的 compose 版本)
docker compose logs
常用参数:
-
-f # 实时查看日志
-
service-name # 查看某个服务日志
使用场景:
-
调试容器是否启动成功
-
查看项目运行状态
构建镜像 / 拉取镜像
docker compose build
常用参数:
-
--no-cache # 不使用缓存
-
--quiet # 静默输出
使用场景:
-
修改 Dockerfile 后重新构建
-
不用 docker build,全通过 compose 管理
docker compose pull
场景:
-
更新所有服务镜像
-
CI/CD 自动部署前
docker compose push
场景:
推送镜像到镜像仓库(CI/CD 使用)
进入容器 / 执行命令
docker compose exec SERVICE bash
场景:
-
进入某个容器的终端(首选方式)
-
调试应用、运行命令
前提:容器正在运行
docker compose run SERVICE bash
与 exec 区别:
| 命令 | 作用 |
|---|---|
| exec | 在正在运行的容器里执行 |
| run | 创建一个新容器 并执行命令 |
使用场景:
-
只想临时跑一个命令,不需要现有容器
-
数据迁移、数据库初始化脚本
查看项目文件 / 配置信息
docker compose config
场景:
-
检查 compose 文件是否语法正确
-
查看变量替换结果(env 文件)
-
调试 compose 配置时非常有用
性能相关:扩容 / 缩容
docker compose up --scale web=3 -d
作用:
扩容某个服务实例数量(比如 web 服务扩成 3 个实例)
场景:
-
微服务自动扩容
-
高并发 test 环境
清理资源
docker compose rm
场景:
-
• 删除已经停止的容器
-
• 保留 volume 和 network
docker compose down -v
场景:
-
删除所有数据卷(会丢数据)
-
开发测试环境重置
所有常用命令总结表(速查版)
| 命令 | 作用 |
|---|---|
docker compose attach |
将本地标准输入/输出/错误流附加到正在运行的服务容器 |
docker compose build |
构建或重新构建服务 |
docker compose commit |
将服务容器的更改创建为新的镜像 |
docker compose config |
解析、合并并以规范格式输出 Compose 配置 |
docker compose cp |
在服务容器和本地主机之间复制文件/文件夹 |
docker compose create |
为服务创建容器但不启动 |
docker compose down |
停止并删除容器、网络(可选卷/镜像) |
docker compose events |
接收容器的实时事件流 |
docker compose exec |
在运行中的容器内执行命令 |
docker compose export |
将服务容器的文件系统导出为 tar 包 |
docker compose images |
列出由 Compose 创建的容器所使用的镜像 |
docker compose kill |
强制停止服务容器 |
docker compose logs |
查看服务容器日志 |
docker compose ls |
列出正在运行的 Compose 项目 |
docker compose pause |
暂停服务 |
docker compose port |
查看服务端口的映射关系 |
docker compose ps |
列出容器 |
docker compose publish |
发布 Compose 应用 |
docker compose pull |
拉取服务镜像 |
docker compose push |
推送服务镜像 |
docker compose restart |
重启服务容器 |
docker compose rm |
删除已停止的服务容器 |
docker compose run |
在服务上运行一次性命令(创建新容器) |
docker compose scale |
为服务扩容或缩容 |
docker compose start |
启动已创建但未运行的容器 |
docker compose stats |
显示容器资源使用情况(类似 top) |
docker compose stop |
停止服务 |
docker compose top |
显示容器中的运行进程 |
docker compose unpause |
取消暂停服务 |
docker compose up |
创建并启动容器 |
docker compose version |
显示 Docker Compose 版本信息 |
docker compose volumes |
列出卷 |
docker compose wait |
阻塞直到服务容器退出 |
docker compose watch |
监听构建上下文变化,自动重建/刷新容器 |
实战场景 1:Nginx + PHP-FPM(经典 LNMP)
适用于本地开发、测试环境。
version: "3.9"
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./code:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
php:
image: php:8.3-fpm
volumes:
- ./code:/var/www/html
启动:
docker compose up -d
浏览器访问:
http://localhost:8080
实战场景 2:WordPress 一键部署(含 MySQL)
version: '3.9'
services:
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
ports:
- "8081:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 0MlbIYOLn2VB1JEeLlvE
depends_on:
- db
volumes:
db_data:
访问:
http://localhost:8081
真正实现 3 分钟上线一个博客系统。
实战场景 3:部署带后端的前后端项目
目录结构:
project/
frontend/
backend/
compose.yml
compose.yml:
version: "3.9"
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- backend
backend:
build: ./backend
environment:
DB_HOST: mysql
ports:
- "8000:8000"
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- db:/var/lib/mysql
volumes:
db:
开发者只需要命令:
docker compose up -d --build
即可快速进入开发。
Docker Compose 最佳实践
使用 .env 管理敏感变量
在同级目录创建 .env:
MYSQL_PASSWORD=123456
compose.yml 使用:
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
使用 profiles 管理不同环境
services:
redis:
image: redis
profiles: ["dev"]
开发启动:
docker compose --profile dev up -d
使用 healthcheck 提升稳定性
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80"]
interval: 30s
retries: 3
写在最后
早期使用的 docker-compose 命令,需要单独安装,在 2020 年之后官方逐步停止更新,并建议迁移到新版。新的命令不需要单独安装,只要安装 Docker Desktop 或新版本 Docker 即可,命令格式得到统一。
| 命令 | 来源 | 是否推荐 | 备注 |
|---|---|---|---|
docker-compose |
旧版,独立 Python 程序 | ❌ 不推荐(旧) | 二进制文件或 Python 脚本 |
docker compose |
新版,集成在 Docker CLI | ✅ 推荐(新) | 不需要单独安装 compose |
Docker Compose = 开发与部署的生产力加速器,通过一个 compose.yml 文件即可:
-
定义整个应用环境
-
保证环境一致性
-
一键启动/停止多容器服务
-
快速迁移与重建
-
简化团队协作
无论你是做开发、运维、DevOps 或自建服务,Compose 都是一项必须掌握的技能。