如何从 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:

# 容器内
mysql -h host.docker.internal -P 3306 -u app -p  # 使用MySQL客户端而非HTTP

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。代价:失去网络隔离,端口与宿主机直接冲突,Docker Desktop 4.34+ 可选择启用 host networking,但有平台/协议限制,不等同于原生Linux全部行为。

常见坑

  1. 宿主机服务只监听 127.0.0.1:原生Linux桥接容器经宿主机网关地址无法访问仅回环监听,需绑定实际可达的最小范围地址;Desktop转发行为不同,并注意防火墙。
  2. Linux 下直接用宿主机 IP:也可以,但 IP 会变,host-gateway 更稳。

常见问题(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:可用可达的节点IP或按需hostNetwork。ExternalName只提供DNS别名,不映射端口;Service配无selector的EndpointSlice可描述外部目标。hostPort是把Pod端口映射到节点,不是让Pod访问已有节点服务的必要条件。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台