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

标签 docker ubuntu localhost

问题很基本:如何从 Docker 容器内部连接到主机的 localhost?
我尝试了 this post 的答案, 使用 add-host host.docker.internal:host-gateway或写 --network=host运行我的容器时,但这些方法似乎都不起作用。
我的机器上有一个简单的 hello world 网络服务器,我可以看到它的内容 curl localhost:8000来自我的主机,但我无法从容器内 curl 它。我试过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)

最佳答案

临时解决方案
这并不能完全解决生产目的的问题,但至少为了让本地主机工作,通过将这些行添加到 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 - 显示所有路由、网络设备、接口(interface)和隧道(主要是我可以观察到 state DOWNdocker0 )
  • ifconfig - 列出所有接口(interface)
  • brctl show - 以太网桥管理(docker0 没有附加接口(interface)/veth 对)
  • docker network ls - 管理 docker 网络 - 名称、驱动程序、范围...
  • docker network inspect bridge - 我可以看到 docker0 网桥没有附加的 docker 容器 - 空且未使用网桥

  • (useful link for ubuntu-docker networking explanation)
    enter image description here
    我猜这个问题出在 veth pair (见上面的链接),因为当 docker-compose 发生时,创建了一个新的桥(不是 docker0 )连接到 veth pair就我而言,不使用 docker0 。我的猜测是,如果 docker0使用,然后 host.docker.internal:host-gateway会工作。不知何故,在 ubuntu 网络中,有 docker0不用作默认网桥,这可能应该更改。
    实际上我没有多少时间了,好吧,我想以后有人可以使用这些信息并解决问题的核心。

    关于docker - 无法从我的 Docker 容器内部连接到主机的 localhost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69797871/

    相关文章:

    docker - Docker Hub私有(private)存储库:无法在私有(private)存储库中推送Solr Core文件

    ubuntu - update-alternatives 在 CDH4 安装中抛出错误

    linux - 中文字符可以在本地主机上使用,但不能在实时服务器上使用

    file - 为什么文件扩展名在 Web 上区分大小写,而在 localhost 上不区分?

    docker - 特权容器和功能

    node.js - 从 docker 容器连接到主机 mongodb

    Docker BaseX DBA

    linux - Windows 7 上的 Oracle 虚拟机 (Ubuntu)

    node.js - 是否可以从 vagrant devbox 访问本地主机?

    c - 本地主机上的服务器似乎不接受连接