Curl Docker容器内无法访问主机

Curl Docker容器内无法访问主机,curl,docker,Curl,Docker,主机上有一个docker容器183.83.83 子域mycontainer.example.com的A记录指向此IP 卷曲到183.83.83.83或mycontainer.example.com将显示HTTP状态200和正确的网站 但是,来自该主机上每个容器内部的同一个curl(到上面的IP或主机名)无法连接: curl: (7) Failed to connect to mycontainer.example.com port 80: Host is unreachable 当从另一个主机

主机上有一个docker容器
183.83.83
子域mycontainer.example.com的A记录指向此IP

卷曲到
183.83.83.83
mycontainer.example.com
将显示HTTP状态200和正确的网站

但是,来自该主机上每个容器内部的同一个curl(到上面的IP或主机名)无法连接:

curl: (7) Failed to connect to mycontainer.example.com port 80: Host is unreachable
当从另一个主机或主机本身的Docker容器尝试此操作时,不会发生这种情况

这里出了什么问题

编辑:更多详细信息:
主机运行一个代理程序,将所有到mycontainer.example.com的请求代理到我的前端容器(通过一个小节点Web服务器运行React应用程序)。前端容器应该代理从
mycontainer.example.com/API
mycontainer.example.com:1337/API/v1
的所有API请求。但是,它不能代理API请求,因为我从运行在该主机上的所有容器中得到错误
主机无法访问

我知道这是一个老问题,但对于任何来到这里的人来说,解决方案,至少在Linux上,通过修改主机的
iptables
,允许从docker网桥网络传入网络数据包到主机,如下所示:

sudo iptables -I INPUT -i docker0 -j ACCEPT
它转换为接受主机上来自docker网桥网络(假设为docker 0)的所有传入网络数据包,即来自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
和网站。

使用FirewallD的最新方法是执行以下命令:

firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --reload
以下是我的解决方案:

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

Fedora 32将防火墙的后端从iptables切换到nftables。我没有找到如何修复nftables的问题,但是我找到了如何切换回iptables

虽然下面的命令看起来不像是最佳实践,但它们对我有用

sudo sed -i 's/FirewallBackend=nftables/FirewallBackend=iptables/g' /etc/firewalld/firewalld.conf
sudo systemctl restart firewalld docker

来源:

我试图更改docker compose网络时遇到此问题,为了修复此问题,我删除了所有未使用的网络


docker network ls
从您的容器中,可以尝试并卷曲该命令的结果吗?结果是
172.17.0.1
即网桥IP地址。也许你可以像我在中建议的那样使用--host?我需要能够通过它的公共IP访问它。我在问题中更详细地描述了这个问题。我可以通过代理容器名而不是公共主机名(使用Rancher)来解决它。谢谢,这个解决方案解决了我的连接问题。
NETWORK ID     NAME                DRIVER    SCOPE
970599083e1f   bridge              bridge    local
dddff9d5ec3e   host                host      local
15a80e0436c2   none                null      local