Docker – ¿Qué es Docker? – Whaaaaat?



Docker – ¿Qué es Docker? – Whaaaaat?

0 0


docker-demo

Presentation and demonstration about Docker, mode easy! For University of the Balearic Islands (UIB)

On Github dobleme / docker-demo

Docker

Virtualización nivel SO

¿Qué es Docker?

Docker es una API para el uso de la virtualización de software a nivel de Sistema Operativo.

Whaaaaat?

¿Para qué sirve?

Sirve para virtualizar, de manera aislada, diferentes piezas de software dentro de una misma máquina. Consumiendo el míninimo posible de recursos físicos.

  • Solomon Hykes, 13 de Marzo del 2013.
  • Desarrollado en Go.
  • Su tecnología se basa en Linux. Por lo tanto funciona de manera nativa en GNU/Linux y ahora en algunos sistemas Unix-Like.
  • Versión estable: 1.9.1, 25 de Noviembre de 2015
  • Licencia Apache 2.0

Evidentemente...

OpenSource

Repositorio GitHub

$ sloccount docker
Total Physical Source Lines of Code (SLOC) = 99,552

Contribuciones en número de linias. Mayo de 2015

Docker 226.176 (47.0%) (Comunidad) 192.678 (40.1%) Red Hat 37.417 (7.8%) IBM 14.021 (2.9%) Cisco 5.508 (1.1%) Google 5.056 (1.1%) VMWare 79 (0.0%)

Casos de uso

Vale, no me enterado de nada. ¿Puedes ponerme un ejemplo?

¡Puedo ponerte tres!

Spotify. Docker Rocks!

En la DockerCon14, el ponente Rohan Singh explicó como Spotify usa Docker en producción.

Ser DevOps es jodido!

  • 100+ servicios diferentes en el backend.
  • 5000+ servidores de producción en 4 sitios diferentes.
  • 300+ servidores por DevOps!

Antes de Docker

Uso de Fabric y Puppet para realizar las tareas de mantenimiento de servidores y despliegue de código.

(Recuerda la diapositiva anterior y recapacita sobre lo fácil que es emplear Fabric xD)

Con Docker

Los despliegues deben ser: Repetibles, directos y tolerantes a fallos.

Repetibilidad

  • Crea una imagen.
  • Lanza un test contra la imagen.
  • Lanza la imagen testeada en producción.

Directo

  • Solo un Dockerfile.
  • Sintaxis bonita y simple.
  • Imágenes inmutables.

Tolerancia a fallos

Solo una cosa debe funcionar: "pull and run image".

Si falla, solo debes de reintentarlo. No dejas atrás máquinas con un estado alterado.

Docker it!

Primera regla: Todo, absolutamente todo, esta dockerizado.

Segunda regla: Levantar dos millones de contenedores a la semana (por el swag y eso).

¿Para que emplea Docker?

  • Aislamiento de los recursos y previsibilidad.
  • Contabilidad de los recursos.

Aislamiento y previsibilidad

Cada uno de los servicios de Google se dividen en varios contenedores, que además están replicados. Para que un servicio de Google falle, deberían fallar cada uno de sus contenedores y sus réplicas asociadas.

Ante una demanda más elevada de recursos, facilmente se pueden levantar más imágenes de la parte crítica de un servicio.

Contabilidad

Gracias a una tecnología desarrollada por ellos, Kubernetes, son capaces de gestionar todos los contenedores de una manera centralizada y además, controlar la cantidad de potencia que están consumiendo.

Kubernetes es un sistema para manejar clusters de contenedores Docker como un solo sistema

Docker para gente normal!

Marketing en Habitissimo

  • 8 paises (Arales).
  • Sistema de API Rest (Midori).
  • Sistema de colas (Chibiru).
  • Sistema para realizar tareas planificadas (Obokaman).

Más información aquí

Toolbox

Docker Machine

Automated Docker provisioning

Docker Machine te permite hosts de Docker en tu ordenador, nube o dentro de tu propio centro de datos.

Automaticamente crea los hosts, instala Docker en ellos y luego configura el cliente de Docker para permitir comunicarse con los hosts.

En pocas palabras, Una "Machine" es la combinación de un host y su cliente configurado.

Docker Swarm

Host clustering and container scheduling

Docker Swarm es una herramienta nativa de clustering para Docker.

Vuelve un conjunto de hosts Docker en un único y virtual host de Docker.

El scheduling de Docker Swarm elige el mejor hosts dependiendo de la estrategía que tu decidas.

Docker Compose

Define multi-container applications

Docker Compose es una herramienta para definir y arrancar aplicaciones multicontenedor.

A través de un solo archivo, puedes definir los servicios de tu aplicación y con un solo comando puedes crear y levantar todos los servicios de tu aplicación.

Docker Engine

Creates and runs Docker containers

Docker Engine es el core de la plataforma Docker. Es una herramienta robusta y ligera que corre sobre Linux para crear el entorno operativo para las aplicaciones distribuidas.

Kitematic

Desktop GUI for Docker

Kitematic es la herramienta gráfica para gestionar todos los contenedores desde sistemas operativos Mac OS X y Windows 7+.

Docker por fuera, por dentro y muy por dentro

Haz un resumen, que llevo un lio...

  • Aislar las dependencias de una aplicación
  • Crear imagenes y mantenerlas.
  • Crear aplicaciones fácil de distribuir y listas para ejecutarse.
  • Permitir escalar de manera rápida y fácil
  • Testeo de aplicaciones y su disponibilidad.

¿Me estás timando?

No, y ahora te explicaré cómo funciona.

¿Cuál es la arquitectura de Docker?

Cliente - Servidor, conectados mediante Sockets o API RESTful.

El servidor, es un demonio, el cual crea, ejecuta, para, etc... las piezas de software.

El cliente es la interficie con la cual interactuamos con el demonio de Docker.

Los componentes abstractos de Docker

Estos són los componentes con los que manejar Docker en el día a día para poder virtualizar nuestro software.

  • Images. Es como una snapshot de una VM. Pero muy ligero. Es un contenido solo de lectura. Estas pueden (suelen) heredar de una imagen padre.
  • Registries. Servicio para almacenar y distribuir las imagenes. Puede ser privado o público.
  • Containers. Se crean a partir de las imagenes. Sería como montar una VM a partir de un snapshot, pero también muy ligero. Dan la capa de escritura. Cada container es una pieza de software aislada.

Overview

¡Ligero!

What kind of black magic is this?

Vamos a ver el ejemplo de como crear una imagen y subirla al Hub.

Images: Union filesystem

UnionFS, permite tener varias capas de FS, cada FS hace cambios sobre la anterior. Las imágenes de Docker funcionan de esta manera, cada imagen esta dividida en diferentes Layers. Si tu modificas una imagen, solo le estas añadiedo una Layer más encima de la anterior. Estas Layers, són solo RO.

Veamos el peso de la imagen y las layers de la imagen. imagelayers.io Ahora volvemos al ejemplo práctico, para ver, como crear un container y como estos funcionan.

Containers: Write layers, ...

Cuando creamos un container y lo ejecutramos, añadimos una Layer de escritura en blanco, la cual se aplicará si hacemos alguna acción.

Namespaces

Los Namespaces, sirven para generar un espacio de trabajo (workspace) aislado de la máquina residente.

Cada vez que un container es creado, Docker genera un conjunto de namespaces.

Cada aspecto del container tiene un propio namespace y está totalmente aislado.

Los Namespaces de Docker

  • PID namespace: Aislamiento de procesos.
  • NET namespace: Aislamiento de interficied de red.
  • IPC namespace: Aislamiento de comunicación entre procesos.
  • MNT namespace: Aislamiento de los puntos de montaje.
  • UTS namespace: Aislamiento de host, para el tiempo compartido de kernel.

CGroups

Esto es una característica del kernel de Linux. CGroups limita los recursos de utilización físicos (RAM, CPU) para grupos de procesos.

Gracias a esto, nuestros namespaces se generan como un grupo de procesos y se les asigna unos recursos.

La clave es que estos procesos funcionan directamente con el kernel, por tanto el overhead del container es muy pequeño y es casi como tener el software corriendo directamente en la máquina residente.

Docker Engine

Vamos a crear una imagen de Dokcer!

Lo primero es hacer nuestro Dockerfile. El Dockerfile es un DSL, para que docker pueda crear una imagen. En realidad lo que hacemos es llamar ordenes de Shell con el DSL que el Dockerfile nos ofrece.

Dockerfile

FROM ubuntu:trusty

MAINTAINER Lluc Martorell < superpesi@gmail.com >

RUN apt-get update && apt-get install -y cowsay

# cowsay bin is in /usr/games
ENV PATH $PATH:/usr/games

CMD ["cowsay", "Our first image!!!"]

Una vez definida, hay que crear la imagen.

$ docker build -t lmartorell/cowsay-demo:demo .

Usando el registry de Docker: Docker Hub

Primero necesitamos loguearnos al Hub de Docker.

$ docker login
Username:
Password:

Ahora subiremos la imagen de manera pública.

$ docker push lmartorell/cowsay-demo:demo

Si quisiéramos bajar alguna imagen...

$ docker pull lmartorell/cowsay-demo:demo
Volvamos a la teoria y como Docker maneja una imagen por dentro.

Creando un Container

Primero hay que crearlo, luego ejecturalo...

$ docker create lmartorell/cowsay-demo:demo
$ docker start -i [container_name]

Pero tenemos un todo en uno!

$ docker run lmartorell/cowsay-demo:demo

Pull, create i start... incluso rm

Dos conceptos MUY importantes aun por explicar...

Volumes

docker run --name db -v /var/lib/mysql:/var/lib/mysql -d mariadb:10.1

Links

$ docker run -it --link db --rm mariadb:10.1 sh -c 'exec mysql -h"$DB_PORT_3306_TCP_ADDR" -P"$DB_PORT_3306_TCP_PORT" -u[user] -p[password]'

Docker Compose

Imagina tener que ejecutar, linkar, poner los volumenes cada vez, a unos 15 containers para montar un entorno.

En realidad, las aplicaciones suelen estar lo más posiblemente modularizadas. De esta forma se generan muchos links y volumes. Una aplicación normal puede tener 4, 6, 10, 20 o 40 containers... y desde aquí hasta el infinito (y más allá).

Docker Compose al rescate!

Y todo se monta en un solo fichero .YAML

db:
  image: mariadb:10.1
  environment:
    - "MYSQL_USER=dobleme"
    - "MYSQL_PASSWORD=password"
    - "MYSQL_DATABASE=demo"
    - "MYSQL_ROOT_PASSWORD=root"
  volumes:
    - "/opt/demo/mysql:/var/lib/mysql"
  ports:
    - "3306:3306"

web:
  build: .
  command: ruby app.rb
  volumes:
    - .:/app
  ports:
    - "8000:4567"
  links:
    - db

Gracias a Docker Compose, podemos crear, ejecutar, parar, borrar, etc... packs enteros de containers.

$ docker-compose build web
$ docker-compose up -d web
$ docker-compose kill
$ docker-compose rm

One, or two, more things...

Jess Frazelle - dockerfiles Introducing Hypriot Cluster Lab: Docker clustering as easy as it gets

Gracias a...

Los DevOps, SysAdmins y Developers que nos han enseñado!

Referencias

Docker Virtualización nivel SO