应使用host.docker.internal(Docker Desktop首选)、docker0网关地址(Linux常用)、宿主机局域网IP、host网络模式或挂载/proc动态获取网关,且宿主机服务须监听0.0.0.0并放行防火墙。

容器里写 127.0.0.1 访问宿主机服务,本质上是“找错了人”——这个地址在容器内部永远指向它自己,而不是宿主机。真正要解决的不是“怎么连上”,而是“怎么让容器知道该连谁”。下面几种方式按推荐度和适用场景分列,选对了就不用反复试错。
用 host.docker.internal(开发首选)
这是 Docker Desktop(macOS/Windows)开箱即用的方案,语义清晰、无需手动查 IP、也不用改服务监听配置。
- 确认 Docker 版本 ≥ 18.03(
docker --version查看) - 容器内直接用
host.docker.internal:端口,比如redis://host.docker.internal:6379 - docker-compose 默认支持,除非你显式禁用了
extra_hosts或覆盖了 DNS 配置
查 docker0 网关地址(Linux 原生环境常用)
Linux 上没有 host.docker.internal,但 docker0 网桥的网关地址稳定可靠,通常是 172.17.0.1。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 宿主机执行
ip addr show docker0,找inet后面的 IPv4 地址(如172.17.0.1/16) - 确保宿主机服务监听的是
0.0.0.0:端口,不是只监听127.0.0.1 - 容器内用该地址测试:例如
curl http://172.17.0.1:3000
用宿主机局域网 IP(通用但需注意防火墙)
只要宿主机和容器在同一个物理网络下(比如都连着公司 Wi-Fi 或本地路由器),用宿主机的真实局域网 IP 最直接。
- 查宿主机 IP:Linux/macOS 运行
ip route | awk '/default/ {print $3}';Windows 用ipconfig找“IPv4 地址” - 检查宿主机防火墙是否放行该端口(如
sudo ufw allow 8080) - 确认服务监听在
0.0.0.0,否则外部请求会被丢弃
启用 host 网络模式(调试快,生产慎用)
让容器直接共享宿主机网络栈,127.0.0.1 就真变成宿主机了。仅限 Linux,且会削弱网络隔离性。
- 启动时加参数:
docker run --network=host your-image - 适用于本地快速验证,比如调试 WebSocket 或临时跑一个 CLI 工具连本地 DB
- 不建议用于多容器共存或生产部署,端口冲突风险高
不复杂但容易忽略:无论选哪种方式,宿主机服务必须监听 0.0.0.0,且防火墙允许入站连接。这两步漏掉,再换十种地址也连不上。

















