使用 host.docker.internal 连接宿主机数据库的配置与问题解决
学习笔记作者:admin日期:2025-07-20点击:148
摘要:本文总结了在 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 外部访问配置模板。