无法从 docker 容器中访问 MacOSX 主机上的端口

Posted

技术标签:

【中文标题】无法从 docker 容器中访问 MacOSX 主机上的端口【英文标题】:Cannot access ports on MacOSX host from within docker container 【发布时间】:2016-04-30 20:57:42 【问题描述】:

这些是我采取的步骤:

准备工作:

第一:

docker-machine create -d virtualbox default

然后,我使用以下 Dockerfile 创建了一个容器:

FROM centos:latest

没有别的——只是 CentOS 的副本。我构建了容器:

docker build -t mycontainer .

然后运行它:

docker run -it --net="host" --name="test" -p 9200:9200 mycontainer

问题:当我进入容器并尝试访问在 MacOSX 上运行的服务(例如简单的网络服务器或本地弹性搜索)时,我得到:

curl localhost:9200
curl: (7) Failed connect to localhost:9200; Connection refused

我在我的 docker vm (docker-machine ssh default) 中遇到了同样的错误。

我尝试在 virtualbox 中进行端口转发,将 9200 设置为 9200 — 但没有帮助。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您无法使用 localhost:port 从 docker 容器连接到主机上的端口(除非您使用 --net="host" 运行容器)

您需要指定要连接的主机的 ip 地址。

请检查主机上的IP:

dude-server:*** cwoehrle$ ping $(hostname)
PING dude-server (192.168.1.169): 56 data bytes
64 bytes from 192.168.1.169: icmp_seq=0 ttl=64 time=0.053 ms
64 bytes from 192.168.1.169: icmp_seq=1 ttl=64 time=0.069 ms

在容器中(分别使用你的 ip):

root@8975fada1ac3:/# nc 192.168.1.169 9200

编辑: 要连接到 Mac 上的主机端口,您可以使用默认网关地址 10.0.2.2,例如nc 10.0.2.2 9200

【讨论】:

我使用了--net="host",但我发现我可以连接到VM,但不能连接到MacOSX。那么,我需要从 VM 到我的 MacOSX 建立一个双向网络吗? 抱歉,我跳过了 --net="host" 部分。是的,您可以在 virtualbox 中将网络设置为 NAT 以访问您主机的端口。我仍然无法连接到 localhost:port 但必须使用 nc 10.0.2.2 9200 连接到主机端口(10.0.2.2 是 nat 连接的默认网关) 哇,这就是我喜欢 *** 的原因。我不必使用nc,甚至不必使用--net="host"。我的 elasticsearch 实例使用容器内的curl 10.0.2.2:9200 立即响应。我怎么会知道呢? (老实问:10.0.2.2是常识吗?) 我想知道自 2016 年 1 月以来这是否发生了变化。无法从我的 Mac 上的容器中 ping 或以其他方式访问 10.0.2.2。但是,192.168.65.2 确实有效。默认网络设置必须已更改。更新:研究中,Docker 为此提供了一个主机别名:host.docker.internal - 无需对 IP 进行硬编码。【参考方案2】:

从容器内,只需参考:

host.docker.internal

所以,你的 curl 命令是:

curl http://host.docker.internal:9200

【讨论】:

以上是关于无法从 docker 容器中访问 MacOSX 主机上的端口的主要内容,如果未能解决你的问题,请参考以下文章

从另一个容器访问 docker 容器

无法通过主机访问Docker flask服务器容器

SpringBoot @RestController 无法从 docker 容器外部访问

AWS Elastic Beanstalk 上的 Docker - 无法从容器访问环境变量

如何从 docker 容器访问 localhost? [复制]

Namenode 无法从 Docker 容器外部访问