我第一次尝试使用 Docker,并试图让 Spring Boot Web 应用程序在 Docker 容器中运行。我正在构建应用程序(将其打包到一个独立的 jar 中),然后将其添加到 Docker 映像中(这是我想要的)。
你可以在 GitHub 上的这个Bootup repo中找到我的SSCCE,其 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
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)
然后docker exec
'd进入容器并运行另一个netstat
:
CONTAINER:
netstat -an | grep 9200
bash: netstat: command not found
更新照片:
我的浏览器(Chrome)的图片指向http://localhost:9200
:
源代码图片位于http://localhost:9200
:
Chrome 开发者工具检查页面的图片http://localhost:9200
:
Network
Chrome 开发者工具中的选项卡图片:
这到底是怎么回事?!?!?根据消息来源,浏览器应该正在渲染我的Well hello there,来自 Dockerland!留言就好了。根据实际浏览器页面,好像是网络错误。根据 Chrome 开发者工具,我的应用程序正在返回各种 HTML/CSS/JS 内容,这些内容甚至不属于我的应用程序(查看源代码,自己看看)!!!