Using the Same Docker Container for Development and in the Cloud

Post on 07-Jan-2016

62 views 0 download

Tags:

description

Using the Same Docker Container for Development and in the Cloud. Johan Janssen, Info Support. Content. Continuous delivery Docker Jenkins Questions. Continuous Delivery. Automate everything Software quality Continuous improvement Regular deployments Anyone can deploy. - PowerPoint PPT Presentation

Transcript of Using the Same Docker Container for Development and in the Cloud

Using the Same Docker Container for Development and in

the CloudJohan Janssen, Info Support

Content

Continuous delivery

Docker

Jenkins

Questions

Continuous Delivery Automate everything

Software quality

Continuous improvement

Regular deployments

Anyone can deploy

Deployment pipeline

Version control

Compile

Quality checks

Testing

Deployments

DevOps End users

Etcetera

Setup environment

Deployment pipeline

Focus of this presentation

Automate environment provisioning

Automate application deployment

What to deliver?

Docker

Transportation issue

Transportation solution

Software issue

Software solution

Docker compatibility

Demo

Why Docker To enable continuous delivery Quickly provision environments Run the same software local and in the

cloud Easy to move software

Better performance Higher availability Cheaper

Docker vs Virtual Machines Disk space efficiency Memory efficiency Speed Compatibility (run anywhere) Isolation Versioning Internet of Things (Raspberry Pi etc.)

Docker vs provisioning tools

Simple general commands No Domain Specific Language (DSL) Configuration with operating system

commands

Docker activity Since March 2013 8741 commits in 15 months More than 460 570 contributors Downloaded 2.75 13 million times More than 14000 30000 Dockerized apps >6500 Docker related projects on GitHub More than 90 user groups DockerCon (Europe) Support from Google, VMWare, RackSpace, Red Hat, IBM, Microsoft etcetera

Docker on CIO TODAY

Docker ecosystem

My first Docker container

Docker on Ubuntu 14.04

apt-get install docker.io

docker.io run -i -t ubuntu:saucy /bin/bash

Docker technology

Dockerfile GeneralBaseFROM ubuntu:saucy

RUN apt-get -y install software-properties-commonRUN add-apt-repository ppa:webupd8team/javaRUN apt-get update && apt-get -y upgradeRUN echo "oracle-java7-installer shared/accepted-oracle-license-v1-1 boolean true" | debconf-set-selectionsRUN apt-get -y install oracle-java7-installerENV JAVA_HOME /usr/lib/jvm/java-7-oracle

Dockerfile SonarFROM GeneralBase

RUN apt-get install -y wget unzipRUN wget http://dist.sonar.codehaus.org/sonarqube-4.2.zipRUN unzip sonarqube-4.2.zip -d /optRUN rm sonarqube-4.2.zip

EXPOSE 9000 EXPOSE 9092CMD ["/opt/sonarqube-4.2/bin/linux-x86-64/sonar.sh", "console", "/bin/bash"]

Directory structure Main directory

BuildAndRunScript.sh GeneralBase

Dockerfile Sonar

Dockerfile

Build Create the Dockerfiles Build the containers:

cd GeneralBase (optional)docker.io build -t GeneralBase . (opt..)cd .. (optional)cd Sonardocker.io build -t Sonar .

Run Start the container

docker.io run -p 9000:9000 –p 9092:9092 -d Sonar

List all in(active) containers# docker.io ps –aCONTAINER ID: ecbecf77461b CREATED: 32 minutes ago STATUS: Up 32 minutes PORTS: 0.0.0.0:9000->9000/tcp, 0.0.0.0:9092->9092/tcp

Controlling containers

Start / stop / restartdocker [start/stop/restart] containerid

Follow SystemOut and SystemErrdocker logs -f containerid

Controlling containers Show (running) containers

docker ps –a

Show processes running in containerdocker diff containerid

Show changes in the containerdocker top containerid

Controlling containers Stop all containers

docker.io stop $(docker.io ps -a -q) Remove all containers

docker.io rm $(docker.io ps -a -q) Remove all images

docker.io rmi $(docker.io images -q)

We need lots of Docker containers

GeneralBase

AppServerBase

Environment D

Environment T

Environment A

Environment P

Jenkins

JenkinsDataContainer

Sonar Gitblit Nexus

Data volumes Dockerfile

ENV JENKINS_HOME /var/JenkinsData

Docker commandsdocker.io run -v /var/JenkinsData –name JenkinsDataContainer ubuntu:saucy true

docker.io run -p 8080:8080 --volumes-from JenkinsDataContainer -d Jenkins

Diskspace# docker.io images --tree└─ 179.9 MB Tags: ubuntu:saucy └─253.6 MB └─741.8 MB Tags: GeneralBase:latest └─763.6 MB Tags: AppServerBase:latest

├─763.6 MB Tags: EnvironmentP:latest └─865.6 MB Tags: Nexus:latest

└─808.3 MB Tags: Gitblit:latest └─901.5 MB Tags: Sonar:latest └─805.4 MB Tags: Jenkins:latest

Execution time

real 4m11.729suser 0m3.329s sys 0m10.054s

Moving

Export / import container

Exportsudo docker.io export

fc8696f5b8b4 > jenkins-backup.tar

Importsudo cat jenkins-backup.tar |

sudo docker.io import – jenkins

Backup data containersudo docker.io run -rm

--volumes-from JenkinsDataContainer

-v $(pwd):/backup busybox tar cvf backup.tar

/var/JenkinsData    

Restore data containersudo docker.io run -v /var/JenkinsData

--name JenkinsDataContainer ubuntu:saucy true

sudo docker.io run -rm --volumes-from

JenkinsDataContainer -v $(pwd):/backup busybox tar xvf /backup/backup.tar –C / 

 

Run restored containers Run container

sudo docker.io run -e JENKINS_HOME=/var/JenkinsData

-p 80:8080 --name Jenkins --volumes-from

JenkinsDataContainer -d 1478be52bb java -jar

/usr/local/bin/jenkins.war

Docker overview

One ring to rule them all

Docker registry

Creating the Docker registrydocker run -p 5000:5000 registry

Docker client 1 (push) Modify container (for instance with touch) Commit

docker.io commit 064f192.168.56.31:5000/test-version-0.2

New containerid -> ff7e

Pushdocker.io push

192.168.56.31:5000/test-version-0.2

Docker client 2 (pull) Pull

docker.io pull 192.168.56.31:5000/test-version-0.2

Rundocker.io run -i -t ff7e /bin/bash

View the changed container

Updating containers

Pull update onlydocker images -tree└─153bf43b408a 194.2 MB test-version-0.1:latest

docker pull 192.168.56.31:5000/test-version-0.2 ff7e110ebadd: Download complete153bf43b408a: Download complete

docker images -tree└─153bf43b408a 194.2 MB test-version-0.1:latest └─ff7e110ebadd 194.2 MB test-version-0.2:latest

Use registry instead exports

Commands are easier

Faster and easier migration

Use registry instead of multiple builds

Requires less extra resources

Containers are the same, for instance when using apt-get update

Not the latest security patches

Docker vs Virtual Machines

Jenkins

Demo

Why Jenkins Simple to use Really popular

Used in many organizations Regular updates Big community creating plugins etc.

Most developers already use it

Jenkins

Backend pipeline

Frontend pipeline

Combined pipeline

Automatic versus manual deployment

Continuous delivery

Continuous deployment

Automatic versus manual

Build pipeline plugin

Example build pipeline

TAP

D

1

2

34

7

8

9

10

56?

6?

Publish over SSH plugin

Publish over SSH plugin

Join Plugin Execute job after several (parallel) jobs are finished.

FirstJob

ParallelJob1

ParallelJob2

LastJob

Using the Join Plugin

Build Pipeline Plugin & Join Plugin combined

I need more! Good looking join Complex workflow Etcetera

Advantage: Jenkins jobs are the basis and can be reused. Try to keep it simple!

Alternatives for Build Pipeline Plugin

Build Flow Plugin Domain Specific Language Features like retry, parallel,

guard/rescue (similar to try/finally)

Multijob Plugin Delivery Pipeline Plugin

Keep it simple“Life is really simple, but we insist on making it complicated.”

- Confucius

Build pipeline demo

Tips Use a (private) Docker registry Use images from the registry instead of export Keep environmental settings separate Use Jenkins to manage everything Do not add extra functionality like OpenSSH Think about topics such as security, monitoring and logging Separate concerns in separate containers Inherit containers

Summary

Big potential market for Docker and Java

Easy to use

Highly flexible and customizable

Isolation

Isolation

Isolation

Isolation

Summary

Questions

johan.janssen@infosupport.com