首页 > 解决方案 > Google Compute Engine App 没有监听端口 80 和 443

问题描述

我的帖子与这篇非常相似。我有一个 Docker 容器,运行一个非常简单的 node.js/express 应用程序,侦听端口 3000,在启用了 http 和 https 防火墙规则的 Google Compute Engine 上运行。

但是由于某种原因,没有进程正在侦听任何公共端口(443 和 80)。当我输入时,sudo netstat -tnlp tcp我得到:

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:5355      0.0.0.0:*         LISTEN      288/systemd-resolve 
tcp        0      0 0.0.0.0:22        0.0.0.0:*         LISTEN      296/sshd            
tcp6       0      0 :::5355           :::*              LISTEN      288/systemd-resolve 
tcp6       0      0 :::3000           :::*              LISTEN      1216/node    

当我跑步时,nmap <EXPOSED_IP>我得到:

Not shown: 993 filtered ports
PORT     STATE  SERVICE
21/tcp   open   ftp
22/tcp   open   ssh
80/tcp   closed http
443/tcp  closed https
554/tcp  open   rtsp
3389/tcp closed ms-wbt-server
7070/tcp open   realserver

我知道端口 443 或端口 80 上没有任何监听,并且我看到我的应用程序正在监听端口 3000,但我不确定如何更改/映射/公开它。我尝试将我的 docker-compose 更改为:

...

ports:
  - "80:3000"
  - "443:3000"
  - "3000:3000"
...

但这似乎不起作用。我知道我没有在 VM 中使用 docker-compose,所以它没有任何区别是有道理的。我在这里读到我不应该在 Dockerfile 中公开公共端口,这样我就可以在单个 VM 实例上运行多个容器,这是有道理的。但仍然不确定如何将 443 和 80 映射到我的容器。有任何想法吗?

更新:

根据文档

您只能为每个 VM 实例部署一个容器。如果您需要为每个虚拟机实例部署多个容器,请考虑使用 Kubernetes Engine。如果您的用例要求您在 Compute Engine 实例上部署多个容器,请联系团队。

看起来我只能在每个虚拟机上运行一个容器,所以也许我会尝试在我的 Dockerfile 上转发端口......

标签: dockertcpportgoogle-compute-engine

解决方案


我终于弄明白了。

原来我试图从 Dockerfile 中管理端口,这显然不能控制主机。

所以我包括了这篇文章的答案:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

在创建我的 Google Compute Instance Template 时:

--metadata startup-script="sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000"

然后根据该模板创建一个实例。学习万岁!


推荐阅读