Mac主机不喜欢Docker容器端口转发

sme*_*eeb 6 java macos portforwarding docker docker-networking

我是第一次尝试使用Docker,我正试图让一个Spring Boot Web应用程序在Docker容器中运行.我正在构建应用程序(将其打包成一个独立的jar),然后将其添加到Docker镜像(这就是我想要的).

你可以在GitHub上的这个Bootup回购中找到我的SSCCE,它的README具有重现我所看到的所有指令.但基本上:

  • 我将Web应用程序构建到jar中
  • 运行docker build -t bootup .哪个成功
  • 运行docker run -it -p 9200:9200 -d --name bootup bootup然后容器似乎启动就好了,正如docker ps下面输出的证据
  • 但是,当我指向浏览器时http://localhost:9200,我什么都没得到

docker ps 输出:

CONTAINER ID        IMAGE               COMMAND                  CREATED
a8c4ee64a1bc        bootup              "/bin/sh -c 'java -ja"   2 days ago

STATUS              PORTS                    NAMES
Up 12 seconds       0.0.0.0:9200->9200/tcp   bootup
Run Code Online (Sandbox Code Playgroud)

Web应用程序配置为在端口9200上运行,而不是 Java默认值8080.您可以通过运行在docker之外运行应用程序(因此,只在本地主机上)来自行查看./gradlew clean build && java -jar build/libs/bootup.jar.

据我所知,我的主机上没有运行阻止端口的防火墙(我在Mac 10.11.5上验证System Preferences >> Security & Privacy >> Firewall已关闭).

谁能发现我出错的地方?


更新:

我跑了一个curl,netstat然后lsof在主持人身上:

HOST:
curl http://localhost:9200
curl: (52) Empty reply from server

netstat -an | grep 9200
tcp6       0      0  ::1.9200               *.*                    LISTEN     
tcp4       0      0  *.9200                 *.*                    LISTEN 

lsof -n -i4TCP:9200 | grep LISTEN
com.docke 2578 myuser   19u  IPv4 <someHexNumber>      0t0  TCP *:wap-wsp (LISTEN)
Run Code Online (Sandbox Code Playgroud)

然后docker exec'进入容器并运行另一个netstat:

CONTAINER:
netstat -an | grep 9200
bash: netstat: command not found
Run Code Online (Sandbox Code Playgroud)

更新w /照片:

我的浏览器(Chrome)图片指出http://localhost:9200:

在此输入图像描述

图片源代码http://localhost:9200:

在此输入图像描述

Chrome Developer Tools检查页面的图片http://localhost:9200:

在此输入图像描述

NetworkChrome开发者工具中标签的图片:

在此输入图像描述

这到底是怎么回事?!?!?根据消息来源,浏览器应该从Dockerland渲染我的井!消息就好了.根据实际的浏览器页面,看起来有网络错误.根据Chrome开发者工具,我的应用程序正在返回各种HTML/CSS/JS内容,这些内容甚至远离我的应用程序(请查看源代码,亲自查看)!

Shi*_*z.M 1

要在这里添加另一个答案,因为我看到了与您发布的 Github Repo 相关的内容:

所以该存储库是一个带有 application.yml 文件的 Spring Boot 存储库。

你的 Dockerfile 看起来像这样:

FROM openjdk:8

RUN mkdir /opt/bootup

ADD build/libs/bootup.jar /opt/bootup
WORKDIR /opt/bootup
EXPOSE 9200
ENTRYPOINT java -jar bootup.jar
Run Code Online (Sandbox Code Playgroud)

即将构建的 jar 添加到图像中。如果我的理解是正确的,则该 jar不包含 application.yml因为:

  • 它不是构建的一部分(gradle 仅打包 src/main)。它位于项目根文件夹中
  • 它没有显式添加到 Docker 中

因此,人们可以假设您的应用程序目前实际上在 8080(默认)上运行?

可以尝试的几个选项:

  • 尝试暴露 8080 而不是 9200(或两者都暴露),看看这是否有区别?
  • 入口点命令可以附加端口--server.port=9200
  • application.yml 文件应添加到图像中(您可能需要添加一个参数才能正确引用它)[ ADD application.yml /opt/bootup,在第一个ADD命令之后]
  • 将 application.yml 文件包含在 src/main/resources 中,以便 Spring Boot 可以自动获取它。

参考

Spring Boot 参考文档关于外部配置的加载顺序