Virtual-Machines

Google Compute Engine App 沒有監聽埠 80 和 443

  • January 30, 2019

我的文章與這篇非常相似。我有一個 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 上轉發埠……

我終於弄明白了。🎉

原來我試圖從 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"

然後根據該模板創建一個實例。學習萬歲!

引用自:https://serverfault.com/questions/951040