Virtual-Machines
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 上轉發埠……
我終於弄明白了。🎉
原來我試圖從 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"
然後根據該模板創建一個實例。學習萬歲!