Setup Docker slaves for Jenkins




Jenkins is the one of the primary CI tool used in industry. Jenkins provide on cross planform support and have master-slave configuration. Your slave could be any operating system. Recently docker is becoming very popular for replacement of virtualisation up to some extend.

Today I will detail out the steps needed to make dynamically slave provision via docker images.

Setting up Host for Docker
  • You need to have your base machine either VM or hypervisor etc and need to install with all prerequisite. Lets install docker now.
curl -sSL https://get.docker.com/ | sh
  • Once docker is installed, you need to perform some configuration Like
    • Add the jenkins user to docker group, so that jenkins user should be able to run docker command with proper permission and access.
sudo usermod -aG docker jenkins
·       Now, we need to configure the docker host so that jenkins can connect to the  docker host and to access it to launch the docker container. You can select any port you want (make sure it is not conflicting with any other application).

vi /etc/default/docker
Add following value in DOCKER_OPTS

-H tcp://0.0.0.0:6789

Your complete entry of might look like this (you may have some more info for your docker registry depending upon your requirement).

DOCKER_OPTS="--ipv6=false -H tcp://0.0.0.0:6789 -H unix:///var/run/docker.sock



Now, restart the docker by "service docker restart" to load above configuration.

Docker Image (Dockerfile).
Now you need to create your Dockerfile to create image of your docker slave.
Here is my basic docker file, Your file may be little different than this.

FROM evarga/jenkins-slave
#Getting image from evarga repo

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update -qq && apt-get install -qqy \
    apt-transport-https \
    ca-certificates \
    curl \
    lxc \
    iptables && \
    rm -rf /var/lib/apt/lists/*

RUN echo deb https://apt.dockerproject.org/repo ubuntu-trusty main > /etc/apt/sources.list.d/docker.list && \
    apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

ENV DOCKER_VERSION 1.8.1-0~trusty

# Install Docker from Docker Inc. repositories.
RUN apt-get update && apt-get install -y docker-engine=$DOCKER_VERSION && rm -rf /var/lib/apt/lists/*

ADD wrapdocker /usr/local/bin/wrapdocker
RUN chmod +x /usr/local/bin/wrapdocker
VOLUME /var/lib/docker

RUN apt-get update && apt-get install -y software-properties-common python-software-properties && add-apt-repository ppa:webupd8team/java && apt-get update 

RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections
RUN apt-get install -y oracle-java8-installer  oracle-java8-set-default
RUN echo 'JAVA_HOME=/usr/lib/jvm/java-8-oracle' >> /etc/environment

# Make sure that the "jenkins" user from evarga's image is part of the "docker"
RUN usermod -a -G docker jenkins
#You can have your own user and add it here, change the permission as above

#Just to make sure we have password less access from VM to docker

RUN echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDT4/OlCjMDacPyYvJfnBQhIRg4ldRZ7fxB7Eoa7sJgKQnV/qP2Gg29tPUb3g1k/xWmOoTOBi6XWMAaFACtYEy0vfMRkRhfEMpzmx0hSfi2jkssKJvei50wCe04t5KqY7xxgnMbRqf+XOnnQRjbwLFM9r1wgk4wR7HeE+D25hS19O7pKxAr8ByCmF3UQ4/zdvsA/gDky31E+mU01bGKgiNSBTZbXM1g48TnkvZuS/sN0uxznucx7Y61TeLz4r/nZiK18f0BNDj3AXTZQBgbwvYP0hYmf1/9ajl03fn4orjChHk58dcR8oA5VzV4rCVeu2VLEXjnoTYfuQhiD jenkins@7213637c0b2c" >> /home/jenkins/.ssh/authorized_keys

#making sure, it has sudo access (if you want)
RUN echo "jenkins  ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

#RUN mkdir /home/releasebot/

# place the jenkins slave startup script into the container

ADD slave-startup.sh /

# Expose the standard SSH port
EXPOSE 22

CMD ["/slave-startup.sh"]


Docker file is pretty must very clear and straight forward. Only tips
·       You can add other tools installation as part of default docker image.
·       slave-startup.sh is added which can be used to start ssh demon and wrapdocker like below
#!/bin/bash
# start the docker daemon
/usr/local/bin/wrapdocker &
# start the ssh daemon
/usr/sbin/sshd -D

 Go ahead build the image and upload it to your private repository or any where you want to. 

Jenkins Configuration


Lets look at jenkins configuration
  • Please install the following docker plugin in your jenkins.

  • Once you install the plugin, you will befollowing option under configuration page.
You will see Docker option in cloud like this


Select the docker and fill the detail 



Here are the detail
  1. Name - > You can give any name for your cloud.
  2. Docker URL -> this is the URL of your Host where you have configured the Docker as mentioned in 1st section .
  3. Docker Image -> This is the connection URL and name of your docker image which you have created in 2nd section. If you are using private registry, You will need to take care of URL and image name.
  4. Volumes -> You can skip this part, But as complete setup i feel its needed, This section will tell you what directories to be mounted inside docker from host. This is important to keep configuration in centralise place so that docker can use them, Like .m2 folder and configurations.
Test the configuration using "Test Connection" button.
Remaining documentation can be found on jenkins plugin wiki page, https://wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin 

Popular posts from this blog

Manage Docker images on local disk

Gradle or Maven - A Dilemma

Code Review - Write your code right