如何从 Docker 容器内部访问宿主机的 localhost?
容器内的 localhost 指容器自身。访问宿主机服务:Mac/Windows 用 host.docker.internal;Linux 加 --add-host host.docker.internal:host-gateway,或用 --network host。本文详解各平台做法。
核心答案:容器里的 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 网络)。
常见坑
- 宿主机服务只监听 127.0.0.1:容器经由
host.docker.internal(宿主机内网 IP)访问时会被拒,需让服务监听0.0.0.0或宿主机内网 IP,并注意防火墙。 - 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。