使用 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 是否配置正确,可以提供以下内容:

  1. /etc/postgresql//main/postgresql.conf 中的 listen_addresses
  2. /etc/postgresql//main/pg_hba.conf 中的相关规则

      如需帮助,我也可以提供完整的 PostgreSQL 外部访问配置模板。

上一篇      下一篇