← 返回博客

Docker 容器访问不了宿主机服务怎么办

host.docker.internal、额外 hosts、以及 Linux 上 bridge 网络的常见坑。

TensorView Lab · 2026-09-02

现象

容器里 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

也可以试试 TensorView 小工具集合