我有一个在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的容器优化操作系统。
答案 0 :(得分:1)
您需要在将容器从端口80代理到端口9000的同一容器中设置反向代理(例如nginx)。设置完成后,您应该将防火墙打开到端口80,然后关闭9000 /其他地方。
您需要更改图像,以便入口点是您创建的脚本,该脚本同时启动代理和Java进程。如果任何一个进程失败,则脚本应该死亡,因此容器也将死亡。容器死亡后,容器优化的操作系统将重新启动它。
粗略的概述(您需要对nginx进行研究)
.... whatever ....
COPY nginx.conf /etc/nginx/nginx.conf
COPY startup.sh .
RUN chmod 777 startup.sh
ENTRYPOINT ./startup.sh
(请参阅here -n选项需要> = bash 4.3)
#! /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";
}
}
}
在上述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.
因此,计算引擎将直接在其自己的接口上公开容器端口。因此,您必须将容器配置为公开正确的端口。