790 likes | 1.07k Views
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.
E N D
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
Deployment pipeline Setup environment Quality checks Version control Compile Testing Deployments Etcetera DevOps End users
Focus of this presentation • Automate environment provisioning • Automate application deployment
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
My first Docker container • Docker on Ubuntu 14.04 apt-get install docker.io docker.io run -i -t ubuntu:saucy /bin/bash
DockerfileGeneralBase FROM ubuntu:saucy RUN apt-get -y install software-properties-common RUN add-apt-repository ppa:webupd8team/java RUN apt-get update && apt-get -y upgrade RUN echo "oracle-java7-installer shared/accepted-oracle-license-v1-1 boolean true" | debconf-set-selections RUN apt-get -y install oracle-java7-installer ENV JAVA_HOME /usr/lib/jvm/java-7-oracle
Dockerfile Sonar FROM GeneralBase RUN apt-get install -y wgetunzip RUN wget http://dist.sonar.codehaus.org/sonarqube-4.2.zip RUN unzip sonarqube-4.2.zip -d /opt RUN rm sonarqube-4.2.zip EXPOSE 9000 EXPOSE 9092 CMD ["/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 Sonar docker.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–a CONTAINER 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 / restart docker [start/stop/restart] containerid • Follow SystemOut and SystemErr docker logs -f containerid
Controlling containers • Show (running) containers dockerps –a • Show processes running in container dockerdiff containerid • Show changes in the container dockertop 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)
Data volumes • Dockerfile ENV JENKINS_HOME /var/JenkinsData • Docker commands docker.io run -v /var/JenkinsData–name JenkinsDataContainerubuntu: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.729s user 0m3.329s sys 0m10.054s
Export / import container • Export sudodocker.io export fc8696f5b8b4 > jenkins-backup.tar • Import sudocat jenkins-backup.tar | sudodocker.io import – jenkins
Backup data container sudodocker.io run -rm --volumes-from JenkinsDataContainer -v $(pwd):/backup busybox tar cvf backup.tar /var/JenkinsData
Restore data container sudodocker.io run -v /var/JenkinsData --name JenkinsDataContainer ubuntu:saucytrue 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 registry • Creating the Docker registry docker run -p 5000:5000 registry
Docker client 1 (push) • Modify container (for instance with touch) • Commit docker.io commit 064f 192.168.56.31:5000/test-version-0.2 • New containerid -> ff7e • Push docker.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 • Run docker.io run -i -t ff7e /bin/bash • View the changed container
Pull update only dockerimages -tree └─153bf43b408a 194.2 MB test-version-0.1:latest dockerpull 192.168.56.31:5000/test-version-0.2 ff7e110ebadd: Download complete 153bf43b408a: Download complete dockerimages -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