How To Dockerize Java Application Maven with Dockerfile
Dockerize Java Application Maven: In this tutorial, we will dockerize a basic Java maven(quickstart) application.
Docker solves the problem of “it runs on my local machine”. Instead of delivering jars/wars, you deliver “images”.
Before beginning with this tutorial, please make sure you have Docker Engine installed in your system. Also, create an account on DockerHub.
Clone Project from Git Repo
Download the project files below from the GitHub URL.
What is a dockerfile?
Dockerfile is a plain text file with no extension present at the root directory of an application. This file contains a procedural script that needs to execute for the creation of the container that can build and run the application.
Dockerfile tells the Docker Engine the following information:
- What environment is required in a container for building the application?
- What environment is required in a container for running the application?
- What will the container look like and what all files it will have?
There is much other information that can be specified in dockerfile like port number, but for the scope of this tutorial, we will discuss only the necessary components required to run a simple Java application.
Create a Docker File
Create a file “
dockerfile” in the root directory.
Below are some of the basic instructions that are used in dockerfile.
FROM: Tells the Docker to use the mentioned image as the base image. This image will be pulled from the docker hub.
AS: Is used to give an alias to imported images.
COPY: Copies files/directory from source to destination path.
RUN: Runs any UNIX command in the container’s terminal/command prompt.
CMD: Provides the facility to run UNIX commands to start the container. This can be overridden upon executing the docker run command.
ENV: Sets environment variables in the container’s path.
#: Is used to put a comment in the dockerfile.
This is the dockerfile that we will use for our application:
FROM maven:3.5.4-jdk-8-alpine as maven COPY ./pom.xml ./pom.xml COPY ./src ./src RUN mvn dependency:go-offline -B RUN mvn package FROM openjdk:8u171-jre-alpine WORKDIR /adevguide COPY --from=maven target/SimpleJavaProject-*.jar ./SimpleJavaProject.jar CMD ["java", "-jar", "./SimpleJavaProject.jar"]
Let’s discuss the significance of each line.
FROM maven:3.5.4-jdk-8-alpine as maven
maven:3.5.4-jdk-8-alpine image from the docker hub and refer it as maven. This image has all the files required to build a maven application. Maven alpine is a minimized version of maven.
COPY ./pom.xml ./pom.xml
COPY ./src ./src
Copies the required files from the user system to Image. Docker will copy the src folder and pom.xml file into the image.
RUN mvn dependency:go-offline -B
Maven command to resolve application dependencies present in pom.xml.
RUN mvn package
Maven command to build an application using maven.
Pull openjdk image from docker’s hub public repository. openjdk8 alpine is a minimized version of openjdk8.
Change the working directory to /adevguide
COPY --from=maven target/SimpleJavaProject-*.jar ./adevguide/SimpleJavaProject.jar
Copies build the jar from the previous maven image and put it in the working directory.
CMD ["java", "-jar", "./adevguide/SimpleJavaProject.jar"]
Execute the command in the CMD.
We have learned how to create dockerfile in Dockerize Java Application Maven tutorial, let’s learn some basic docker commands.
docker build -t simplejavaproject .
docker build is used to build an application. -t specifies the image name. Image tag can be specified using the colon (:) ex simplejavaproject:2020. By default, the latest is used as a tag.
The dot(.) at end of the command specifies that build needs to happen in the current directory.
docker images display all images in the local docker engine.
docker run -i simplejavaproject
docker run is used to run an application. -i activate the interactive mode, which means STDIN remains attached to the terminal
The video explains an approach to Dockerize Java Application Maven.