无法通过 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 是否在监听localhost
或 0.0.0.0
?在您的问题中显示配置文件。
@JohnHanley Nginx 正在我的 VM 上监听 localhost。我在我的问题中包含了一个 curl 输出以及所有开放端口的列表(显示端口 8080 肯定被 docker 使用)。如果这回答了您的问题,请告诉我
如果配置 Nginx 监听localhost
,则无法从 Internet 访问该服务。将监听地址改为0.0.0.0
。 localhost
只能通过回送设备在操作系统内部访问。将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 Image 失败并显示“无法获取资源:内部错误”
Azure VM Cloud - 如何从本地访问 Sitecore 实例