Docker Compose 完全指南:从入门到实践

文章目录
- [Docker Compose 完全指南:从入门到实践](#Docker Compose 完全指南:从入门到实践)
-
- [一、Docker Compose 是什么?](#一、Docker Compose 是什么?)
- 二、核心概念:服务、网络、卷
- [三、为什么需要 Docker Compose?](#三、为什么需要 Docker Compose?)
-
- [痛点 1:手动操作繁琐](#痛点 1:手动操作繁琐)
- [痛点 2:依赖顺序混乱](#痛点 2:依赖顺序混乱)
- [痛点 3:环境不一致](#痛点 3:环境不一致)
- 四、如何工作?
- 五、核心配置文件:compose.yaml
- 六、常用命令速查表
- 七、典型使用场景
- [八、Docker Compose vs. Kubernetes](#八、Docker Compose vs. Kubernetes)
- 九、实用技巧与最佳实践
-
- [1. 多环境配置隔离](#1. 多环境配置隔离)
- [2. 使用 .env 管理敏感信息](#2. 使用 .env 管理敏感信息)
- [3. 健康检查与启动顺序](#3. 健康检查与启动顺序)
- [4. 资源限制](#4. 资源限制)
- [5. 调试时进入容器](#5. 调试时进入容器)
- 十、总结
当你的应用从单个容器扩展为多个相互协作的容器(Web 服务 + 数据库 + 缓存)时,手动输入一串串
docker run命令会成为噩梦。Docker Compose 正是为解决这一痛点而生的多容器编排工具。
一、Docker Compose 是什么?
Docker Compose 是 Docker 官方推出的开源工具,核心使命是:用一个 YAML 配置文件定义多容器应用,然后一条命令完成所有容器的创建、启动、停止和删除。
💡 类比理解 :
单独使用
docker run部署多容器应用,就像手工挑选乐高零件一块块拼装;Docker Compose 则是先画好"图纸",一按开关,所有积木自动组合成完整模型。
二、核心概念:服务、网络、卷
| 概念 | 说明 | 类比 |
|---|---|---|
| 服务 | 定义应用的每个组件(Web、数据库、缓存等),每个服务对应一个容器实例 | 乐高模型中的零件 |
| 网络 | 定义容器间的通信规则。Compose 为项目创建默认网络,容器通过服务名互相访问 | 零件间的连接件 |
| 卷 | 管理数据持久化,容器删除后数据不丢失 | 存放成品的展示柜 |
通过这三个抽象,Compose 可以完整描述多容器应用的拓扑结构、通信方式 和数据存储策略。
三、为什么需要 Docker Compose?
痛点 1:手动操作繁琐
一个典型 Web 应用(前端 + MySQL + Redis),不用 Compose 时你需要:
bash
docker network create mynet
docker run -d --name mysql --net mynet -e MYSQL_ROOT_PASSWORD=secret mysql:8
docker run -d --name redis --net mynet redis:7
docker build -t myweb .
docker run -d --name web --net mynet -p 8080:80 myweb
而使用 Compose,所有操作简化为一条命令:
bash
docker compose up -d
痛点 2:依赖顺序混乱
Web 容器必须在数据库启动后才能正常工作。Compose 通过 depends_on 处理启动顺序:
yaml
services:
web:
image: nginx
depends_on:
- db
db:
image: postgres
痛点 3:环境不一致
开发、测试、生产环境配置经常"水土不服"。Compose 将配置固化为代码,只需调整少量环境变量即可保证一致性。
四、如何工作?
Docker Compose 的工作流程分为三步:
- 定义 :编写
compose.yaml,声明所有服务、网络、卷。 - 构建/拉取 :执行
docker compose up,按需构建或拉取镜像。 - 启动 :根据
depends_on顺序创建并启动容器,自动加入共享网络。
底层机制亮点
- 网络自动化:每个项目生成独立的默认网络,服务名自动成为 DNS 可解析的地址。
- 配置合并:支持多个 Compose 文件叠加,后面文件的配置覆盖前面文件。
- 声明式模型 :遵循 Compose 规范,可被不同工具(如 Docker Compose、Podman)解析执行。
五、核心配置文件:compose.yaml
一个典型文件结构如下:
yaml
version: "3.8"
services:
web:
image: nginx:latest
container_name: my_web
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
networks:
my_network:
driver: bridge
| 字段 | 说明 |
|---|---|
version |
Compose 文件版本(3.x 最常用) |
services |
所有容器的声明,包含镜像、端口、卷等 |
volumes |
持久化数据卷的声明 |
networks |
自定义网络(可选,默认自动创建) |
📁 文件名说明 :官方推荐使用
compose.yaml(compose.yml亦可),但旧项目中的docker-compose.yaml依然兼容。
六、常用命令速查表
| 命令 | 说明 |
|---|---|
docker compose up -d |
后台启动所有服务 |
docker compose down |
停止并删除容器、网络(卷保留) |
docker compose ps |
列出服务状态 |
docker compose logs -f |
实时查看所有服务日志 |
docker compose stop |
停止服务(容器保留) |
docker compose start |
启动已存在的服务容器 |
docker compose config |
验证并展示最终配置 |
docker compose up --build |
重新构建镜像后启动 |
docker compose exec <service> bash |
进入指定服务的容器内执行命令 |
⚠️ 注意 :执行命令时,当前目录需包含
compose.yaml,或通过-f指定路径。
七、典型使用场景
-
本地开发环境
在笔记本上运行完整微服务栈(前端+后端+数据库+缓存),配置纳入版本控制,团队内一键拉起环境。
-
CI/CD 自动化测试
集成测试时用 Compose 拉起数据库、消息队列等依赖,测试完毕后自动销毁。
-
小型生产部署
对于单台服务器、服务数量 2~6 个、流量稳定的应用,Compose 足够胜任生产环境。
-
快速原型验证
几分钟内搭建完整架构,验证技术方案可行性。
八、Docker Compose vs. Kubernetes
| 维度 | Docker Compose | Kubernetes |
|---|---|---|
| 学习曲线 | 低,几小时上手 | 高,需理解 Pod、Service 等概念 |
| 部署目标 | 单台主机 | 集群(多台主机) |
| 自动扩缩容 | 不支持 | 原生支持(HPA) |
| 高可用 | 非原生 | 原生(多副本 + 自愈) |
| 滚动更新 | 不支持 | 原生(零停机) |
| 服务发现 | 简单 DNS(服务名) | DNS + 标签,功能更强 |
| 适用场景 | 开发、测试、单机生产 | 大规模生产环境 |
如何选择?
- 选 Docker Compose:你习惯单机端到端掌控,服务数量少且稳定,不需要自动扩缩容和滚动更新。
- 考虑 Kubernetes:你需要多节点冗余、自动扩缩容、零停机更新,或者服务规模已超过单机承载能力。
官方目前推荐在开发测试阶段继续使用 Compose,生产环境则视规模选择 Swarm 或 K8s。
九、实用技巧与最佳实践
1. 多环境配置隔离
使用 docker-compose.override.yml 自动覆盖开发环境配置(该文件会被 up 默认加载)。或者显式指定多个文件:
bash
docker compose -f compose.base.yml -f compose.prod.yml up
2. 使用 .env 管理敏感信息
在项目根目录创建 .env:
MYSQL_PASSWORD=SuperSecret123
在 Compose 文件中引用:
yaml
services:
db:
environment:
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
3. 健康检查与启动顺序
定义服务的 healthcheck,然后在 depends_on 中等待健康状态:
yaml
services:
db:
image: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
retries: 5
web:
depends_on:
db:
condition: service_healthy
4. 资源限制
防止某个容器耗尽宿主机资源:
yaml
services:
web:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
注意 :
deploy字段在docker compose up中有效,但在 Swarm 模式下行为略有不同。
5. 调试时进入容器
bash
docker compose exec web bash
十、总结
Docker Compose 的本质是将多容器应用的部署说明书用 YAML 写出来,让复杂的容器编排变得像填表格一样简单。它不是为超大规模集群而生的工具,但在开发、测试、原型验证以及小型生产场景中,它依然是当前最轻量、最直接的选择。
如果你正被手动管理多个容器的琐碎流程困扰,不妨花 15 分钟写一个 compose.yaml,体验一下"一键启动、一键清理"带来的工作流升级。
本文参考 Docker 官方文档及社区最佳实践,所有命令基于 Docker Compose V2(docker compose 子命令)编写。