无法从我的 Docker 容器内部连接到主机的 localhost

Posted

技术标签:

【中文标题】无法从我的 Docker 容器内部连接到主机的 localhost【英文标题】:Can't connect to localhost of the host machine from inside of my Docker container 【发布时间】:2021-12-16 05:45:50 【问题描述】:

问题很基本:如何从 Docker 容器内部连接到主机的 localhost?

我尝试了this post 的答案,在运行我的容器时使用add-host host.docker.internal:host-gateway 或写--network=host,但这些方法似乎都不起作用。

我的机器上有一个简单的 hello world 网络服务器,我可以从我的主机上看到它的内容为 curl localhost:8000,但我无法从容器内卷曲它。我从容器内部尝试了curl host.docker.internal:8000、curl localhost:8000curl 127.0.0.1:8000(基于我用来使本地主机可用的解决方案),但它们似乎都不起作用,而且我每次都收到Connection refused 错误。

我请其他人在他们自己的机器上为我试一试,结果对他们有用,所以我不认为我做错了什么。

有人知道我的容器出了什么问题吗?

主机:Ubuntu 20.04.01

Docker 版本:20.10.7

使用的映像:Ubuntu 20.04(和 i386/ubuntu18.04)

【问题讨论】:

这个问题与您链接到的规范问题有何不同?主机上的服务是如何设置的;是只监听 127.0.0.1 lo0 接口还是 0.0.0.0 所有接口? 那些方法对我不起作用,所以我认为我的问题不是那个答案。它在 0.0.0.0 上侦听。这是我的代码:pastebin.ubuntu.com/p/dpf4VB8tRP@DavidMaze 我也尝试了python3 -m http.server,它在 0.0.0.0 端口 8000 上设置了一个网络服务器,但它仍然无法正常工作,所以我确定我的网络服务器中没有错误. @大卫迷宫 对我来说同样的问题...相同的主机版本和 docker 版本,host.docker.internal:xxxx 即使使用host.docker.internal:host-gateway 选项也不起作用...它解析为 172.17.0.1 但不起作用由于桥 docker0 没有接口并且连接了容器,并且其他桥是使用 docker-compose 创建的...我的 docker 容器正在使用 172.19.0.2 用于 eth0 但由于 docker0 关闭(基于 ifconfig)而无法正常工作...我想要在 localhost:7777 下连接到 java REST,与邮递员一起工作,从 docker 容器不是...一些 ubuntu 网络相关的错误? 【参考方案1】:

临时解决方案

这并不能完全解决生产目的的问题,但至少为了让 localhost 正常工作,通过将这些行添加到 docker-compose.yml 它现在解决了我的问题(source):

services:
  my-service:
    network_mode: host

我正在使用 apache nifi 来使用具有相同 ubuntu 和 docker 版本的 Java REST 端点,所以在我的例子中,它看起来像这样:

services:
  nifi:
    network_mode: host

更改docker-compose.yml后,我建议停止docker容器,删除容器(docker-compose rm - 如果你需要一些容器,请不要使用,否则使用docker container rm container_id)并再次使用docker-compose up --build构建。

在这种情况下,我需要使用另一个 localhost IP 让我的服务通过浏览器访问(nifi 在其他 ip 上启动 - 127.0.1.1 但也可以正常工作)。

寻找问题/深入了解 ubuntu-docker 网络

首先,我将写一些有用的命令,这些命令可能有助于找到解决 docker-ubuntu 网络问题的方法:

ip a - 显示所有路由、网络设备、接口和隧道(主要是我可以观察到state DOWNdocker0ifconfig - 列出所有接口 brctl show - 以太网桥管理(docker0 没有附加的接口/veth 对) docker network ls - 管理 docker 网络 - 名称、驱动程序、范围... docker network inspect bridge - 我可以看到 docker0 网桥没有附加的 docker 容器 - 空且未使用网桥

(useful link for ubuntu-docker networking explanation)

我猜这个问题出在veth pair(见上面的链接),因为当 docker-compose 发生时,会创建一个新的桥(不是docker0),在我的情况下连接到veth pair,而 docker0未使用。我的猜测是,如果使用docker0,那么host.docker.internal:host-gateway 会起作用。不知何故,在 ubuntu 网络中,docker0 未用作默认网桥,这可能应该更改。

其实我没多少时间了,好吧,我想以后有人可以利用这些信息解决问题的核心。

【讨论】:

以上是关于无法从我的 Docker 容器内部连接到主机的 localhost的主要内容,如果未能解决你的问题,请参考以下文章

从主机连接到 docker 容器中的 mysql

如何通过 SSH 连接到 MySQL Docker 容器?

从 docker 容器内部连接到 docker 守护进程

无法使用 docker 连接到 ipv6 中的 postgres

如何将我的 docker 连接到远程数据库?

无法从我的本地主机访问 docker 上的 apache