在 docker 容器中使用 host.docker.internal 的连接被拒绝

在 docker 容器中使用 host.docker.internal 的连接被拒绝

localhost:8000在主机上有一个打开的。具体来说:

$ php -S localhost:8000
PHP 7.1.19 Development Server started at Tue Jul 16 09:49:08 2019
Listening on http://localhost:8000

我可以curl -i http://localhost:8000在主机上执行操作来获取响应,并且我也可以通过主机浏览器访问它,完全没有问题。

但是,当我尝试在 Mac 上访问 docker 容器上的主机时,连接被拒绝:

$ curl -i http://host.docker.internal:8000
curl: (7) Failed to connect to host.docker.internal port 8000: Connection refused

$ telnet host.docker.internal 8000
Trying 192.168.65.2...
telnet: Unable to connect to remote host: Connection refused

host.docker.internal从命令中可以看出,docker 容器可以解析 DNS telnet,我也一样ping,但是连接被拒绝。

$ ping host.docker.internal
PING host.docker.internal (192.168.65.2) 56(84) bytes of data.
64 bytes from 192.168.65.2 (192.168.65.2): icmp_seq=1 ttl=37 time=0.186 ms
64 bytes from 192.168.65.2 (192.168.65.2): icmp_seq=2 ttl=37 time=0.463 ms
64 bytes from 192.168.65.2 (192.168.65.2): icmp_seq=3 ttl=37 time=0.420 ms
64 bytes from 192.168.65.2 (192.168.65.2): icmp_seq=4 ttl=37 time=0.428 ms
64 bytes from 192.168.65.2 (192.168.65.2): icmp_seq=5 ttl=37 time=0.722 ms

更新

我找到了这个GitHub 问题评论,不知道这是否有帮助。

答案1

我遇到了类似的问题,通过确保我的隧道接受来自各处的连接,我使它正常工作。

前:

ssh -N -L 5435:endpoint.rds.amazonaws.com:5432 [email protected]

后:

ssh -N -L 0.0.0.0:5435:endpoint.rds.amazonaws.com:5432 [email protected]

答案2

我能够让它工作。我不确定您是否仍面临此问题,我的解决方案对您有用。但是,尝试一下永远不会有坏处。

我注意到没有端口映射/绑定到主机的容器存在识别host.docker.internal主机的问题localhost。因此,我为存在连接问题的容器使用了一个虚拟端口,它开始工作了。

希望这可以帮助。

答案3

笔记:我把这个问题发布在了 SO(问题 43879637)上,但我认为这个问题应该关闭,并参考这个问题,因为事实上,这不是一个编程问题。

网络模式:主机

如果网络模式是主机,那应该没有问题,但是这样网络隔离就不到位,每个容器就像一个服务器中的服务,它们不能共享端口,它们都有相同的ip地址,即主机的地址。

在 Docker Compose 中:

networks:
    my-network:
        driver: host

网络模式:桥接

更好的方法是使用桥接网络,它模拟每个容器都有自己的 IP 地址的本地网络。

在 Docker Compose 中:

networks:
    my-network:
        driver: bridge

如果您有多个桥接网络,有时 iptables 或路由表不能被 docker 正确维护,正如许多文章/论坛所讨论的那样:

https://stackoverflow.com/questions/66067893/why-does-docker-give-error-connect-no-route-to-host-when-trying-to-connect-to

你会发现docker0是链接到第一个默认网桥(172.17.0.0)的网络接口,后续网络与虚拟设备相关联,例如br-d2938602303c,br-dfd44f0535bf......

检查更改 iptables 以接受来自所有所需 docker 接口的传入数据包:

[root@my-server]# iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8000:9999 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2100:2199 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -i br-d2938602303c -j ACCEPT
-A INPUT -i br-dfd44f0535bf -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8000:9999 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2100:2199 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

然后重启 ip tables 服务

service iptables restart

然后我还修复了路由表,它看起来像这样

[root@jupiter ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         static.129.95.9 0.0.0.0         UG    0      0        0 eno1
static.129.95.9 0.0.0.0         255.255.255.255 UH    0      0        0 eno1
link-local      0.0.0.0         255.255.0.0     U     1002   0        0 eno1
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-d2938602303c
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-dfd44f0535bf

有用的链接:

https://www.baeldung.com/linux/docker-connecting-containers-to-host

https://www.reddit.com/r/docker/comments/i5es7f/no_route_to_host_but_successful_google_ping/

https://stackoverflow.com/questions/66067893/why-does-docker-give-error-connect-no-route-to-host-when-trying-to-connect-to

https://stackoverflow.com/questions/43879637/docker-container-cannot-connect-to-host-machine-no-route-to-host/78041985#78041985

相关内容