I am experimenting with Docker for the first time, and am trying to get a Spring Boot web app to run inside a Docker container. I am building the app (which packages up into a self-contained jar) and then adding it to the Docker image (which is what I want).
- I build the web app into a jar
docker build -t bootup .which succeeds
docker run -it -p 9200:9200 -d --name bootup bootupand then container seems to start up just fine, as is evidence by the
docker psoutput below
- However, when I point a browser to
http://localhost:9200, I get nothing
docker ps output:
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
The web app is configured to run on port 9200, not the Java default of 8080. You can see this for yourself by running the app outside of docker (so, just locally on you host machine) by running
./gradlew clean build && java -jar build/libs/bootup.jar.
To my knowledge, there is no Firewall running on my host that would be blocking ports (I am on Mac 10.11.5 and verified that
System Preferences >> Security & Privacy >> Firewall is turned off).
Can anyone spot where I’m going awry?
I ran a
lsof on the host:
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 into the container and ran another
CONTAINER: netstat -an | grep 9200 bash: netstat: command not found
Update w/ photos:
Picture of my browser (Chrome) pointed to
Picture of the source code at
Picture of Chrome Developer Tools inspecting the page at
Picture of the
Network tab in Chrome Developer Tools:
What the heck is going on here?!?!? According to the source, the browser should be rendering my Well hello there, from Dockerland! message just fine. According to the actual browser page, it looks like there is a networking error. And according to Chrome Developer Tools, my app is returning all sorts of HTML/CSS/JS content that is not even remotely apart of my app (check out the source code, see for yourself)!!!
Going to add another answer here because I saw something related to the Github Repo that you posted:
So the repo is a spring boot repo with an application.yml file.
Your Dockerfile looks like this:
FROM openjdk:8 RUN mkdir /opt/bootup ADD build/libs/bootup.jar /opt/bootup WORKDIR /opt/bootup EXPOSE 9200 ENTRYPOINT java -jar bootup.jar
Which is adding the built jar to the image. If my understanding is correct, the jar does not include application.yml because:
- It is not part of the build (gradle would package the src/main only). It is sitting on the project root folder
- It is not explicitly added to Docker
So therefore one can assume that your app is actually running on 8080 (the default) at the moment?
A couple of options that one could try:
- Try exposing 8080 instead of 9200 (or expose both) and see if that makes a difference?
- The entrypoint command can append the port
- The application.yml file should be added to the image (you might need to add an argument to reference it properly) [
ADD application.yml /opt/bootup, after first
- Include the application.yml file in src/main/resources so that spring boot can pick it up automatically.