我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 正确维护,正如许多文章/论坛所讨论的那样:
你会发现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/