Docker 容器无法连接到 Internet 上的 IP,但主机可以

Docker 容器无法连接到 Internet 上的 IP,但主机可以

我已经为此苦思冥想了一整天,希望能得到一些正确的指点。

从主机我可以顺利连接到互联网,但我启动的任何容器都无法连接。

当我运行此脚本时(172.217.170.174 是 google.com 在该主机上解析的)

#!/bin/bash

set -x

echo HOST

curl http://172.217.170.174/

echo CONTAINER

docker run --rm -ti --network bridge curlimages/curl curl -v http://172.217.170.174/

我得到这个结果:

+ echo HOST
HOST
+ curl http://172.217.170.174/
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
+ echo CONTAINER
CONTAINER
+ docker run --rm -ti --network bridge curlimages/curl curl -v http://172.217.170.174/
*   Trying 172.217.170.174:80...
* connect to 172.217.170.174 port 80 failed: Operation timed out
* Failed to connect to 172.217.170.174 port 80 after 131153 ms: Couldn't connect to server
* Closing connection 0
curl: (28) Failed to connect to 172.217.170.174 port 80 after 131153 ms: Couldn't connect to server

换句话说,从主机连接外部 IP 地址有效,但从容器连接无效。

我的 iptables 如下所示:

# Generated by iptables-save v1.8.7 on Tue Jun  6 00:02:11 2023
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-a8eda64c0e60 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-a8eda64c0e60 -j DOCKER
-A FORWARD -i br-a8eda64c0e60 ! -o br-a8eda64c0e60 -j ACCEPT
-A FORWARD -i br-a8eda64c0e60 -o br-a8eda64c0e60 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-a8eda64c0e60 ! -o br-a8eda64c0e60 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-a8eda64c0e60 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Tue Jun  6 00:02:11 2023
# Generated by iptables-save v1.8.7 on Tue Jun  6 00:02:11 2023
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-a8eda64c0e60 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-a8eda64c0e60 -j RETURN
COMMIT
# Completed on Tue Jun  6 00:02:11 2023

容器中的 resolv.conf(因为我正在连接到 IP,所以这应该没关系):

nameserver 8.8.8.8
nameserver 8.8.4.4
search .

我刚刚换了一台新机器,因为之前的那台机器开始出现确切地几周前也出现过同样的情况。我以为是更新或其他原因导致的,因为它已经用了七年了,所以我换了一个新的。我把它安装在我们办公室网络的桌子上,一切正常,但是他们一把它放到他们的网络中,同样的问题又出现了。

我已经尝试了谷歌搜索“docker 容器没有互联网”等各种搜索结果,但都没有任何帮助。

Docker 容器是否应该通过默认桥接网络进行 Internet 连接?它始终以这种方式工作,无需更改任何 Docker 或网络设置,但现在我开始怀疑自己了?

有什么指示告诉我下一步该去哪里吗?

非常感激。

我尝试过的事情:

相关内容