Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker-没有到主机的路由_Docker - Fatal编程技术网

Docker-没有到主机的路由

Docker-没有到主机的路由,docker,Docker,当我尝试将容器内的某个端口连接到另一个容器时,未成功并获得 root@ac1590a59fe5:/opt/f5massupgrade# curl -v https://172.17.0.1:6379 * Rebuilt URL to: https://172.17.0.1:6379/ * Hostname was NOT found in DNS cache * Trying 172.17.0.1... * connect to 172.17.0.1 port 6379 failed: No

当我尝试将容器内的某个端口连接到另一个容器时,未成功并获得

root@ac1590a59fe5:/opt/f5massupgrade# curl -v https://172.17.0.1:6379
* Rebuilt URL to: https://172.17.0.1:6379/
* Hostname was NOT found in DNS cache
*   Trying 172.17.0.1...
* connect to 172.17.0.1 port 6379 failed: No route to host
* Failed to connect to 172.17.0.1 port 6379: No route to host
* Closing connection 0
从docker主机上看,我成功了

[root@docker-host ~]# curl -v https://172.17.0.1:6379/0
* About to connect() to 172.17.0.1 port 6379 (#0)
*   Trying 172.17.0.1...
* Connected to 172.17.0.1 (172.17.0.1) port 6379 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
如果我检查iptables我可以看到问题

[root@docker-host ~]#  iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-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 -j REJECT --reject-with icmp-host-prohibited
因此,我添加了以下内容,并且效果良好

iptables -I INPUT 4 -i docker0 -j ACCEPT
我是不是遗漏了什么

[root@docker-host ~]# docker version
Client:
 Version:         1.9.1
 API version:     1.21
 Package version: docker-common-1.9.1-40.el7.centos.x86_64
 Go version:      go1.4.2
 Git commit:      ab77bde/1.9.1
 Built:
 OS/Arch:         linux/amd64

Server:
 Version:         1.9.1
 API version:     1.21
 Package version: docker-common-1.9.1-40.el7.centos.x86_64
 Go version:      go1.4.2
 Git commit:      ab77bde/1.9.1
 Built:
 OS/Arch:         linux/amd64

谢谢,

请尝试运行将标志--net设置为host的容器

docker run --net host image 

对我来说,问题是MAC地址冲突。。。不知道这是怎么发生的…

我们在运行
firewalld
的RHEL框上遇到了这个问题。防火墙正在阻止容器到主机的访问(icmp通信除外)

我们需要配置防火墙以允许从docker容器到主机的流量。在我们的案例中,容器位于子网
172.27.0.0/16
上的网桥网络中(通过
docker网络ls
docker inspect
确定)。
firewalld
的防火墙规则可以通过以下方式更新:

firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.27.0.0/16 accept'
firewall-cmd --reload

这是解决问题的一个重要步骤。

我知道这是一个老问题,但我刚刚遇到了这个问题,并且能够在这个线程的帮助下解决它

多亏了Samuel,我检查了网络中的任何容器是否有冲突的MAC地址。这就是问题的原因

现在冲突的原因是在我的撰写文件中使用了多个网络。我使用了由每个docker compose创建的默认网络以及加入现有网络的默认网络

docker选择MAC地址的方式是从02:42:ac:12:00:00开始,然后为每个后续容器使用下一个地址。显然,这是为每个网络单独完成的。Docker根据使用compose创建的默认网络选择我的容器的MAC地址。生成的MAC在compose网络上是唯一的,但已在其加入的现有网络中使用


这个问题已经过描述,最近通过引入网络优先级得到了解决。

下面的内核可调参数定制解决了docker容器之间的“无主机路由”问题:

sysctl net.bridge.bridge-nf-call-iptables=0
sysctl net.bridge.bridge-nf-call-arptables=0
sysctl net.bridge.bridge-nf-call-ip6tables=0
这些控制是否将通过网桥的数据包发送到iptables进行处理


注意:如果您将其添加到sysctl.conf中,根据您的linux发行版,它可能不会在重新启动时自动应用为已知错误。

如果有人在CentOS 8或任何使用firewalld的系统上仍然遇到此问题

# Allows container to container communication, the solution to the problem
firewall-cmd --zone=public --add-masquerade --permanent

# standard http & https stuff
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
# + any other port you may need

# reload the firewall
firewall-cmd --reload
请尝试firewalld的以下设置

# Allows container to container communication, the solution to the problem
firewall-cmd --zone=public --add-masquerade --permanent

# standard http & https stuff
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
# + any other port you may need

# reload the firewall
firewall-cmd --reload
如果docker服务不能立即工作,您可能还需要重新启动该服务,没有必要将
docker 0
界面添加到受信任区域,因为我已经阅读了很多指南


我当时正努力为docker容器设置Traefik反向代理,我只收到了502个响应,从Traefik日志到我的容器没有路由错误。起初我以为这是我的Traefik设置,但后来发现是@al.提到的防火墙限制。它为我指明了正确的方向,我从

中得到了答案,这些在Fedora 32上对我很有效

$ sudo firewall-cmd --zone=public --add-masquerade --permanent
$ sudo firewall-cmd --reload
$ sudo systemctl restart docker

因为docker将创建几个网络,所以我更愿意打开所有相关的IP

#打开以“172”开头的所有IP,以便所有容器可以相互通信
sudo firewall cmd--permanent--zone=public--add rich rule='rule family=ipv4源地址=172.0.0.0/8接受'
#使我们的容器能够访问外部网络
sudo firewall cmd--permanent--zone=public--add masquerade
#应用更改
sudo firewall cmd--重新加载
您可以访问
/etc/firewalld/zones/public.xml
获取最终结果

以下是我的例子:


公开的
用于公共场所。您不信任网络上的其他计算机不会损坏您的计算机。仅接受选定的传入连接。
是文件的详细说明。编辑此文件并重新加载防火墙也可以工作


希望能有所帮助。

您的集装箱运行情况如何?使用内部IP地址,容器只有在同一Docker网络中才能相互联系。是的,它们都在同一网络上。我公开每个端口上所需的端口。我没有设置任何IP,因为它们都通过Docker0进行通信。是的,这解决了问题。docker容器无法连接到主机。它找不到要连接的网络。我会接受你的回答你的回答是个救命稻草。我能够解决我的问题并找到原因。TL;我的答案是:Docker compose,多个网络,MAC地址是根据自动创建的网络选择的,但在已使用的连接网络中也使用了。我不知道我是否有冲突的MAC,没有检查,我只是做了一个
Docker compose down
然后
Docker compose up
,它工作了。谢谢大家的提示谢谢,我花了4个小时调试了这个疯狂的问题。如果你知道你的网络名称,你可以通过
subnet\u addr=$(docker inspect | grep subnet | cut-d:-f2 | tr-d“,\”)获得子网地址
它对我不起作用。我需要运行
firewall cmd--zone=public--add masquerade--permanent
只有天知道我被困在这上面多少天了,谢谢!!终于!!!这个--add masquerade也为我解决了!!!谢谢,谢谢!我的问题,Spring in Docker,jdbc连接到外部(公司内部)SQL Server。这修复了它。花费了数小时和数小时调试。这是在一个新的Redhat 8盒上。