首页 > 解决方案 > 如何访问在 docker 容器中运行的 spring 应用程序?

问题描述

我有以下 docker 文件...

FROM openjdk:11-jdk-slim
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Dexternal.config.active='false'","-jar","/app.jar"]

和弹簧配置...

docker {
  springBootApplication {
    baseImage = 'openjdk:11-jdk-slim'
    ports = [9090, 8080]
    tag = 'app:0.2'
  }
}

一切似乎都开始了文件,我看到了

Started Application in 8.743 seconds (JVM running for 9.153)

我明白了……

f46b4cbfa799        646eced45077        "java -jar /app/simp…"   15 minutes ago      Up 15 minutes                 8080/tcp, 9090/tcp   mystifying_kirch

但是当我docker inspect <imageId> | grep "IPAddress"像这样在浏览器中运行并输入该地址时,http://<IP>:8080出现超时错误。我知道我可以在运行时使用端口映射,但是有没有一种方法可以在不映射到我的本地主机的情况下做到这一点?

我也试过这个......

curl 172.17.0.2:8080
curl: (7) Failed to connect to 172.17.0.2 port 8080: Operation timed out

所以不是浏览器。

也试图像这样映射它......

0.0.0.0:8080->8080/tcp, 9090/tcp

但是 localhost:8080 (或 IP 地址)发送一个空响应“没有发送任何数据”。

标签: docker

解决方案


对 Web 服务(此处为 Java Spring Boot 应用程序)进行 docker 化时发生的典型问题是该localhost地址不应使用并替换为0.0.0.0.

有关更多详细信息,请参阅此SO 答案,该答案很好地解释localhost了 Docker 上下文中的含义。

关于0.0.0.0地址,这个特殊的 IP在这里只是意味着“任何 IPv4 地址”。

最后,正如 OP 在评论中确认的那样,对于 Spring Boot,只需 server.address在文件中分配属性application.properties即可实现此目的(参见文档)。


推荐阅读