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

时间:2019-01-27 23:53:56

标签: docker tcp port google-compute-engine

我的帖子与this one非常相似。我有一个Docker容器,在端口3000上运行一个非常简单的node.js / express应用程序,并在启用了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,因此这没有什么区别。我读过here,我不应该在Dockerfile中公开公共端口,这样我就可以在单个VM实例上运行多个容器,这很有意义。但是仍然不确定如何将443和80映射到我的容器。有什么想法吗?

更新:

Per the Documentation

  

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

无论如何我似乎只能允许每个VM运行一个容器,所以也许我会尝试转发Dockerfile上的端口...

1 个答案:

答案 0 :(得分:1)

我终于明白了。

结果是我试图从Dockerfile内部管理端口,该端口显然无法控制主机。

因此,我给出了答案from this post

public class testGame {
    public static void main (String Args[]){
        Ball newBall = new Ball(100, 100, 50, "Yellow");
        GameArena newGame = new GameArena(200, 200);
    }
}

如下创建我的Google Compute Instance Template:

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

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