Dockerizing Web Application with Puppet
In post Installing Puppet Modules – Librarian Puppet we provisioned a Vagrant VM to install the puppet module from Puppet Forge using librarian-puppet, now in this post we will do the same thing except we provision Docker container instead of Vagrant VM and deploy a hello-spring application in provisioned container.
Before starting with application deployment in Docker container let’s understand brief about Docker and how it is different from Virtual Machine.
What is Docker?
Docker is a high level abstraction over linux containers which manages the life cycle of containers. Docker allows to package an application with all of its dependencies into a standardize unit for software development. And if that unit runs on your local, we can guarantee that it will run exactly the same way, anywhere from QA, to staging, to production environments.
Docker vs Virtual Machine
Virtualization technologies like VirtualBox, VMWare, KVM, etc. use full machine virtualization whereas Docker share certain portions of the host kernel and operating system instance offering lower overhead at the cost of less isolation. Also, Docker provides a virtual environment that has its own CPU, memory, block I/O, network, etc. space using Cgroups features in Linux kernel on LXC host compared to virtualization technologies which offer us complete new virtual machine. Now, let’s start with our deployment in container, following below steps:
Step 1: Create a directory with any name for me it’s docker and file with name Dockerfile and Puppetfile inside the directory as follows:
$ mkdir docker $ cd docker $ touch Dockerfile Puppetfile
Dockerfile created above contains all the commands a user could call on the command line to assemble an image.
Puppetfile created above is a Ruby-based DSL specifies where puppet modules should be installed and where to fetch the modules from.
Step 2: Copy the below content in Puppetfile:
# Puppetfile Configuration for librarian-puppet. forge "http://forge.puppetlabs.com" mod "puppet-java8", :git => "https://github.com/arpitaggarwal/puppet-java8.git" mod "arpitaggarwal/tomcat"
Step 3: Copy the below content in Dockerfile
FROM ubuntu:latest MAINTAINER arpitaggarwal "aggarwalarpit.89@gmail.com" RUN apt-get -y update RUN apt-get -q -y install git RUN sudo apt-get install -y ruby RUN apt-get install -y ruby-dev RUN apt-get -y update RUN apt-get install -y make RUN apt-get install -y build-essential RUN apt-get install -y puppet RUN gem install librarian-puppet ADD Puppetfile / RUN librarian-puppet install RUN puppet apply --modulepath=/modules -e "include java8 class { 'tomcat':version => '7',java_home => '/usr/lib/jvm/java-8-oracle'}" RUN apt-get remove -y make puppet build-essential ruby-dev
Step 4: Build the the application inside a docker directory, for me it’s hello-spring cloned from github:
$ git clone https://github.com/arpitaggarwal/hello-spring.git $ cd hello-spring $ mvn clean install
Step 5: Update the Dockerfile adding your .war file location using Docker COPY command:
COPY hello-spring/target/hello-spring.war /var/lib/tomcat7/webapps/ EXPOSE 8080
EXPOSE command specified above refers to Docker command which is good for inter-container communication.
Finally, Dockerfile should like as:
FROM ubuntu:latest MAINTAINER arpitaggarwal "aggarwalarpit.89@gmail.com" RUN apt-get -y update RUN apt-get -q -y install git RUN sudo apt-get install -y ruby RUN apt-get install -y ruby-dev RUN apt-get -y update RUN apt-get install -y make RUN apt-get install -y build-essential RUN apt-get install -y puppet RUN gem install librarian-puppet ADD Puppetfile / RUN librarian-puppet install RUN puppet apply --modulepath=/modules -e "include java8 class { 'tomcat':version => '7',java_home => '/usr/lib/jvm/java-8-oracle'}" RUN apt-get remove -y make puppet build-essential ruby-dev COPY hello-spring/target/hello-spring.war /var/lib/tomcat7/webapps/ EXPOSE 8080
Step 6: Build the Docker container using Docker build command:
docker build --no-cache=true -t spring-application-container .
spring-application-container specified above refers to name of a docker image.
Step 7: Once built, run the container using Docker run command:
docker run -p 8080:8080 --cap-add SYS_PTRACE -it spring-application-container /bin/bash
Step 8: Get your Docker container IP Address, using docker-machine:
docker-machine ip your_vm_name
Next, open the url http://container-ip-address:8080/hello-spring
- The complete source code is hosted on github.
Reference: | Dockerizing Web Application with Puppet from our JCG partner Arpit Aggarwal at the Arpit Aggarwal blog. |
Hi Arpit,
What do you want to achieve here by using puppet for creating a docker image ?
There is a tomcat image on docker hub, which you can use directly to create a container running with latest tomcat version.
https://hub.docker.com/_/tomcat/
And Then you can deploy your war file on the tomcat.