讲解

一个应用 rarely 只有一个容器:web、数据库、缓存、worker……用 docker run 逐个管理,命令又长又容易漏网络、漏卷。Docker Compose 用一个 YAML 文件(compose.yaml)声明整个应用栈:有哪些服务(services)、用什么镜像、端口卷环境变量怎么配、要哪些网络——然后 docker compose up -d 一条命令全部拉起,docker compose down 一条命令全部拆除。它是单机多容器的事实标准,也是通往 Kubernetes 前最好的训练场。

compose 文件的核心结构就三块:services(每个服务等价于一条 docker run 的参数集合,image/build 二选一,ports/volumes/environment/depends_on 各司其职)、networks(不写则自动创建一个默认网络,所有服务都在其上、按服务名互访)、volumes(命名卷声明)。项目名(默认取目录名,-p 可指定)是所有资源的前缀,同一台机器上多个项目互不干扰。

高频命令一组:up -d(创建并后台启动,--build 强制重建镜像)、ps(本项目容器状态)、logs -f 服务名(跟踪日志)、exec 服务名 命令(进容器,比 docker exec 省前缀)、restart、down(拆除,-v 连卷一起删,慎用)、config(解析并校验 compose 文件,改完先 config 看最终形态是个好习惯)。

示例

一个最小 compose 文件:单服务 nginx,映射端口,带健康检查。yaml 块会被写入沙盒并真实启动:

# project: demo
services:
  web:
    image: nginx:1.27-alpine
    ports:
      - "18085:80"
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://127.0.0.1/"]
      interval: 5s
      timeout: 3s
      retries: 5

启动整个栈(Compose 自动建网络、按项目名前缀命名容器),等健康检查通过后访问:

curl -sf http://localhost:18085 | head -2

查看项目内的容器状态(注意 STATUS 里的 healthy):

docker compose -p ohmydocs-verify-demo -f compose.yaml ps

config 子命令:把 compose 文件解析成最终形态,改配置后先验证再 up:

docker compose -p ohmydocs-verify-demo -f compose.yaml config --quiet && echo "compose 文件合法"

常见坑

  • 老命令 docker-compose:v1(Python 版,带连字符)已停止维护;v2+ 是 docker compose 子命令(Go 版),写法紧跟在 docker 之后。
  • down -v 顺手就敲:-v 会删除命名卷,数据库数据跟着没——除非确定要重置环境,down 不加 -v。
  • 改了代码 up 没反应:Compose 不会自动重建镜像,代码进镜像的项目要 up -d --build,或开发期用卷挂载源码。
  • 项目名冲突:同名项目的资源会被互相接管/覆盖;同机多实例用 -p 或不同目录区分。

小结

compose.yaml 声明整个应用栈,up -d 一键拉起、down 一键拆除;自动网络 + 按服务名互访;config 先校验、logs/exec 看现场。下一章上实战:多服务编排。