使用Docker映射计算引擎中的端口

使用Docker映射计算引擎中的端口,docker,spring-boot,google-cloud-platform,google-compute-engine,Docker,Spring Boot,Google Cloud Platform,Google Compute Engine,我有一个docker图像在Google计算引擎上运行。该映像包含在端口9000上运行的Spring引导应用程序 它在http://:9000上公开,我可以毫无问题地访问它。我试图将公开端口配置为80,以便将DNS记录配置为仅指向IP地址 我的问题是如何实现这一点,因为文档让我感到困惑。我使用在线GCP控制台(web界面)进行部署,没有字段指定docker run-p 9000:80命令来解决我的问题(如果有,请纠正我) 那么我需要在Spring引导设置中重新映射端口吗?还是在Docker容器内?

我有一个docker图像在Google计算引擎上运行。该映像包含在端口9000上运行的Spring引导应用程序

它在http://:9000上公开,我可以毫无问题地访问它。我试图将公开端口配置为
80
,以便将DNS记录配置为仅指向IP地址

我的问题是如何实现这一点,因为文档让我感到困惑。我使用在线GCP控制台(web界面)进行部署,没有字段指定
docker run-p 9000:80
命令来解决我的问题(如果有,请纠正我)

那么我需要在Spring引导设置中重新映射端口吗?还是在Docker容器内?还是我应该在GCP中配置一些转发规则?谢谢你的澄清

我的
DOCKER
文件如下所示:

FROM gcr.io/distroless/java
VOLUME /tmp
ADD build/libs/*.jar app.jar
ENV JAVA_OPTS=""
ENTRYPOINT ["java","-jar","app.jar"]

我使用的是来自GCP的容器优化操作系统。

您需要在将从端口80代理到端口9000的同一容器中设置反向代理(如nginx)。设置完毕后,应打开端口80的防火墙并关闭9000/上的防火墙

您需要更改映像,以便入口点是您创建的脚本,该脚本将启动代理和java进程。如果任何一个进程失败,您的脚本都将失效,因此您的容器也将失效。当容器死亡时,容器优化操作系统将重新启动它

大致概述(您需要对nginx进行研究):

Dockerfile startup.sh (请参见-n选项要求>=bash 4.3)

nginx.conf 编辑
添加了
守护进程关闭行到上面的nginx.conf文件,这样nginx就不会进行后台监控。这允许启动脚本在nginx停止时停止。

使用带有自定义运行时的App Engine flexible environment。 App Engine flexible environment是专门为在计算引擎上运行容器而设计的。您所要做的就是确保Spring Boot应用程序在端口8080上侦听,
Dockerfile
包含行“EXPOSE 8080”。
请参阅。

我通过将Spring引导端口映射到生产配置文件中的端口80,解决了我的问题

这允许我将DNS记录映射到原始IP地址,而无需进行任何额外配置。

tldr:您不能这样做

以这种方式在compute engine中部署容器时,docker network处于主机网络模式,这意味着():
容器共享主机的网络堆栈,并且主机的所有接口都可用于容器。


所以计算引擎将直接在自己的接口上公开容器端口。因此,您必须配置容器以公开正确的端口。

您是否尝试在启动脚本中指定
docker run-p 9000:80
?另外,尝试将SSH连接到实例中并运行
curl localhost
。没有启动脚本。我正在通过计算引擎web控制台运行容器。如果我有能力添加这个参数,它肯定会解决我的问题。但我不确定我链接到的文档页面上有一个ComputeEngineWeb控制台的屏幕截图,您可以在其中添加启动脚本。你看到了吗?
.... whatever ....
COPY nginx.conf /etc/nginx/nginx.conf
COPY startup.sh .
RUN chmod 777 startup.sh
ENTRYPOINT ./startup.sh
#! /bin/bash

{ nginx; } &
{ java -jar app.jar; } &
wait -n
pkill -P $$
daemon off;

http {

  server {
    listen 80;
    server_name _;

    location / {
      proxy_pass http:localhost:9000;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }
  }
}