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
Top Related