我设置了一个 Google Compute Engine (GCE) 实例,并为其分配了静态 IP 地址。我的目标是在该实例上运行 osticket 的 Docker 容器。
我正常启动了 Docker 容器。我可以使用 Lynx 从容器内运行的 bash shell 进行连接(lynxhttp://0.0.0.0)。
请理解我不是网络专家。在阅读了有关 Docker 网络的资料后,我在实例上使用了这个建议的 iptables 命令 (iptables -t nat -L -n),发现了一个 IP 地址 (172.17.0.7),但其用途对我来说是个谜:
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.7:80
但是,我继续前进,在实例 shell 中(容器外部),我运行了 Lynx 并连接到该 IP 地址(172.17.0.7:80),然后它连接到了 osticket 网站!我假设它连接到了容器。
iptables 的完整输出为:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.7 172.17.0.7 tcp dpt:80
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.7:80
我的问题是:
现在我知道 docker 容器正在运行,而且我可以访问它(至少从实例内部并通过那个神秘的地址),那么 GCE 外部 IP 地址应该如何通过实例连接到该容器呢?
它还不能正常工作。尝试从我的笔记本电脑浏览器连接到该外部 IP,连接到端口 80 时,我收到:“无法访问此站点。XXX.XXX.XXX.XXX 拒绝连接。”连接到端口 8080 时,我收到“无法访问此站点。XXX.XXX.XXX.XXX 响应时间过长。”
我找不到可以使其连接的配置修复程序。我可以成功 ping 该外部地址,所以我知道它正在连接到某个东西。我确信静态 IP 已分配给 osticket GCE 实例。
补充一点:之前,我安装了另一个 GCE,其中包含一个 Docker 容器(Mattermost),该容器具有类似的外部静态 IP。外部 IP 起作用了!它顺利连接到容器。我希望再次出现同样的情况。没有运气。
[编辑:修正了一个错字。]
答案1
您需要在以下位置创建防火墙规则https://console.cloud.google.com/networking/firewalls/list打开端口 80 以允许外部流量入站。