Docker Compose 几个不常用但有用的配置

Docker Compose 工作流示意
1. depends_on + healthcheck
默认的 depends_on 只等容器启动(running),不等服务真正就绪。数据库容器启动了但还没完成初始化,应用容器就已经跑起来报连接失败——这个坑几乎每个人都踩过。
services:
db:
image: postgres:16-alpine
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 10
start_period: 10s
app:
image: myapp:latest
depends_on:
db:
condition: service_healthy # 等 healthcheck 通过
2. profiles:只在需要时启动的容器
services:
adminer:
image: adminer
profiles: [debug] # 不加 --profile debug 就不会启动
ports:
- "8080:8080"
# 正常启动(不含 debug 服务)
docker compose up -d
# 需要调试时
docker compose --profile debug up -d adminer
这个对开发环境尤其有用,不用维护两份 compose 文件。
Docker Compose 进阶用法详解(B站)
3. network_mode: host 和桥接的区别
用 network_mode: host 时容器直接用宿主机网络栈,ports 映射无效,容器监听什么端口就是宿主机上的那个端口。适合对网络性能敏感(如代理软件)或需要监听宿主机所有接口的场景。
Mac 上的 Docker Desktop 不真正支持 host 模式,容器仍然在虚拟机里,只是忽略了端口映射,行为和 Linux 上不同。

Docker 网络模式对比示意图
4. 环境变量和 .env
# .env 文件(自动被 compose 读取,不要提交到 git)
POSTGRES_PASSWORD=supersecret
REDIS_PORT=6379
# docker-compose.yml 里引用
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?必须在 .env 里设置}
# :? 表示如果未设置则报错退出
${VAR:?error} 这个语法能在启动时就发现缺少配置,比运行时才报错好多了。
5. 容器日志管理
默认日志驱动是 json-file,会无限增长。加一下 logging 限制:
services:
app:
logging:
driver: json-file
options:
max-size: "50m"
max-file: "5" # 最多 5 个文件,共 250MB