我的帖子与这个。我有一个 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"
...
但那似乎不起作用。我知道我没有在虚拟机中使用docker-compose,所以这没什么区别。我读到这里我不应该在 Dockerfile 中公开公共端口,这样我就可以在单个 VM 实例上运行多个容器,这是有道理的。但仍然不确定如何将 443 和 80 映射到我的容器。有什么想法吗?
更新:
根据文档:
您只能为每个虚拟机实例部署一个容器。如果您需要为每个虚拟机实例部署多个容器,请考虑使用 Kubernetes Engine。如果您的用例要求您在 Compute Engine 实例上部署多个容器,请联系团队。
无论如何,看起来我只被允许在每个虚拟机上运行一个容器,所以也许我会尝试在我的 Dockerfile 上转发端口......
答案1
我终于弄明白了。