开发者

无法从 Mac 访问 Docker 容器

Mac 上的 Docker 在 Linux 虚拟机中运行容器。要从 macOS 访问容器,通常需要把端口发布到 localhost。

适用于:当前 macOS 版本上的 Docker Desktop 和 OrbStack。核查日期:2026年10月29日

症状

  • curl localhost:8080 失败,但服务在容器内工作正常。
  • 无法 ping 或连接容器的 IP 地址。
  • Mac 上看不到 docker0 接口。
  • 服务在 Linux 上正常,在 Mac 上却不行。

可能的原因

  • 端口未发布。没有 -p 时,Docker Desktop 不会把端口转发到 Mac。
  • Docker Desktop 上的容器 IP。Docker 的 Docker Desktop 文档指出,从主机无法访问它的 bridge 网络。
  • 服务在容器内监听 127.0.0.1。这样一来,只有容器自身能连接它。
  • 端口对写反了。在 -p 8080:80 中,8080 是 Mac 端口,80 是容器端口。

如何检查

  1. 列出正在运行的容器及其已发布的端口。

    docker ps

    输出 PORTS 列显示类似 0.0.0.0:8080->80/tcp 的端口对。没有端口对即表示端口未发布。

  2. 显示某个容器已发布的端口。

    docker port my-container
  3. 如果镜像包含 wget,就在容器内测试服务。有响应即表示服务正常。

    docker exec my-container wget -qO- http://localhost:80
  4. 查看 Mac 上哪个进程在监听该端口。

    lsof -nP -iTCP:8080 -sTCP:LISTEN

如何修复

  1. 启动容器并发布端口。第一个数字是 Mac 上的端口。

    docker run -d -p 8080:80 nginx
  2. 在 Mac 上用 localhost 和 Mac 端口连接。

    curl http://localhost:8080
  3. 让容器内的服务监听 0.0.0.0,而不是 127.0.0.1。具体设置请参阅该服务自己的文档。

  4. 如果 Mac 端口已被占用,请换一个 Mac 端口。请参阅Mac 上端口已被占用。

  5. 使用 OrbStack 时,也可以用容器的 IP 地址或其 container-name.orb.local 名称连接。

使用 Kilobat

  1. Kilobat 的检查在 Mac 上运行。出问题的代码运行在容器中时,请使用 --context container,报告末尾会给出一条要在容器中运行的命令。

    kilobat why http://localhost:8080 --context container

常见问题

为什么在 Docker Desktop 上 ping 不通容器?

Docker 的文档指出,Docker Desktop 无法将流量从 Mac 路由到 Linux 容器。请改为发布端口。

OrbStack 的机制不同吗?

是的。OrbStack 的文档指出,可以从 Mac 通过 IP 地址和 .orb.local 名称连接容器。

参考资料

参考资料核查于 2026年10月29日。man 手册页为 macOS 自带版本;在“终端”中用 man <name> 打开。