主机无法访问Docker容器内部

时间:2016-07-06 14:48:49

标签: curl docker

我在主机183.83.83.83上有一个泊坞广告容器 子域mycontainer.example.com的A记录指向此IP。

183.83.83.83mycontainer.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/apimycontainer.example.com:1337/api/v1的所有API请求。但是它无法代理API请求,因为我在此主机上运行的所有容器中都收到错误Host is unreachable

5 个答案:

答案 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 --helpnetfilter网站。

答案 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> <- 这将删除一个网络