如何从 Docker 容器内部访问宿主机的 localhost?

容器内的 localhost 指容器自身。访问宿主机服务:Mac/Windows 用 host.docker.internal;Linux 加 --add-host host.docker.internal:host-gateway,或用 --network host。本文详解各平台做法。

最佳实践
如何从 Docker 容器内部访问宿主机的 localhost?封面

核心答案:容器里的 localhost 指向容器自己的网络命名空间,不是宿主机。要访问宿主机上的服务(如本地数据库):Mac/Windows(Docker 18.03+)直接用特殊域名 host.docker.internal;Linux(Docker 20.10+)启动时加 --add-host host.docker.internal:host-gateway;Linux 上也可以用 --network host 让容器直接共享宿主机网络。

Mac / Windows:开箱即用

Docker Desktop 内置了 DNS 名 host.docker.internal,容器内直接用它替换连接串里的 127.0.0.1

# 容器内
curl http://host.docker.internal:3306

Linux:两种方式

方式一:host-gateway 映射(推荐)

docker run -d --add-host host.docker.internal:host-gateway myapp:latest

之后容器内同样用 host.docker.internal 访问宿主机,与 Mac/Windows 写法统一。

docker-compose 写法:

services:
  app:
    extra_hosts:
      - "host.docker.internal:host-gateway"

方式二:host 网络模式

docker run -d --network host myapp:latest

容器直接使用宿主机网络栈,localhost 就是宿主机的 localhost。代价:失去网络隔离,端口与宿主机直接冲突,且该模式在 Mac/Windows 上语义不同(不支持真正的 host 网络)。

常见坑

  1. 宿主机服务只监听 127.0.0.1:容器经由 host.docker.internal(宿主机内网 IP)访问时会被拒,需让服务监听 0.0.0.0 或宿主机内网 IP,并注意防火墙。
  2. Linux 下直接用宿主机 IP:也可以,但 IP 会变,host-gateway 更稳。

观测云对照

DataKit 采集容器日志无需手动组网。 DataKit 以 DaemonSet/容器方式部署时自动对接容器运行时,采集宿主上所有容器日志;应用容器访问宿主上的 DataKit 接收端口时,同样用上面两种方式之一即可。

常见问题(FAQ)

Q:host.docker.internal 在 Linux 上不解析?
A:Docker 20.10 之前不支持,升级 Docker 或加 --add-host host.docker.internal:host-gateway

Q:docker-compose 老版本没有 extra_hosts?
A:2.x 以上语法都支持;实在不行可写死宿主机网关 IP(ip route | awk '/default/ {print $3}' 查得)。

Q:K8s 里怎么访问节点上的服务?
A:用 hostNetwork: true(谨慎)、或把服务发布成 ExternalName/Endpoints,也可直接用节点 IP + hostPort。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台