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 映射到我的容器。有什么想法吗?
更新:
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"
然后基于该模板创建了一个实例。学习万岁!
我的 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 映射到我的容器。有什么想法吗?
更新:
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"
然后基于该模板创建了一个实例。学习万岁!