无法通过 Google Cloud VM 的外部 IP 访问 nginx 容器

Posted

技术标签:

【中文标题】无法通过 Google Cloud VM 的外部 IP 访问 nginx 容器【英文标题】:Cannot access nginx container through external IP of Google Cloud VM 【发布时间】:2021-01-10 05:23:08 【问题描述】:

我有一个谷歌云虚拟机在端口 8080 上运行一个 nginx docker 容器。当我使用 curl http://localhost:8080 时,可以从机器内访问 nginx 页面。但是,当我打开机器的外部 IP(使用端口 8080)时,我在 chrome 中得到了 ERR_CONNECTION_REFUSED。我在创建 VM 时启用了 http/https 防火墙选项。

这是我使用的 docker run 命令和本地主机上的 curl 检查:

aayush_pathak15@instance-1:~/devops-environment$ sudo docker run -d -p 8080:80 nginx
f398231940eeb7194e0b4deb50936d7581cf32a451583e162cac40e829f9ebff
aayush_pathak15@instance-1:~/devops-environment$ curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body 
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
aayush_pathak15@instance-1:~/devops-environment$ 

这是我的虚拟机上所有端口的列表(以及监听端口 8080 的 docker)

aayush_pathak15@instance-1:~/devops-environment$ sudo netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      583/sshd            
tcp6       0      0 :::8080                 :::*                    LISTEN      8936/docker-proxy   
tcp6       0      0 :::22                   :::*                    LISTEN      583/sshd            
udp        0      0 0.0.0.0:68              0.0.0.0:*                           310/dhclient        
udp        0      0 127.0.0.1:323           0.0.0.0:*                           402/chronyd         
udp6       0      0 ::1:323                 :::*                                402/chronyd  

我尝试添加另一个防火墙规则以允许所有端口(请忽略不相关的命名“jenkins”)

以下是我的机器详细信息

这可能与“IP 转发”关闭有关吗? (见上图)

【问题讨论】:

我们可以看看你是如何部署 nginx 容器的吗?您使用了什么工具,节点上的命令行,Google Cloud Console?您对此进行了哪些论证? 我只是简单地执行了“docker run -d -p 8080:80 nginx”,容器成功启动并运行。冰壶 localhost:8080 给了我正确的 nginx 默认页面。但它没有在我的浏览器上使用 vm 的外部 IP 打开 Nginx 是否在监听 localhost0.0.0.0?在您的问题中显示配置文件。 @JohnHanley Nginx 正在我的 VM 上监听 localhost。我在我的问题中包含了一个 curl 输出以及所有开放端口的列表(显示端口 8080 肯定被 docker 使用)。如果这回答了您的问题,请告诉我 如果配置 Nginx 监听localhost,则无法从 Internet 访问该服务。将监听地址改为0.0.0.0localhost 只能通过回送设备在操作系统内部访问。将localhost 视为操作系统内部的专用网络。 en.wikipedia.org/wiki/Localhost 【参考方案1】:

根据Docker docs docker run 语句中的-p 8080:80 参数告诉它将主机上的端口 8080 发布到容器上的端口 80,因此在这种情况下,您可以通过访问节点的外部来从外部访问它8080 端口上的 IP。34.68.171.6:8080

【讨论】:

道歉。我也将端口 8080 与外部 IP 一起使用。我已经编辑了问题以澄清这一点。【参考方案2】:

我使用

运行我的容器
sudo docker run -d -p [Internal IP]:8080:80 nginx

我可以访问 http://[External IP]:8080 上的 nginx 页面

还需要添加问题中提到的防火墙规则。

【讨论】:

以上是关于无法通过 Google Cloud VM 的外部 IP 访问 nginx 容器的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Google Cloud DL VM 中使用 Theano Keras 后端

Google Cloud VM上在线扩硬盘

创建 Google Cloud Image 失败并显示“无法获取资源:内部错误”

Azure VM Cloud - 如何从本地访问 Sitecore 实例

如何在 Google Cloud Logs Explorer 中查询 VM 合规性报告

如何在 Google Cloud Dataflow 中设置到外部数据库服务器的 SSH 隧道?