Before reading this post, you are expected to be familiar with deploying a web-based application to Tomcat or any similar web container. To add another way of deploying your web applications, I am going to show you how to deploy a war file to Tomcat running on Docker.
Table of Contents
Introduction
Instead of running your web server, i.e. Apache Tomcat, in your laptop, we can try to run it on a docker container. Why do we need to do so? As the first aim of Docker design, we want to shift our current development to teammates as soon as possible. Therefore, having your web application deployed on a docker container is probably easy to share the result to your colleagues to make sure they can see what you have mentioned. Let’s give an example.
Your work is in progress. You want to show the current state of your work to your inline manager so that he can understand your progress. If he is a technical lead, the easy way of running your application on his laptop is to download or git your project and run the application on a docker container.
[box type=”warning” align=”aligncenter” width=”5″ ]In this post, I don’t want to go deeply how to create a web application which is deployable on Tomcat. The demo project will give you a war file to practice deployment. If you want to learn more about how to create war files and deploy them on Tomcat, I recommend you to read a series of weblogs about building web-based applications with Grails, Spring Boot on this forum.[/box]
Pre-requisites
To complete the demo project addressed below, your system has to be installed the following tools:
Baby steps and demo project
Don’t want to waste your priceless time, let’s get started now.
Step 1: Write a Dockerfile file
This step will help us to perform the second step below. Naturally, your web application has to be deployed on Tomcat so the docker image must be built from Tomcat image or a similar one. In this demo, we will see how a Grails-based application deployed on Docker Tomcat container. The war coming along with the demo is generated in Grails. The Dockerfile sample looks like the one below.
#FROM tomcat:8.0-alpine FROM tomcat:7-jdk8-openjdk LABEL maintainer="admin@itersdesktop.com" ADD grailsapp.war /usr/local/tomcat/webapps/ EXPOSE 8080 CMD ["catalina.sh", "run"]
The key thing here is to determine in which Tomcat version will be pulled to make your apps working properly. You can use either the docker hub or docker command to search your images of interest.
The command to search images is
docker search tomcat
# search docker images which name has tomcat
This command will result in the available images which you can refer to your Dockerfile. The result is shown on the screenshot below.
Step 2: Build a docker image for your deployment
To build a docker image, you have to run the command docker build
that Docker engine provides to their users. The following command will build a docker image tagged tnguyenv/grails-based-app
docker build -t tnguyenv/grails-based-app . Sending build context to Docker daemon 101.2MB Step 1/5 : FROM tomcat:8.0-alpine 8.0-alpine: Pulling from library/tomcat 4fe2ade4980c: Pulling fs layer 6fc58a8d4ae4: Pulling fs layer 7d9bd64c803b: Pulling fs layer a22aedc5ac11: Pulling fs layer 5bde63ae3587: Pulling fs layer 69cb0c9b940a: Pulling fs layer 5bde63ae3587: Waiting 69cb0c9b940a: Waiting a22aedc5ac11: Waiting 6fc58a8d4ae4: Verifying Checksum 6fc58a8d4ae4: Download complete a22aedc5ac11: Verifying Checksum a22aedc5ac11: Download complete 4fe2ade4980c: Verifying Checksum 4fe2ade4980c: Download complete 4fe2ade4980c: Pull complete 6fc58a8d4ae4: Pull complete 69cb0c9b940a: Verifying Checksum 69cb0c9b940a: Download complete 5bde63ae3587: Verifying Checksum 5bde63ae3587: Download complete 7d9bd64c803b: Verifying Checksum 7d9bd64c803b: Download complete 7d9bd64c803b: Pull complete a22aedc5ac11: Pull complete 5bde63ae3587: Pull complete 69cb0c9b940a: Pull complete Digest: sha256:d02a16c0147fcae13d812fa670a4b3c9944f5328b10a5a463ad697d2aa5bb063 Status: Downloaded newer image for tomcat:8.0-alpine ---> 624fb61775c3 Step 2/5 : LABEL maintainer="admin@itersdesktop.com" ---> Running in 06c6f350d2c0 Removing intermediate container 06c6f350d2c0 ---> b7bf5680010e Step 3/5 : ADD grailsapp.war /usr/local/tomcat/webapps/ ---> 930955a34be6 Step 4/5 : EXPOSE 8080 ---> Running in fe8724d59ede Removing intermediate container fe8724d59ede ---> 142d947a275d Step 5/5 : CMD ["catalina.sh", "run"] ---> Running in 2c3e5b962fbf Removing intermediate container 2c3e5b962fbf ---> 6ea6ea2f999f Successfully built 6ea6ea2f999f Successfully tagged tnguyenv/grails-based-app:latest
To check whether your built image is successful or not, run the following docker command
PS C:\Users\tnguyen> docker image ls -a REPOSITORY TAG IMAGE ID CREATED SIZE tnguyenv/grails-based-app latest 6ea6ea2f999f 5 seconds ago 197MB <none> <none> 142d947a275d 6 seconds ago 197MB <none> <none> 930955a34be6 8 seconds ago 197MB <none> <none> b7bf5680010e 9 seconds ago 147MB
Step 3: Run and test
Step 3.1: Run the docker image
As usual, you can test your docker image by using the command docker run like the following one
docker run -it --rm tnguyenv/grails-based-app \ --name mywebapp --expose 1982:8080 # this command runs the image tagged tnguyenv/grails-based-app and sets the container name as mywebapp on the port 1982 mapping to the internal 8080
Run the docker image means you start your web application server. In this context, that is an Apache Tomcat server. Do you know how to test it?
Step 3.2: Test the application deployed in Tomcat
Because I exposed the port 1982, you have to access this link http://localhost:1982/grails-based-app to land on the home page of the application.
Another strict way to test your deployment is to log in into the docker container by running the following command
docker exec -it mywebapp /bin/bash # in which mywebapp is the name of the docker container set in the running command above
That’s it!
Source code
If you have any problem of building your files, feel free to go to my GitHub repository where I published all my work on this post.
Summary
Eventually, you have just succeeded in setting up an Apache Tomcat Web Server running on a Docker container. This is a very simple web application that you don’t have to set up environment variables, copy source codes, grant permissions, add non-root users, etc. All these things are completely done via Dockerfile. I hope you can learn more about DevOps from my blog.