在容器化已成主流的今天,大部分人可能已经熟悉 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 startstop:停止容器,但不删除
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.ymlcompose.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=123456compose.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 都是一项必须掌握的技能。