使用Docker映射Compute Engine中的端口

时间:2018-09-10 20:28:45

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

我有一个在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的容器优化操作系统。

4 个答案:

答案 0 :(得分:1)

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

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

粗略的概述(您需要对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停止时,启动脚本就停止了。

答案 1 :(得分:0)

改为在自定义运行时中使用App Engine灵活环境。 App Engine灵活的环境专门用于在Compute Engine上运行容器。您所要做的就是确保您的Spring Boot应用程序侦听端口8080,并且Dockerfile包括“ EXPOSE 8080”行。 参见custom runtimes documentation

答案 2 :(得分:0)

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

这使我可以将DNS记录映射到原始IP地址,而无需进行任何其他配置。

答案 3 :(得分:0)

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.

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