On Github dobleme / docker-demo
Docker es una API para el uso de la virtualización de software a nivel de Sistema Operativo.
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.
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%)Vale, no me enterado de nada. ¿Puedes ponerme un ejemplo?
¡Puedo ponerte tres!
En la DockerCon14, el ponente Rohan Singh explicó como Spotify usa Docker en producción.
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)
Los despliegues deben ser: Repetibles, directos y tolerantes 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.
Primera regla: Todo, absolutamente todo, esta dockerizado.
Segunda regla: Levantar dos millones de contenedores a la semana (por el swag y eso).
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.
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
Más información aquí
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.
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.
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.
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.
Desktop GUI for Docker
Kitematic es la herramienta gráfica para gestionar todos los contenedores desde sistemas operativos Mac OS X y Windows 7+.
No, y ahora te explicaré cómo funciona.
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.
Estos són los componentes con los que manejar Docker en el día a día para poder virtualizar nuestro software.
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.Cuando creamos un container y lo ejecutramos, añadimos una Layer de escritura en blanco, la cual se aplicará si hacemos alguna acción.
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.
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.
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.
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 .
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:demoVolvamos a la teoria y como Docker maneja una imagen por dentro.
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
docker run --name db -v /var/lib/mysql:/var/lib/mysql -d mariadb:10.1
$ 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]'
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á).
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