我设置了一个分配有静态 IP 地址的 Google Compute Engine (GCE) 实例。我的目标是在该实例上为 osticket 运行 Docker 容器。
我像往常一样启动了 Docker 容器。我可以使用 Lynx 从容器内运行的 bash shell 进行连接(lynx http://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
但是,我向前冲,在实例外壳内(容器外)我运行 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 实例。
一点额外的 bg:早些时候,我安装了另一个带有 Docker 容器(Mattermost)的 GCE,它具有类似的外部静态 IP。外部IP有效!它顺利地连接到容器。我希望同样的情况再次发生。没运气。
[编辑:修正了一个错字。]
您需要在https://console.cloud.google.com/networking/firewalls/list创建防火墙规则,以打开端口 80 用于入站外部流量。