【问题标题】:Mapping ports in Compute Engine with Docker使用 Docker 映射 Compute Engine 中的端口
【发布时间】:2019-02-15 07:34:11
【问题描述】:

我有一个在 Google Compute Engine 上运行的 docker 映像。该镜像包含一个在端口 9000 上运行的 Spring Boot 应用程序。

它在http://<ip>:9000 上公开,我可以访问没有任何问题。我正在尝试将公开端口配置为80,以便将 DNS 记录配置为仅指向 IP 地址。

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

那么我需要在 Spring Boot 设置中重新映射端口吗?还是在 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 的容器优化操作系统。

【问题讨论】:

  • 您是否尝试过在启动脚本中指定docker run -p 9000:80cloud.google.com/compute/docs/startupscript 另外,尝试仅通过 SSH 进入实例并运行 curl localhost
  • 没有启动脚本。我正在通过 Compute Engine 网络控制台运行容器。如果我有能力添加这个参数,它肯定会解决我的问题。但我不确定如何......
  • 我链接到的文档页面有一个 Compute Engine Web 控制台的屏幕截图,您可以在其中添加启动脚本。你看到了吗?

标签: docker spring-boot google-cloud-platform google-compute-engine


【解决方案1】:

您需要在同一个容器中设置一个反向代理(如 nginx),该容器将从端口 80 代理到端口 9000。设置完成后,您应该打开防火墙到端口 80 并关闭防火墙 9000/其他任何地方。

您需要更改您的图像,以便入口点是您创建的脚本,它启动代理和您的 java 进程。如果任一进程失败,您的脚本应该会死掉,因此您的容器也会死掉。当您的容器死机时,Container Optimized OS 将重新启动它。

作为一个粗略的大纲(您需要对 nginx 进行研究):

Dockerfile

.... whatever ....
COPY nginx.conf /etc/nginx/nginx.conf
COPY startup.sh .
RUN chmod 777 startup.sh
ENTRYPOINT ./startup.sh

startup.sh

(请参阅here -n 选项需要 >= bash 4.3)

#! /bin/bash

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

nginx.conf

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";
    }
  }
}

编辑

在上面的 nginx.conf 文件中添加了daemon off; 行,这样 nginx 就不会守护进程。这允许启动脚本在 nginx 停止时停止。

【讨论】:

    【解决方案2】:

    改为使用具有自定义运行时的 App Engine 柔性环境。 App Engine 柔性环境专为在 Compute Engine 上运行容器而设计。您所要做的就是确保您的 Spring Boot 应用程序侦听端口 8080,并且Dockerfile 包含“EXPOSE 8080”行。 见custom runtimes documentation

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        tldr:你不能

        当你以这种方式在计算引擎中部署容器时,docker网络在host network mode,这意味着(doc):a container shares the host's network stack and all interfaces from the host are available to the container.

        所以计算引擎会直接暴露容器端口,在他自己的接口上。所以你必须配置你的容器来暴露正确的端口。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-28
          • 2017-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-17
          • 1970-01-01
          相关资源
          最近更新 更多