Compose 与本地联调
Compose 用一份 YAML 把「应用 + 数据库」等多容器一起拉起,是前端/全栈本地联调最常见的入口。镜像怎么造见 Dockerfile 与镜像构建;Volume / 网络细节见 数据、网络与 Registry。
最小示例
services:
api:
build: .
ports:
- "8000:8000"
env_file:
- .env
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
docker compose up --build
docker compose ps
docker compose logs -f api
服务名 vs localhost
| 从哪里访问 | 怎么写 |
|---|---|
| 浏览器 / 本机进程访问映射端口 | localhost:8000(-p 映射的主机侧) |
| 容器内访问同 Compose 网络的其他服务 | 服务名,如 db:5432 |
容器内写 localhost:5432 | 只打到自己,通常连不上 db |
一句话:Compose 默认把同文件里的 service 放进同一网络,DNS 名 = 服务名。
配置与密钥
| 方式 | 用途 |
|---|---|
environment | 直接写非敏感或示例值 |
env_file: .env | 本地密钥/配置(勿提交真实生产密钥) |
写进 Dockerfile ENV / ARG 打进层 | 不要放密钥 |
开发可挂载源码卷热更新;生产镜像一般打进产物,不靠 bind mount。
depends_on 的局限
默认 depends_on 只保证「依赖容器已启动」,不保证数据库已可接受连接。
需要等就绪时:健康检查 + depends_on.condition: service_healthy(以团队模板为准)。应用侧也应有重试,而不是假设「db 容器 up = 可连」。
要点
- Compose 管本地多服务;先跟仓库已有
compose.yaml/ README - 容器间用服务名,勿在容器里误用
localhost指邻居 - 密钥走 env /
env_file,不进镜像层 depends_on≠ 依赖已就绪
面试速记
- Compose 解决什么? 用 YAML 定义并一键启动多容器本地环境(应用 + 依赖服务)。
- 容器里为什么不能用 localhost 连数据库?
localhost是该容器自己;应使用 Compose 服务名。 - 密钥能不能写进镜像? 不能;用环境变量 / 密钥管理系统,构建层里不应留下密钥。
- depends_on 保证数据库可用吗? 不保证;只保证容器启动顺序,就绪还需健康检查或应用重试。
- 开发挂卷和生产镜像有何不同? 开发常 bind mount 源码;生产以镜像内产物为准。