开发者
无法从 Mac 访问 Docker 容器
Mac 上的 Docker 在 Linux 虚拟机中运行容器。要从 macOS 访问容器,通常需要把端口发布到 localhost。
症状
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 是容器端口。
如何检查
列出正在运行的容器及其已发布的端口。
docker ps输出 PORTS 列显示类似
0.0.0.0:8080->80/tcp的端口对。没有端口对即表示端口未发布。显示某个容器已发布的端口。
docker port my-container如果镜像包含 wget,就在容器内测试服务。有响应即表示服务正常。
docker exec my-container wget -qO- http://localhost:80查看 Mac 上哪个进程在监听该端口。
lsof -nP -iTCP:8080 -sTCP:LISTEN
如何修复
启动容器并发布端口。第一个数字是 Mac 上的端口。
docker run -d -p 8080:80 nginx在 Mac 上用 localhost 和 Mac 端口连接。
curl http://localhost:8080让容器内的服务监听 0.0.0.0,而不是 127.0.0.1。具体设置请参阅该服务自己的文档。
如果 Mac 端口已被占用,请换一个 Mac 端口。请参阅Mac 上端口已被占用。
使用 OrbStack 时,也可以用容器的 IP 地址或其
container-name.orb.local名称连接。
使用 Kilobat
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 名称连接容器。
参考资料
- Docker Docs:Explore networking how-tos on Docker Desktop
- Docker Docs:Networking on Docker Desktop
- OrbStack Docs:Container networking
- lsof(8),macOS 27.2 自带的 man 手册页
参考资料核查于 2026年10月29日。man 手册页为 macOS 自带版本;在“终端”中用 man <name> 打开。