Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Docker Compose 核心概念

一、Docker Compose 是什么(一句话本质)

Docker Compose 是一个“单机级”的多容器编排工具,用声明式 YAML 把一组相关容器当成一个应用来管理。

关键词:

  • 单机(single-host)
  • 多容器(multi-container)
  • 声明式(declarative)
  • 应用级(application-level)

二、Compose 解决了什么问题(Why)

1️⃣ 多容器协作复杂

一个真实应用通常包含:

  • Web
  • API
  • DB
  • Cache
  • MQ

如果用 docker run:

  • 顺序难控制
  • 网络难配置
  • 参数冗长
  • 不可复现

Compose 用 一个文件 描述 整个应用拓扑。

2️⃣ 开发 / 测试环境难以复刻

Compose 可以:

  • 一键启动整个系统
  • 环境一致
  • 新人上手快

3️⃣ 生命周期管理混乱

Compose 把多个容器当成:

一个逻辑应用(project)

三、Compose 在 Docker 体系中的位置(Where)

Docker Engine   ← 容器运行
Docker Compose  ← 应用编排(单机)
Kubernetes      ← 集群编排(多机)
  • 📌 Compose 不是 Docker 的替代品
  • 📌 Compose 不做调度、不做高可用、不做自愈

四、Compose 的核心抽象模型(What)

1️⃣ Project(项目)

Project = 一组相关联的服务(services)

  • 默认 project 名:

  • 当前目录名

  • 也可以指定:

    docker compose -p myapp up
    

📌 Project 是 Compose 的 最大作用域。

2️⃣ Service(服务)

Service 是容器的逻辑模板,不是容器本身。

一个 service 可以:

  • 创建 1 个或多个容器(scale)
  • 共享网络
  • 共享 volume

示例:

services:
  web:
    image: nginx

3️⃣ Container(容器)

由 service 实例化而来

命名规则:

<project>_<service>_<index>

例如:

myapp_web_1

4️⃣ Network(网络)

Compose 自动创建网络:

<project>_default

特点:

  • 基于 bridge
  • DNS 自动解析 service 名
  • 容器间可直连

📌 service 名 = DNS 名

5️⃣ Volume(数据卷)

Compose 定义 volume:

  • 持久化数据
  • 跨容器共享

五、Compose 文件的本质(YAML 是什么)

docker-compose.yml 是一个“应用声明”,不是执行脚本。

  • 描述“我想要什么状态”
  • Compose 会把当前状态 -> 目标状态

📌 与 Kubernetes 思想高度一致。

六、Compose 的核心运行机制(How)

启动流程

docker compose up
解析 docker-compose.yml
创建 project
创建 network
创建 volume
创建并启动 containers

停止流程

docker compose down
停止容器
删除容器
删除网络
(默认不删 volume)

七、Compose 网络原理(重点)

默认网络模型

web  ----+
api  ----+----> bridge network (project_default)
db   ----+
  • 每个 service 自动加入同一个 network
  • 容器通过 service 名通信

示例:

api 连接 db:
host = db
port = 5432

📌 不需要暴露端口给宿主机。

端口映射 vs 服务通信

场景 是否需要 ports
容器之间
宿主机访问

八、Compose 存储原理

Volume 类型

1️⃣ named volume(推荐)

volumes:
  db_data:

2️⃣ bind mount

./data:/var/lib/mysql

📌 数据不应放在容器层。

九、depends_on 的真实含义(高频坑)

depends_on:
  - db

只保证启动顺序,不保证服务可用!

真正可用:

  • healthcheck + depends_on.condition
  • 应用层重试

十、Compose 的能力边界(重要)

Compose 不擅长的事:

  • 高可用
  • 自动扩缩容
  • 节点故障恢复
  • 跨宿主机调度
  • 滚动升级

👉 这些是 Kubernetes 的职责。

十一、Compose vs Kubernetes

对比 Compose Kubernetes
运行范围 单机 集群
调度
自愈
学习成本
场景 开发/测试 生产

十二、Compose 的最佳使用场景

  • ✅ 本地开发环境
  • ✅ 集成测试
  • ✅ Demo / POC
  • ✅ CI 构建阶段
  • ❌ 核心生产环境

十三、Compose v1 vs v2(基础认知)

  • v1:docker-compose(Python 实现,已废弃)
  • v2:docker compose(Go 实现,CLI 插件)

📌 推荐 只使用 v2。

十四、本质问题

Q:Compose 是不是容器编排?

✅ 是

❌ 但仅限单机

Q:Compose 网络如何通信?

✅ 内置 bridge + DNS

Q:Compose 能替代 Kubernetes 吗?

❌ 不能

十五、三句话总结

Compose 是单机级应用编排工具

Service 是容器的逻辑模板

Compose 管理的是“应用”,不是单个容器