跳到主要内容

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 = 可连」。

要点​

  1. Compose 管本地多服务;先跟仓库已有 compose.yaml / README
  2. 容器间用服务名,勿在容器里误用 localhost 指邻居
  3. 密钥走 env / env_file,不进镜像层
  4. depends_on ≠ 依赖已就绪

面试速记​

  1. Compose 解决什么? 用 YAML 定义并一键启动多容器本地环境(应用 + 依赖服务)。
  2. 容器里为什么不能用 localhost 连数据库? localhost 是该容器自己;应使用 Compose 服务名。
  3. 密钥能不能写进镜像? 不能;用环境变量 / 密钥管理系统,构建层里不应留下密钥。
  4. depends_on 保证数据库可用吗? 不保证;只保证容器启动顺序,就绪还需健康检查或应用重试。
  5. 开发挂卷和生产镜像有何不同? 开发常 bind mount 源码;生产以镜像内产物为准。