我第一次尝试使用Docker,并且正在尝试使用Spring Boot Web应用程序在Docker容器中运行。我正在构建应用程序(它打包成一个独立的jar)和然后将它添加到Docker镜像(这就是我想要的)。
您可以在此SSCCE找到我的Bootup repo on GitHub,其README具有重现我所看到的所有说明。但基本上是:
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.您可以通过在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
进入容器并运行另一个netstat
:
CONTAINER:
netstat -an | grep 9200
bash: netstat: command not found
更新w /照片:
我的浏览器(Chrome)图片指向http://localhost:9200
:
http://localhost:9200
的源代码图片:
Chrome Developer Tools检查http://localhost:9200
页面的图片:
Chrome开发者工具中Network
标签的图片:
这里到底发生了什么?!?!?根据消息来源,浏览器应该从Dockerland渲染我的好吧你好!消息就好了。根据实际的浏览器页面,看起来有网络错误。根据Chrome开发者工具,我的应用程序返回各种HTML / CSS / JS内容,甚至远程我的应用程序(查看源代码,自己查看)!
答案 0 :(得分:2)
Dockerfile不会向守护进程公开9200。添加
reverseUint32(0xfc66feff)
到EXPOSE 9200
之前的Dockerfile
答案 1 :(得分:2)
假设您使用的是Docker Toolbox而不是beta ...
正确公开端口有三个步骤:
EXPOSE 8080
其中8080只是 Dockerfile 这适用于使用Docker Toolbox的Windows和OSX。 Linux并不使用Oracle VirtualBox来运行docker,因此那些主机不需要执行第三点
答案 2 :(得分:2)
我在OSX上的Docker 1.12上按原样运行你的repo。
如果仔细查看容器启动:
2016-08-29 20:52:31.028 INFO 5 --- [ main] o.eclipse.jetty.server.ServerConnector : Started ServerConnector@47949d1a{HTTP/1.1}{0.0.0.0:8080}
2016-08-29 20:52:31.033 INFO 5 --- [ main] .s.b.c.e.j.JettyEmbeddedServletContainer : Jetty started on port(s) 8080 (http/1.1)
虽然application.yml
和Dockerfile都包含9200
,但应用程序从8080
开始
答案 3 :(得分:1)
要在这里添加另一个答案,因为我看到了与您发布的Github Repo相关的内容:
所以repo是一个带有application.yml文件的spring boot repo。
您的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
将构建的jar添加到图像中。如果我的理解是正确的,那么jar 不包括application.yml ,因为:
因此,可以假设您的应用目前实际上是在8080(默认值)上运行吗?
可以尝试的几个选项:
--server.port=9200
ADD application.yml /opt/bootup
,在第一个ADD
命令之后<强>参考强>
答案 4 :(得分:1)