Docker Compose 是什么
一句话总结
Docker Compose 用一份 YAML 文件定义多个容器的关系(谁连谁、谁依赖谁、谁用什么端口),然后一条命令全部启动。
🤔 为什么会有它 / 解决了什么问题
Docker 本身只管理单个容器(docker run xxx)。但真实应用往往需要多个容器配合:一个 Web 服务 + 一个数据库 + 一个 Redis + 一个任务队列。Docker Compose 让你用 docker-compose.yml 描述这个”容器群”的整体拓扑,避免每次手动拼 --link -v -p 等一堆参数。
🔍 具体原理 / 运作逻辑
Compose 解析 YAML 文件中定义的 services(每个 service = 一个容器或其副本)、networks(容器间的虚拟网络)、volumes(持久化数据卷),然后按依赖顺序启动容器。启动后所有容器加入同一个默认网络,可以通过 service 名称互相访问(内置 DNS 解析)。
更硬核的技术细节(点击展开)
Docker Compose 底层通过 Docker Engine API 创建和管理容器。V2 版本已经集成到 Docker CLI 中(
docker compose而不是docker-compose独立二进制)。Compose file 目前规范是 v3,支持deploy块与 Docker Swarm 集成实现服务伸缩。但 Compose 本质是单机编排——虽然 Swarm 支持多机,实际生产多机场景更多人选择 K8s。
🧭 什么情况下会用到
- 本地开发时需要同时启动数据库、缓存、消息队列等多个依赖服务
- 部署一个由多个容器组成的应用(如我们的 Frappe Press:11 个容器在一个 compose file 里)
- CI/CD 中跑集成测试时一键拉起依赖服务
🛠️ 怎么上手 / 在哪操作
写 docker-compose.yml → docker compose up -d 启动 → docker compose logs -f 看日志 → docker compose down 停止。Press 部署的 docker-compose.yml 定义了 backend、frontend、Redis×3、MariaDB、Nginx 等 11 个服务。
⚖️ 副作用 / 代价 / 取舍
- 单机限定:Compose 不能跨多台服务器编排容器(那是 K8s 的领域)
- “Docker Compose 就是生产部署方案”是个常见陷阱——没有自愈、没有自动扩缩容、没有滚动更新
docker compose down -v会删除所有卷(包括数据库数据),是 Press 当前架构最大的脆弱点
🕰️ 来历
- 谁提出/创造的:Docker Inc.(原名 Fig,由 Orchard Labs 开发,Docker 收购后改名为 Compose)
- 什么时候出现的:Fig 2013 年发布 → 2014 年 Docker 收购 → 更名为 Docker Compose
🔗 关联 / 经常一起出现的概念
- Docker:Compose 管”多容器编排”,Docker 管”单容器生命周期”。两者是互补K8srnetes]]**:生产环境的多机容器编排方案,比 Compose 复杂十倍但也强大十倍。Akash Network 在 K8s 之上构建去中心化算力市场。
- Dockerfile:定义单个容器怎么构建。Compose 把多个 Dockerfile 产出的镜像组装成完整应用。
⚠️ 注意事项 / 常见误区
docker compose down -v 会删除 volumes 块中定义的所有数据卷(包括数据库内容)。Press 部署中 press-db-data 和 press-sites 两个卷包含所有生产数据,误操作 = 全站丢失。备份策略必须独立于 Compose。
📎 记忆锚点
像宜家家具的装配说明书——Docker 是每块木板(单容器),Compose 是说清哪块板接哪块、用几号螺丝的那张纸(容器拓扑定义)。
📝 更新日志
| 日期 | 改动 | 原因 |
|---|---|---|
| 2026-07-14 | 首次创建 | - |