docker-compose.yml 是应用的“施工图”,核心字段包括 version(需匹配 docker 版本)、services(必含 image 或 build)、ports(格式为“宿主机:容器”)、depends_on(配合 healthcheck 实现真正就绪等待)、volumes(区分命名卷与绑定挂载)及环境变量外置(.env 文件)。

直接用 docker compose up 就能启动一整套服务,不用记一堆 docker run 参数,也不用反复调试网络和挂载路径——Docker Compose 的核心价值就在这里。
写对 docker-compose.yml 是第一步
这个 YAML 文件就是整个应用的“施工图”。它不复杂,但几处细节容易出错:
-
version 字段必须匹配 Docker Engine 版本:比如你用的是 Docker 24.x,推荐用
version: '3.8'或'2.4';盲目写'3.9'可能报错 -
services 下每个服务至少要定义 image 或 build:本地开发常用
build: ./backend,生产环境多用image: nginx:alpine -
端口映射格式是 "宿主机:容器":写成
"8080:8080"没问题,但别写成"8080-8081:8080"——除非你真需要端口范围映射 -
服务名就是容器间通信的 hostname:比如
db:这个服务,其他服务里直接用postgres://db:5432连接,不用写 IP
让服务按需启动,别一上来就全崩
Web 依赖数据库,但 depends_on 默认只控制启动顺序,不等数据库真正能连上。这就需要组合使用:
- 在数据库服务里加
healthcheck,比如 PostgreSQL 用pg_isready,Redis 用redis-cli ping - 在依赖它的服务中写
depends_on: db: condition: service_healthy - 必要时加
restart: on-failure,避免因短暂连接失败导致整个栈退出
数据不能丢,卷得配明白
容器重启后数据消失?那是没配对 volumes:
-
命名卷(如
db-data:):由 Docker 管理,路径自动创建,适合数据库、缓存等需要持久化的场景 -
绑定挂载(如
./src:/app):把宿主机目录实时映射进容器,开发时改代码不用重建镜像 -
别把敏感信息写死在 YAML 里:用
.env文件存DOMAIN=example.com,然后在配置中写${DOMAIN}
日常操作就这三条命令够用
不需要记太多,掌握这三个就能覆盖 90% 场景:
-
docker compose up:前台启动,看日志流;加-d后台运行 -
docker compose logs -f web:盯住某个服务的日志,-f实时刷新 -
docker compose down:停服务、删容器和网络(但默认保留命名卷,数据不会丢)











