现象
容器里 curl http://127.0.0.1:5432 失败;明明数据库跑在宿主机上。
原因
容器内的 127.0.0.1 是容器自己,不是宿主机。
解法
Docker Desktop(Mac/Windows)
extra_hosts:
- "host.docker.internal:host-gateway"然后连 host.docker.internal:5432。
纯 Linux
同样可用 host-gateway,或直接用宿主机在 docker0 上的网关 IP:
ip -4 addr show docker0更稳的做法
把数据库也放进 Compose 网络,用服务名互通,少碰宿主机回环。
services:
api:
depends_on: [db]
environment:
DATABASE_URL: postgres://user:pass@db:5432/app
db:
image: postgres:16云主机上的注意点
云厂商安全组只放行 22/80/443 时,容器对外映射端口会被挡。先在 VPS 上用 ufw/firewalld 与安全组对齐。
验证
docker compose exec api curl -sS http://db:5432 || true
docker compose exec api getent hosts host.docker.internal