Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introducción a Docker

pbruna
June 16, 2016

Introducción a Docker

Presentación de Meetup Enterprise Open Source - Junio 15 de 2016

pbruna

June 16, 2016
Tweet

More Decks by pbruna

Other Decks in Technology

Transcript

  1. El Problema •El transporte de la aplicación es difícil •Múltiples

    dependencias de otros servicios •Los Ambientes de Desarrollo, Testing y Producción son generalmente diferentes •Pasar a Producción: Funcionaba bien en mi computador
  2. Beneficios de los Contenedores •No les importa el HW •El

    contenido está aislado •Permiten automatización •Son volátiles •Son eficientes •Separación de roles, sin carga operacional
  3. Vs VMs Server Host OS Hypervisor VM OS VM OS

    VM OS Bins/ Libs Bins/ Libs Bins/ Libs App A App A’ App B Server Host OS Container Engine Bins/Libs Bins/Libs App A App A’ App B App B’ App B’ Los contenedores son procesos aislados pero comparten SO, y librerías y binarios VM Container
  4. Contenedores != • Docker es una abstracción de LXC •

    LXC = Linux Containers • cgroups => control • namespaces => aislación
  5. Arquitectura Docker Daemon • Es el server • Conversa con

    el Kernel (LXC) Docker Client • Se comunican via API con el Daemon • Es un comando de consola: $ docker Docker Images • La base para crear nuestro container • Son read-only
  6. Arquitectura Docker Registry • Repo de Imágenes • Ej: https://hub.docker.com

    Docker Container • Archivo que tiene toda nuestra aplicación • Se compone de capas de File Systems
  7. Container Lifecycle docker pull mongo:latest # pull the mongo image

    from the registry docker inspect mongo:latest # list information of the container docker run -p 27017:27017 \ --name my-mongo -d \ mongo:latest # create and start a mongo container docker inspect my-mongo # inspect the running container info docker logs -f my-mongo # tail the log of the container docker stop my-mongo # stop the container docker rm -v my-mongo # remove the container docker rmi mongo:latest # remove the image from the local repo
  8. Información del Contenedor command description ps shows running containers images

    shows images available logs fetch the logs of a containe inspect return low-level information on a container or image events gets events from container port list port mappings for the container top display the running processes of a container stats display a live stream of container(s) resource usage statistics
  9. Dockerfile Archivo que contiene las instrucciones para construir un contenedor.

    https://docs.docker.com/engine/reference/builder/ FROM dockerfile/java:oracle-java8 MAINTAINER Niek Palm <[email protected]> RUN apt-get install git -y ADD service.jar EXPOSE 8080 CMD ["java","-jar","/service.jar"]
  10. Instalación de Docker • En Linux $ curl -fsSL https://get.docker.com/

    | sh • En Windows / Mac: https://www.docker.com/products/docker-toolbox
  11. 1. Hello World $ docker pull ubuntu # Descargamos la

    imagen $ docker images # Listamos las imágenes descargadas $ docker run ubuntu echo “hello world” $ docker rm <id container>
  12. 2. HWaaS Hello World como “servicio” $ docker run -d

    --name mycontainer ubuntu /bin/sh -c \ "while true; do echo Hello world; sleep 1; done” $ docker logs -f mycontainer $ docker ps $ docker inspect mycontainer $ docker stop mycontainer $ docker ps $ docker ps -A
  13. Actualizando una imagen # Start our container docker start mycontainer

    # Exec the bash shell, this command gives access to our container docker exec -i -t mycontainer /bin/bash ## You should see now something like: root@<id>:/# apt-get update && apt-get install cowsay -y && \ ln /usr/games/cowsay /usr/bin/cowsay && rm -rf /var/lib/apt/ lists/* •Los cambios hechos en un contenedor se pierden al detener el contenedor •Haciendo un commit a la imagen, estos persisten
  14. Actualizando una imagen •Probamos que funcione $ cowsay “Hello World”

    •Salimos del contenedor $ exit •cowsay está instalado en el contenedor, pero no en la imagen base $ docker exec -i -t mycontainer cowsay "Hello World"
  15. Actualizando una imagen •Guardamos los cambios a una nueva imagen

    $ docker commit mycontainer <yourname>/ubuntu •Revisemos los cambios docker diff mycontainer # shows the added files docker history ubuntu # shows the image history docker history <yourname>/ubuntu # shows the image history •Eliminamos el contenedor $ docker stop mycontainer $ docker rm mycontainer
  16. Actualizando una imagen •Lanzamos un nuevo container basado en nuestra

    imagen $ docker run --rm <yourname>/ubuntu cowsay "Hello world" •Probamos con Ubuntu y debería fallar •Publicamos nuestro contenedor $ docker push pbruna/mycontainer $ docker run --rm ubuntu cowsay "Hello world"
  17. 3. Nodejs App 1.Creamos un directorio con la App Nodejs

    2.Creamos nuestra app: index.js y package.json 3.Creamos el archivo Dockerfile 4.Construimos la imagen 5.Ejecutamos la imagen
  18. 1. App node { "name": "docker-centos-hello", "private": true, "version": "0.0.1",

    "description": "Node.js Hello world", "author": “Patricio Bruna <[email protected]>”, "dependencies": { "express": "3.2.4" } } var express = require('express'); // Constants var PORT = 8080; // App var app = express(); app.get('/', function (req, res) { res.send('Hello world\n'); }); app.listen(PORT); console.log('Running on http://localhost:' + PORT); package.json index.js
  19. 2. Dockerfile Dockerfile FROM centos:centos6 # Enable Extra Packages for

    Enterprise Linux (EPEL) for CentOS RUN yum install -y epel-release # Install Node.js and npm RUN yum install -y nodejs npm # Install app dependencies COPY package.json /src/package.json RUN cd /src; npm install --production # Bundle app source COPY . /src EXPOSE 8080 CMD ["node", "/src/index.js"]
  20. 3. Lo demás # Construimos la imagen $ docker build

    -t pbruna/centos-node-hello . # Listamos $ docker images # Ejecutamos $ docker run -p 49160:8080 -d pbruna/centos-node-hello $ curl $(docker-machine ip VM_NAME):49160