¿Que es Docker y cómo se usa?

Taller de herramientas para Big Data

del 4 al 6 de marzo de 2019

Juan Pablo Soto y Julio Waissman

¿Que vamos a ver?

  • ¿Que es un contenedor?
  • Aspectos generales de Docker
  • Instalación de Docker CE
  • Uso básico de la CLI
  • Como hacer una imágen propia (Dockerfile)

Integración continua

Motivación: Aplicaciones monolíticas

  • Desarrollo lento

  • Desperdicio de recursos

  • Diferencias en desarrollo y producción

  • Escala mal, dificil de migrar

Solución: Máquinas virtuales

Aislamiento, seguridad, portabilidad,... lento

Solución: Contenedores

Se pierde en aislamiento, se gana en flexibilidad

Contenedores para desarrollo/producción

Contenedores para desarrollo/producción

  • Mismas dependencias para todos los desarrolladores
  • Cada proyecto tiene sus propias dependencias
  • Mismo comportamiento en desarrollo y en producción
  • Se configura una vez
  • Se aislan aplicaciones en producción

Componentes bácicos de Docker

Arquitectura general de Docker

Otros componentes de Docker

  • Dockerhub
  • Docker machine
  • Docker compose
  • Docker swarm
  • Docker stack

Instalemos Docker

En el material del taller hay una página con instrucciones en español que cubre las versiones de Windows viejitas

Para probar la instalación

$ docker version

$ docker info

$ docker run hello-world

$ docker pull ubuntu

$ docker run -it --rm --name mi_ubuntu ubuntu:latest

Línea de comandos de Unix (CLI)

Para sacar provecho de Docker es deseable conocer las operaciones más básicas de linea de comando

  • Comandos ls, cp, mv, mkdir, pwd y rm (uso básico)

  • El uso de man, less y saber leer la documentación con --help

  • Comandos básicos de git (clone, pull, push, add, commit)

  • Uso de al menos un editor en terminal (vi, emacs, jed o nano)

  • Saber que existen los archivos ocultos .XXXXXX y de configuración .XXXrc

Utilizar imágenes desarrolladas por otros

  • Desgargandolas de dockerHub

    • Buscandolas con google, bing, DuckDuckGo,...

    • Usando la linea de comando

$ docker search --help

$ docker search XXXX
  • Una vez que se sabe cual es la imágen que nos interesa (y el tag), se rescarga con el comando
$ docker pull usuario/imagen:tag
  • Veamos ejemplos para jupyter, spark, tensorflow, laravel, ``,...

Operaciones en imágenes

$ docker image --help
  • Listar
$ docker image ls
$ docker image ls -a
  • Eliminar
$ docker image rm (nombre o id)
  • Renombrar
$ docker tag (ImagenFuente)[:tag] (ImagenDestino)[:tag]

Creando contenedores

$ docker run --help
  • Ejemplos comunes
$ docker run -it --name (nombre-contenedor) (nombre-imagen)

$ docker run -dt --name (nombre-contenedor) (nombre-imagen)

$ docker run -it --rm --name (nombre-contenedor) (nombre-imagen)

$ docker run -it -v out-dir:in-dir --name (nombre-contenedor) (nombre-imagen)

$ docker run -it -p out-port:in-port --name (nombre-contenedor) (nombre-imagen)

Contenedores

  • Un contenedor se detiene saliendo de éste si está en modo attach (por default)

  • En Windows al parecer, no se detiene ni siquiera en modo attach

  • Para detener un contenedor detach(o en Windows)

$ docker stop (nombre-contenedor)
  • Para regresar a un contenedor detenido
$ docker start -ai (nombre-contenedor)
  • Para ejecutar un comando en un contenedor no detenido
$ docker exec -it (nombre-contenedor) (comando)

Más sobre contenedores

  • Siempre hay que nombrar los contenedores (buena práctica)

  • Cada contenedor tiene su información encapsulada

  • Listar los contenedores

$ docker container ls -n 5
  • Eliminar un contenedor
$ docker container rm (nombre o id)

Hagamos un ejemplo

  • Checar si tenemos la imágen jupyter/scipy-notebook:latest

  • Si no la tenemos descargarla

  • Generar un contenedor con los siguientes requisitos:

    • Habilitar el puerto 8888 en el puerto 8888
    • Montar una carpeta local en /home/jovyan/work
    • Llamar al contenedor taller-jupyter
  • Abrir jupyter en el navegador utilizando el token provisto

  • Generar un documento (sin importar como)

  • Salir del contenedor y asegurarse que se encuentra detenido

  • Regresar al contenedor y ver que el documento sigue existiendo

Tarea (para agilizar el taller mañana y pasado)

  • Descargar la imagen oficial de jupyter con spark
$ docker pull jupyter/pyspark-notebook
  • Descargar la imagen oficial de jupyter con tensorflow
$ docker pull jupyter/tensorflow-notebook

¿Porqué estas descargas las hace más rápido?

Imágenes propias a la medida

  • Modificando un contenedor y convirtiendolo en imagen

  • Generando una imágen a partir de otra de base con un Dockerfile

Imagen a partir de contenedor

  • Para contenedores que se desarrolla con root (superusuario)

  • No es la forma más elegante de generar una imágen

  • Un vez modificado un contenedor (incluyendo datos de usuario y archivos de configuración)

$ docker commit (contenedor) (usuario/imagen)[:tag]
  • y para que alguien más la pueda usar:
$ docker push (usuario/imagen)[:tag]

El usuario es el usuario de dockerhub.

Generando una imagen con Dockerfile

  • Script elegante y fácil de seguir

  • Se basa en una imagen anterior

  • Documentación sobre los comandos de Dockerfile

  • [Una guia para hacer Dockerfiles]

  • Una vez escrito el script en un archivo Dockerfile, y desde el directorio donde se encuentra

$ docker build -t (usuario/imagen)[:tag] .

Dos ejemplos de Dockerfile

  • Un servidor con flask (a partir del ejemplo del tutorial oficial)

$ docker build -t flask-app .
$ docker image ls
$ docker run -p 4000:80 flask-app
  • Una modificación a la imagen de jupyter

$ docker build -t usuario/jupyter-vim:ejemplo .
$ docker image ls
$ docker run -p 8888:8888 -v $PWD:/home/$NB_USER  --name tallerBD usuario/jupyter-vim:ejemplo

¡Pasemos ahora a ver como funciona Jupyter!