无法从我的 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:8000
和curl 127.0.0.1:8000
(基于我用来使本地主机可用的解决方案),但它们似乎都不起作用,而且我每次都收到Connection refused
错误。
我请其他人在他们自己的机器上为我试一试,结果对他们有用,所以我不认为我做错了什么。
有人知道我的容器出了什么问题吗?
主机:Ubuntu 20.04.01
Docker 版本:20.10.7
使用的映像:Ubuntu 20.04(和 i386/ubuntu18.04)
【问题讨论】:
这个问题与您链接到的规范问题有何不同?主机上的服务是如何设置的;是只监听 127.0.0.1lo0
接口还是 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 DOWN
和docker0
)
ifconfig
- 列出所有接口
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的主要内容,如果未能解决你的问题,请参考以下文章