Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Using Docker to build and test in your laptop and Jenkins

Docker is changing the way we create and deploy software. This presentation is a hands-on introduction to how to use docker to build and test software, in your laptop and in your Jenkins CI server

  • Login to see the comments

Using Docker to build and test in your laptop and Jenkins

  1. 1. Using Docker to build and test in laptop and Jenkins Micael Gallego @micael_gallego Download slides
  2. 2. @micael_gallego @micaelgallego About me developer University professor Trainer & Consultor
  3. 3. Consultancy / Training Cloud Computing WebTechnologies Extreme Programming Testing / Git / Jenkins Software Architecture Concurrent Programming Open source elastic platform for end to end testing Advanced log management Test orchestration Test execution comparison Web and Mobile testing Security testing IoT testing Performance testing
  4. 4. Virtualizacion and Containers ● Developers want to reduce the differences between local, continuous integration and production environments ● Avoiding “It works in my machine” type of problems Virtualization Containers
  5. 5. Virtualizacion and Containers ● Virtualization – Full fledged Virtual Machine (VirtualBox) – Developer friendly managed VM (Vagrant) ● Containers – Docker
  6. 6. VirtualBox ● Developed by Oracle (was owned by Sun Microsystems) ● Mostly open source, several free (but closed source) modules ● Windows, Linux and Mac versions ● Advanced Desktop Virtualization – Shared folders host / guest – Keyboard and mouse advanced integration – Graphic 3D acceleration – Webcam
  7. 7. VirtualBox
  8. 8. VirtualBox ● Manual – Create an empty virtual machine – Connect to a ISO (simulating real CD devide) – Install a full fledged Operating System – It is time consuming and it is not easy to share VM between developers
  9. 9. VirtualBox
  10. 10. VirtualBox
  11. 11. Vagrant ● It is a command line utility to manage VMs ● It makes very easy to download and start a new VM (only with a command) ● Allows to provisioning the new VM with command provisioning tools (script, chef, puppet, ansible…) ● VM configuration is specified in a text file, allowing to share it in the git repository
  12. 12. Vagrant ● How to create a new VM with ubuntu Xenial ● Vagrant manages certificates and networking to make easy to connect to the new VM ● By default, working dir is shared with VM $ vagrant init ubuntu/xenial64 $ vagrant up $ vagrant ssh
  13. 13. containers
  14. 14. Docker ● With VMs you can have the production environment in your laptop ● But… – VMs takes minutes to start up – VMs use (waste?) a lot of resources (memory and disk space)
  15. 15. Docker ● In a first look, containers can be considered as “lightweight VMs” – They contain an isolated environment to run apps – Start in milliseconds – They use only the resources it needs – A container doesn't have a full fledged operating system, only the minimal software to execute apps
  16. 16. Docker
  17. 17. Docker ● Containers and VMs are very different Virtual Machines Containers Heavier Lighter Execute several processes per Virtual Machine Usually execute only one process per container Ssh connection Direct execution in the container (rarely needed) More isolated using hypervisor Less isolated because are executed using kernel features Can virtualizeWindows over Linux Linux containers must be executed in linux hosts* * More on that later
  18. 18. Docker ● To install an application in a linux system you need all dependencies installed ● Can be incompatibilities between applications that need different version of the same dependency ● Docker include in a container all needed software isolated to the rest of the system
  19. 19. Docker
  20. 20. Docker ● Docker containers SO support – Linux containers ● Very mature technology ● It can be used in any* linux distribution – Windows containers ● Preliminary technology ● It only can be used in a very recent** Windows Server version * Kernel version 3.10 or greather. Published in June 2013 **Windows Server 2016 (Core and with Desktop Experience), Nano Server, andWindows 10 Professional and Enterprise (Anniversary Edition).
  21. 21. Docker ● You can execute linux containers in any operating system ● It uses virtualization (under the covers) in Mac and Windows
  22. 22. Docker ● Docker Toolbox for Mac and Windows – It uses VirtualBox as virtualization – It is not the same development experience than in linux ● Docker for Mac and Windows – Uses native virtualization technology in each operating system – Only available in new versions of that SOs
  23. 23. Docker Docker concepts
  24. 24. •Docker Image – Basic template for a container (hard disk of VM) – It contains SO (ubuntu), libs (Java) and app (webapp.jar) – A container always is started from an image – If you want to start a new container from an image that is not in your system, it is automatically downloaded from Internet Docker concepts
  25. 25. •Docker Registry ● Remote service used to store and retrive docker images ● It can hold several versions of the same image ● All versions of the same image are located in the same repository (like in git) ● Docker Hub is a public registry managed by Docker Inc. ● You can buy private repositories in Docker Hub ● You can also operate your own private registry Docker concepts
  26. 26. •Popular repositories in Docker Hub Docker concepts
  27. 27. •Docker Container – It is the “equivalent” of a Virtual Machine – A container is created from a docker image – When a file is wrote, the image it is not modified, the container is modified – It can be started, paused or stopped Docker concepts
  28. 28. •Docker Engine – Local service used to control docker – Manages images (download, create, pull, push…) – Manages containers (start, stop, commit...) – It can be used with the docker client or using its REST API Docker concepts
  29. 29. •Docker client – Command line interface (CLI) tool to control docker engine – It is available when docker is installed in a system to connect to their local docker engine Docker concepts
  30. 30. •Official documentation – •Advanced tutorials – – – – – – ● Cheat Sheet – Docker documentation
  31. 31. First steps with docker Install Docker – Windows: ● Microsoft Windows 10 Professional or Enterprise 64-bit: ● Other Windows versions: – Linux: ● Ubuntu: ● Fedora: ● Debian: ● CentOS: – Mac: ● Apple Mac OS Yosemite 10.10.3 or above: ● Older Mac:
  32. 32. First steps with docker Hands on…
  33. 33. First steps with docker Testing if docker is correctly installed $ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 03f4658f8b78: Pull complete a3ed95caeb02: Pull complete Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca369 66a7 Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. ...
  34. 34. First steps with docker Running your first container $ docker run alpine ls -l total 48 drwxr-xr-x 2 root root 4096 Mar 2 16:20 bin drwxr-xr-x 5 root root 360 Mar 18 09:47 dev drwxr-xr-x 13 root root 4096 Mar 18 09:47 etc drwxr-xr-x 2 root root 4096 Mar 2 16:20 home drwxr-xr-x 5 root root 4096 Mar 2 16:20 lib ...... ......
  35. 35. First steps with docker Running your first container $ docker run alpine ls -l Command “run” Creates a new container and start it
  36. 36. First steps with docker Running your first container $ docker run alpine ls -l Image name alpine is a minimal linux system (4.8Mb).The image is downloaded if not stored in local machine
  37. 37. First steps with docker Running your first container $ docker run alpine ls -l Command “ls -l” This command will be executed inside the running container
  38. 38. First steps with docker Inspecting the downloaded images $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE alpine latest c51f86c28340 4 weeks ago 1.109 MB hello-world latest 690ed74de00f 5 months ago 960 B List all images stored in the system
  39. 39. First steps with docker Executing a container $ docker run alpine echo "hello from alpine" hello from alpine Execute the command “echo” inside the container
  40. 40. First steps with docker Inspecting containers (executing) $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a6a9d46d0b2f alpine "echo 'hello from alp" 6 minutes ago Exited (0) 6 minutes ago lonely_kilby ff0a5c3750b9 alpine "ls -l" 8 minutes ago Exited (0) 8 minutes ago elated_ramanujan c317d0a9e3d2 hello-world "/hello" 34 seconds ago Exited (0) 12 minutes ago stupefied_mcclintock It shows containers in the system. All of them has STATUS Exited.These containers are not currently executing (but using disk space)
  41. 41. First steps with docker Interactive commands in containers $ docker run -it alpine /bin/sh / # ls bin dev etc home lib linuxrc media mnt proc root run sbin sys tmp usr var / # uname -a Linux 97916e8cb5dc 4.4.27-moby #1 SMP Wed Oct 26 14:01:48 UTC 2016 x86_64 Linux / # exit $ To execute an interactive command it is necessary to use the option “-it” to connect the console to the container command
  42. 42. First steps with docker ● Interactive commands in containers – When you execute a /bin/sh command in a container it offers a “similar” experience than a ssh connection – Buy there are no ssh server neither ssh client – It is executing a shell inside the container
  43. 43. First steps with docker ● Managing containers lifecycle $ docker run -d seqvence/static-site Option “-d” Executes the container in background
  44. 44. First steps with docker ● Managing containers lifecycle $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a7a0e504ca3e seqvence/static-site "/bin/sh -c 'cd /usr/" 28 seconds ago Up 26 seconds Container id is a7a0e504ca3e This id is used to refer to this container STATUS is UP
  45. 45. First steps with docker ● Managing containers lifecycle – Stop running container – Delete files of the stopped container $ docker stop a7a0e504ca3e $ docker rm a7a0e504ca3e
  46. 46. Net services with docker ● Start container exposing a port docker run --name static-site -e AUTHOR="Your Name" -d -p 9000:80 seqvence/static-site
  47. 47. Net services with docker ● Start container exposing a port docker run --name static-site -e AUTHOR="Your Name" -d -p 9000:80 seqvence/static-site --name static-site Specifies a unique name for the container
  48. 48. Net services with docker docker run --name static-site -e AUTHOR="Your Name" -d -p 9000:80 seqvence/static-site -e AUTHOR="Your Name" Set the environment variable AUTHOR to value “Your Name” ● Start container exposing a port
  49. 49. Net services with docker docker run --name static-site -e AUTHOR="Your Name" -d -p 9000:80 seqvence/static-site -d Execute container as deamon ● Start container exposing a port
  50. 50. Net services with docker docker run --name static-site -e AUTHOR="Your Name" -d -p 9000:80 seqvence/static-site -p 9000:80 Connects the host port 9000 to the port 80 in the container ● Start container exposing a port
  51. 51. Net services with docker ● Use the service – Open in a browser in your host to access 80 port in container
  52. 52. Net services with docker ● Use the service – If you are using Docker Toolbox for Mac or Windows you can’t use IP – Then you have to open in the browser $ docker-machine ip default
  53. 53. Net services with docker ● Container management – Stop and remove the container – Stop and remove a running container – Remove all running containers $ docker rm -f static-site $ docker stop static-site $ docker rm static-site $ docker rm -f $(docker ps -a -q)
  54. 54. Managing docker images ● List images in host Tag is like “version”. Latest is… the latest ;) $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE seqvence/static-site latest 92a386b6e686 2 hours ago 190.5 MB nginx latest af4b3d7d5401 3 hours ago 190.5 MB python 2.7 1c32174fd534 14 hours ago 676.8 MB postgres 9.4 88d845ac7a88 14 hours ago 263.6 MB Containous/traefik latest 27b4e0c6b2fd 4 days ago 20.75 MB ...
  55. 55. Managing docker images ● Managing versions – Download a concrete version – Download latest version $ docker pull ubuntu:12.04 $ docker pull ubuntu
  56. 56. Managing docker images ● Searching images in DockerHub
  57. 57. Managing docker images ● Searching images in Docker Store
  58. 58. Managing docker images ● Image types – Base images ● Images without a parent image ● Examples: Ubuntu, debian, alpine… ● Used by Operating Systems – Child images ● Base images plus some additional software ● Examples: Nginx, Apache, MySQL...
  59. 59. Managing docker images ● Official vs User images – Official images ● Images created by trusted companies or communities – User images ● Any user can create an account and upload her own images
  60. 60. Managing docker images ● Create your first image – We will create a web application for display random cat pics using Python – Create a folder called flask-app – Download all files in this URL to the folder
  61. 61. Managing docker images ● Create your first image – You have all source files for the web application – But you need Python and Flask to execute the app – To execute the web application, you will create a new image with dependencies (Python and Flask) and your application code – Then you can create a new container to execute your application
  62. 62. Managing docker images ● Dockerfile – File used to describe a new image – Specifies ● Base image ● Commands to execute in the image ● Files to include in the image from the project folder ● Open ports ● Command to execute when start the image
  63. 63. # Select base image FROM alpine:latest # Install python and pip RUN apk add ­­update py­pip RUN pip install ­­upgrade pip # copy app files COPY /usr/src/app/ COPY templates/index.html /usr/src/app/templates/ COPY requirements.txt /usr/src/app/ # install Python modules needed by the app RUN pip install ­­no­cache­dir ­r      /usr/src/app/requirements.txt # tell the port number the container should expose EXPOSE 5000 # run the application CMD ["python", "/usr/src/app/"]
  64. 64. Managing docker images ● Dockerfile – FROM: Base image – COPY: Copy files from Dockerfile folder – RUN execute commands – EXPOSE: Public ports – CMD: Command to execute when container is started image/dockerfile_best-practices/
  65. 65. Managing docker images ● Build the image – In the folder with a Dockerfile execute – Executed actions ● Create a new container with base image ● Execute commands and copy app files ● Create a new container with the result $ docker build -t myfirstimage .
  66. 66. Managing docker images ● Run the new image – Open in the browser – Windows and Mac users with Toolbox use the IP $ docker run -p 9000:5000 myfirstimage * Running on (Press CTRL+C to quit)
  67. 67. Managing docker images ● Build the image again – Change some HTML in templatesindex.html – Create the image again – The Dockerfile steps without changes are not re- executed (are reused from previous execution) – The image is created very quickly because only the files copy is perfomed $ docker build -t myfirstimage .
  68. 68. Volumes ● Volumes – Allow sharing files between host and container – Execute a container to show an nonexistent file – Create a text file $ docker run alpine cat /data/file.txt cat: can't open '/data/file.txt': No such file or directory $ echo "My file" >> file.txt
  69. 69. Volumes Volumes ● Mount a host folder inside a container folder ● Host contents replace container contents of that folder ● Containers can write files in volumes to be available in the host $ sudo docker run -v $PWD:/data alpine cat /data/file.txt My file
  70. 70. Volumes ● Volumes – Docker images use volumes to read files from host – Official NGINX container can serve host files using http ● Serving current folder files ($PWD) ● Go to $ docker run -p 9000:80 -v $PWD:/usr/share/nginx/html:ro -d nginx
  71. 71. Volumes ● Volumes – Docker Toolbox for Win or Mac only allow folders inside user folder to be used as volume – You can use other folders but have to configure shared folders in VirtualBox
  72. 72. •Containers main use cases – Net service ● Executed in background long time... ● Used through network ● Ex: Databases, web servers... – Command ● Execute a single command and stop ● Read and write files from host with volumes ● Ex: Java Compiler, jekyll, ffmpeg... Docker container usage
  73. 73. •Docker for building software – A container can have all needed environment to execute a developer tool – For example, you can have the compiler and the test dependencies in a container – You can clone a git repository and execute the (dockerized) compiler without install any software in your host Docker for software developers
  74. 74. •Dockerized Java Maven – Clone a maven repo – Compile and exec tests Docker for software developers $ git clone $ cd simple-maven-project-with-tests $ docker run --rm -v $PWD:/data -w /data maven mvn package
  75. 75. •Dockerized Java Maven Docker for software developers $ docker run --rm -v $PWD:/data -w /data maven mvn package --rm Remove container when execution finish
  76. 76. •Dockerized Java Maven Docker for software developers $ docker run --rm -v $PWD:/data -w /data maven mvn package --w Working dir for the command
  77. 77. •Dockerized Java Maven Docker for software developers $ docker run --rm -v $PWD:/data -w /data maven mvn package maven Official Maven image
  78. 78. •Dockerized Java Maven Docker for software developers $ docker run --rm -v $PWD:/data -w /data maven mvn package mvn package Maven command
  79. 79. •Dockerized Java Maven – Jar package is generated in /target folder in host – As container command is executed as root user (by default), generated files are owned by root. – Change to your user Docker for software developers simple-maven-project-with-tests-1.0-SNAPSHOT.jar sudo chown -R username:group target
  80. 80. •Advantages of dockerized dev tools – Avoid several developers having different versions of such tools – It is very easy to test the same code in different versions (Java 7, Java 8...) – Reduce tools configuration problems.You can compile and execute a project easily – The same tools can be executed in development laptops and also in CI environment Docker for software developers
  81. 81. Docker for software developers
  82. 82. •Docker in Continuous Integration – If you execute dev tools in containers, it is very easy to compile, test and package in CI environment – Only have to execute the same command in laptop and CI environment – If a tool changes, only have to change the command, it is not necessary to install anything Docker in CI servers
  83. 83. •Docker in Continuous Integration Docker in CI servers
  84. 84. ● Jenkins installation – You need Java – Go to – Download – Download LTS Release – Generic Java Package (.war) Docker in CI servers
  85. 85. Jenkins installation
  86. 86. Jenkins installation
  87. 87. New admin account Jenkins installation
  88. 88. Jenkins installation
  89. 89. ● Create new Jenkins job – Create a job with pipeline – Pipeline: ● Clone git repository ● Compile, test and package Java project ● Copy test results to Jenkins Jenkins Job
  90. 90. Creamos una nueva tarea para descargar el proyecto y ejecutar los tests Jenkins Job
  91. 91. Jenkins Job
  92. 92. Change command to execute dockerized maven command
  93. 93. node { // Mark the code checkout 'stage'.... stage 'Checkout' // Get some code from a GitHub repository git url: '' // Mark the code build 'stage'.... stage 'Build' // Run the maven build sh "docker run --rm -v $PWD:/data -w /data maven mvn package" step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*.xml']) } Pipeline Jenkins Job
  94. 94. Execute the new job Jenkins Job
  95. 95. “Checkout” stage Jenkins Job
  96. 96. Compilation and test stage Jenkins Job
  97. 97. Successful finished job build (test passed) Jenkins Job
  98. 98. Clic on build to see details Jenkins Job
  99. 99. See console output Jenkins Job
  100. 100. Repository clone and dockerized maven execution Jenkins Job
  101. 101. ● Advantages of using docker in CI – CI server just need docker installed, nothing more – All tools needed by devs are containerized – Tools are downloaded (and cached) automatically when needed – Several languages/stacks/dependencies can be used in the same CI server without conflicts – Sysadmins do not need to give access to CI server to developers (enforcing security) Docker in CI servers
  102. 102. ● Testing different languages with Docker – Testing Node apps with mocha ● using-mocha-and-docker – Testing C++ apps with Gtest ● – Testing Angular apps ● -docker-132371.html Docker in CI servers
  103. 103. ● Some issues of using docker in CI – Issue: By default project dependencies have to be downloaded in every build ● Solution: Use a host folder as cache – Issue: Old docker images waste HD space ● Solution: Use docker garbage collector (as you can download images when needed) – Issue: Window tools can’t be dockerized in linux containers ● Solution: Use portable tools as much as possible ;) Docker in CI servers
  104. 104. ● Docker plugins for Jenkins – Docker Plugin ● – Docker build step plugin ● – CloudBees Docker Custom Build Environment Plugin ● d+Environment+Plugin – Docker Slaves Plugin ● – Yet Another Docker Plugin: ● Docker in CI servers
  105. 105. ● Testing tools based on docker – TestContainers ● Define testing dependencies in your JUnit test ● – Dockunit ● Test your code in several environments ● – Muchas más... Docker in CI servers
  106. 106. ● Conclusions – Docker containers are changing the way we develop, build, test and ship software – Containers allow developers to use the same dev tools and execute the project in the same environment – Containers ease the configuration and share of CI servers – If Continuous Integration is easier to use, more projects will use it and more test will be executed Docker in CI servers
  107. 107. Thanks! Do you have any question?