使用 host.docker.internal 连接宿主机数据库的配置与问题解决
学习笔记作者:admin日期:2025-07-20点击:25
摘要:本文总结了在 Docker 容器中使用 `host.docker.internal` 连接宿主机数据库时遇到的 DNS 解析失败问题,并提供了多种解决方案,包括手动指定宿主机 IP、确保 Docker 版本支持以及通过 `extra_hosts` 添加自定义 DNS 映射。
问题描述
在运行容器时,尝试通过 host.docker.internal
连接宿主机上的 PostgreSQL 数据库,但出现了以下错误:
failed to connect to `user=postgres database=bitmagnet`:
hostname resolving error: lookup host.docker.internal on 127.0.0.11:53: no such host
lookup host.docker.internal on 127.0.0.11:53: no such host
这表明容器无法解析 host.docker.internal
,导致连接失败。
解决方案一:使用宿主机在 Docker 网络中的 IP 地址
如果 host.docker.internal
不可用,可以手动获取宿主机在 Docker 网络中的 IP 地址并替换。
步骤 1: 获取宿主机 IP
ip route | grep default
输出示例:
default via 172.18.0.1 dev eth0
其中 172.18.0.1
是宿主机在 Docker 网络中的 IP。
步骤 2: 修改环境变量
将 POSTGRES_HOST
改为该 IP:
- POSTGRES_HOST=172.18.0.1
解决方案二:确保 host.docker.internal 可用
如果你希望继续使用 host.docker.internal
,请确认以下条件:
- Docker 版本 >= 20.10
- 容器未使用
--network=host
(此网络模式会禁用host.docker.internal
)
解决方案三:手动添加 host.docker.internal 到 hosts
可以在容器中通过 extra_hosts
手动绑定 host.docker.internal
到宿主机的 IP:
extra_hosts:
- "host.docker.internal:172.18.0.1"
最终检查清单
检查项 | 是否完成 |
---|---|
容器内能否解析 host.docker.internal ? |
❌ 已知失败 |
使用宿主机 Docker 网络 IP 替代 host.docker.internal |
✅ |
PostgreSQL 允许远程连接? | ✅ |
pg_hba.conf 中允许了容器所在网段? |
✅ |
防火墙放行了 5432 端口? | ✅ |
附加建议
如果你需要验证 PostgreSQL 是否配置正确,可以提供以下内容:
/etc/postgresql/
中的/main/postgresql.conf listen_addresses
/etc/postgresql/
中的相关规则/main/pg_hba.conf
如需帮助,我也可以提供完整的 PostgreSQL 外部访问配置模板。