Introducción a Docker

¿Qué es docker?

Administra y gestiona contenedores virtuales

Esto te permite empaquetar una aplicación con todas sus dependencias en una unidad estandarizada, garantizando que siempre ejecutaremos lo mismo independientemente del entorno donde se cargue.

Provee modos de comunicación entre contenedores y host

Características

Ligero

Los contenedores no son maquinas virtuales, su virtualización es a nivel del SO. Aislan apps y dependencias pero comparten kernel.

Open

  • Se basa en estándares abiertos.
  • Se ejecuta de manera nativa en GNU/Linux.
  • En Windows y Mac se ejecuta a través de Boot2Docker (una virtual con Ubuntu y Docker instalado)

Seguro

Los contenedores aíslan las aplicaciones unas de otras.

¿Cómo nos ayuda Docker a construir mejor software?

Independiza al desarrollador de la creación de entornos.

No hay conflictos de versiones de herramientos ni dependencias.

Empaquetando la aplicación junto con su configuración y dependencias en un contenedor, la aplicación siempre funcionará como se diseñó localmente.

Los usuarios de Docker, de media, desarrollan y despliegan 7 veces más rápido. Esto agiliza la entrega de versiones y actualizaciones.

Los contenedores se arrancan y paran en segundos, es muy fácil escalar una servicio para atender a picos de demanda.

Terminología

Imágenes (images)

  • Snapshot de "maquinas virtuales" o contenedores
  • Gran repositorio público con miles de imágenes (DockerHub)
  • Personalización de las imagenes.
  • Podés subir tu imagen al repositorio público.

Contenedores (container)

  • Docker "ejecuta" contenedores (ver LXC)
  • Se crean a partir de las imágenes.
  • Es posible "mapear" puertos del contenedores con puertos del host para acceder a ellos.

Volúmenes

  • Permite persistir los datos de tu aplicación.
  • Se alojan afuera del contenedor.
  • Son específicos para cada contenedor.
  • También es posible compartir datos entre contendores.

Enlaces (links)

Al arrancar un contenedor, este tiene un IP privada (los contenedores forman una red local privada).

Especificando un alias y puerto, podemos conectar distintos contenedores entre sí.

Ej: un contenedor con un Nginx y otro con un postgresql. Puedo "conectarlos" indicando alias y puerto en uno, y utilizando ese alias desde el otro. No necesito saber su IP

...y docker-compose?

Docker Compose

  • nos permite definir nuestra aplicación multicontenedor en un archivo.
  • podremos iniciar todos los contenedores y en el orden que los especifiquemos.

Pero, ¿por qué necesitamos más de un contenedor?

Apps modernas:

  • Nginx
  • PostgreSQL
  • Cache
  • Static and media server
  • Email server
  • redis
  • elasticsearch
  • balanceo de carga
  • etc, etc, etc....

Ok pero, ¿cómo lo configuro?

Ejemplo

Veamos un ejemplo sencillo utilizando un contenedor con wordpress instalado y otro con un SQL MariaDB de back-end vinculada.


In [ ]:
# %load ejemplo/docker-compose.yml
wordpress:
  image: wordpress 
  links: 
    - db:mysql 
  ports: 
    - 8080:80

db:
  image: mariadb 
  environment: 
    MYSQL_ROOT_PASSWORD: 123456

¿Vemos si anda?

¡¡Muchas gracias!!

Presentación: Jupyter https://jupyter.org/

Control remoto: Pysenteishon https://github.com/edvm/pysenteishon