bigywater.tech
Docker · 56

host.docker.internal:容器怎么访问宿主机上的服务

容器里怎么访问 Mac 上跑的服务?host.docker.internal 是什么、解析到哪里、对只监听 127.0.0.1 的服务有用吗?这篇逐项实测,包括 --add-host host-gateway 的写法。

192.168.65.254
host.docker.internal 在容器里解析到的 IPv4 地址
127.0.0.1 也能连
Mac 上只监听 127.0.0.1 的服务,容器经 host.docker.internal 访问成功
Connection refused
容器访问它自己的 127.0.0.1:Mac 上的服务端口,被拒绝

名字从哪来

实测 · 本机执行输出
  nslookup host.docker.internal:退出码 0;地址 ['<本机局域网IP>:53', '<本机局域网IP>', 'fdc4:f303:9324::254']
  nslookup gateway.docker.internal:退出码 0;地址 ['<本机局域网IP>:53', 'fdc4:f303:9324::1', '<本机局域网IP>']
  nslookup kubernetes.docker.internal:退出码 0;地址 ['<本机局域网IP>:53', 'fdc4:f303:9324::7', '<本机局域网IP>']
  nslookup no.such.name.internal:退出码 1;地址 ['<本机局域网IP>:53']
  容器里的 /etc/hosts 有 host.docker.internal 吗?0 行

host.docker.internal 由 Docker Desktop 的 DNS 解析(192.168.65.254 和一个 IPv6 地址),容器的 /etc/hosts 里并没有。gateway.docker.internal、kubernetes.docker.internal 同理(后者我没有深究)。

访问 Mac 上的服务

实测 · 本机执行输出
  Mac 上监听 127.0.0.1:9840 的服务:容器访问 host.docker.internal:9840 → hello from the Mac
  Mac 上监听 0.0.0.0:9850 的服务:容器访问 host.docker.internal:9850 → hello from the Mac
  容器访问 127.0.0.1:9840(容器自己的回环)→ wget: can't connect to remote host (127.0.0.1): Connection refused
  自定义网络里的容器访问 host.docker.internal:9840 → hello from the Mac

Mac 上只监听 127.0.0.1 的 HTTP 服务,容器访问 host.docker.internal 的端口成功——按我的推断是被 Docker Desktop 转发到 Mac 本机的。容器里的 127.0.0.1 指的是容器自己,所以会被拒绝。

--add-host

实测 · 本机执行输出
  加 --add-host host.docker.internal:host-gateway 后 /etc/hosts 里:<本机局域网IP>	host.docker.internal
fdc4:f303:9324::254	host.docker.internal
  这时访问 host.docker.internal:9840 → hello from the Mac

--add-host host.docker.internal:host-gateway 把 192.168.65.254 等地址写进 /etc/hosts。在 Docker Desktop 上不加也能解析,它主要用于没有预置这个名字的 Linux 宿主机,我没有在 Linux 上验证。

host 模式

实测 · 本机执行输出
  --network host 的容器访问 host.docker.internal:9840 → hello from the Mac

--network host 的容器同样能访问。

分步演示

host.docker.internal
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。Mac 侧用 Python 的 http.server 在 127.0.0.1 和 0.0.0.0 各起一个服务;容器里用 busybox wget / nslookup;输出中的 192.168.x.x 地址会被站点的脱敏规则替换为占位符,文中的 192.168.65.x 是 Docker Desktop 虚拟机内部网段(不是你的局域网);实验后已关闭服务并删除容器和网络
    • 没有验证:Linux 宿主机上的 host-gateway、防火墙对 Mac 本机服务的影响、host.docker.internal 在不同 Docker Desktop 版本里的地址、VPN 下的表现、Mac 上的服务绑定到特定网卡地址时的情形
    京ICP备2026067502号-1京公网安备11010502063487号