我在主机183.83.83.83
上有一个泊坞广告容器
子域mycontainer.example.com的A记录指向此IP。
183.83.83.83
或mycontainer.example.com
的卷曲可提供HTTP状态200和正确的网站。
但是,该主机上每个容器内部(同上面的IP或主机名)的卷曲都无法连接:
curl: (7) Failed to connect to mycontainer.example.com port 80: Host is unreachable
从另一台主机或来自主机本身的Docker容器中尝试此操作时,不会发生这种情况。
这里出了什么问题?
编辑:更多详情:
主机运行Nginx-proxy container,它将mycontainer.example.com
的所有请求代理到我的前端容器(通过小节点web服务器运行React应用程序)。前端容器应该代理从mycontainer.example.com/api
到mycontainer.example.com:1337/api/v1
的所有API请求。但是它无法代理API请求,因为我在此主机上运行的所有容器中都收到错误Host is unreachable
。
答案 0 :(得分:5)
我知道这是一个老问题但是对于任何来到这里的人来说,解决方案,至少在Linux上,是通过修改主机的iptables
来允许传入的网络数据包从docker bridge网络主机,如下所示:
sudo iptables -I INPUT -i docker0 -j ACCEPT
它转换为接受来自docker bridge网络的主机上的所有传入网络数据包(假设它是docker0),即来自docker容器的流量。
以下是详细信息:
-I INPUT means to insert a netfilter rule for incoming packets to host
-i docker0 means packets from docker0 interface of the host
-j ACCEPT means accept all packets since a protocol is not defined it implies that packets of any protocol are welcome.
有关详细信息,请参阅iptables --help
和netfilter网站。
答案 1 :(得分:2)
使用FirewallD的最新方法是执行以下命令:
firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --reload
答案 2 :(得分:1)
Fedora 32将防火墙的后端从iptables切换到了nftables。我没有找到如何使用nftable修复问题的方法,但是我找到了如何切换回iptables的方法。
尽管以下命令看起来不是最佳实践,但它们对我有用。
sudo sed -i 's/FirewallBackend=nftables/FirewallBackend=iptables/g' /etc/firewalld/firewalld.conf
sudo systemctl restart firewalld docker
来源:https://dev.to/ozorest/fedora-32-how-to-solve-docker-internal-network-issue-22me
答案 3 :(得分:0)
这是我的解决方法:
if command -v firewall-cmd > /dev/null; then
NIC=$(ip addr | grep {{docker.network.host.ip}} | awk '{ print $7 }')
echo "Trusting NIC \"${NIC}\"..."
sudo firewall-cmd --permanent --zone=trusted --change-interface=${NIC} \
&& sudo firewall-cmd --reload \
&& sudo systemctl restart firewalld \
|| exit $?
fi
答案 4 :(得分:0)
我在尝试更改 docker-compose 网络时遇到了这个问题,为了修复我删除了所有未使用的网络。
docker network ls
<- 这将列出您的网络
不要删除那些:
NETWORK ID NAME DRIVER SCOPE
970599083e1f bridge bridge local
dddff9d5ec3e host host local
15a80e0436c2 none null local
docker network rm <ID|NAME>
<- 这将删除一个网络