Google Compute Engine 应用没有监听端口 80 和 443

Google Compute Engine App nothing listening on ports 80 and 443

我的 post 与 this one 非常相似。我有一个 Docker 容器 运行ning 一个非常简单的节点。js/express 应用程序侦听端口 3000,运行ning 在 Google Compute Engine 上使用 http 和 https防火墙规则已启用。

出于某种原因,但是没有进程正在侦听任何 public 端口(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,所以这没有什么区别是有道理的。我读过 here 我不应该在 Docker 文件中公开 public 端口,这样我就可以 运行 单个 VM 实例上的多个容器,这是有道理的。但仍然不确定如何将 443 和 80 映射到我的容器。有什么想法吗?

更新:

Per the Documentation:

You can only deploy one container for each VM instance. Consider Kubernetes Engine if you need to deploy multiple containers per VM instance. Contact the team if your use case requires you to deploy multiple containers on a Compute Engine instance.

看起来我只允许 运行 每个 VM 一个容器所以也许我会尝试在我的 Docker 文件上转发端口...

我终于明白了。

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

所以我包含了答案 from this post:

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

在创建我的 Google 计算实例模板时:

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

然后基于该模板创建了一个实例。学习万岁!