问题很基本:如何从 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 DOWN
和 docker0
)ifconfig
- 列出所有接口(interface)brctl show
- 以太网桥管理(docker0 没有附加接口(interface)/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 - 无法从我的 Docker 容器内部连接到主机的 localhost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69797871/