我第一次尝试使用 Docker,并试图让 Spring Boot Web 应用程序在 Docker 容器中运行。我正在构建应用程序(将其打包成一个独立的 jar)并然后将其添加到 Docker 镜像中(这是我想要的)。
你可以找到我的SSCCE在此 Bootup repo on GitHub ,其 README 包含重现我所看到内容的所有说明。但基本上:
- 我将网络应用程序构建到一个 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
网络应用程序是 configured to run on port 9200 ,不是 Java 默认值 8080。您可以通过运行 ./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)
然后docker exec
进入容器并运行另一个netstat
:
CONTAINER:
netstat -an | grep 9200
bash: netstat: command not found
更新照片:
我的浏览器 (Chrome) 的图片指向 http://localhost:9200
:
源代码图片在http://localhost:9200
:
Chrome 开发者工具在 http://localhost:9200
处检查页面的图片:
Chrome 开发者工具中 Network
标签的图片:
这到底是怎么回事?!?!?根据消息来源,浏览器应该正在渲染我的你好,来自 Dockerland! 消息就好了.根据实际浏览器页面,好像是网络错误。根据 Chrome 开发者工具,我的应用程序正在返回各种 HTML/CSS/JS 内容,这些内容甚至 远程 不属于我的应用程序(查看源代码,自己查看)!!!
最佳答案
Dockerfile 不会将 9200 暴露给守护进程。添加
EXPOSE 9200
到 ENTRYPOINT
关于java - Mac 主机不喜欢 Docker 容器端口转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39166038/