¿Que es Docker y cómo se usa?¶

Herramientas para Ciencia de Datos¶

9 de abril de 2021 (actualizado 4 de julio 2022)¶

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¶

Instalemos Docker¶

  • Seguir el proceso de instalación dependiendo la plataforma:
    • Docker Desktop para MacOS
    • Docker Desktop para Windows
    • Docker Desktop para Linux
    • Docker Desktop Linux user manual

Inclusive para Linux, es mejor instalar el nuevo Docker Desktop porque resuelve problemas de seguridad, aunque consume más recursos.

Para probar la instalación¶

$ docker version

$ docker info

$ docker run hello-world

$ docker pull ubuntu

$ docker run -it --rm ubuntu:latest

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

Ejercicio: ¿Una imagen para ejecturar RStudio?

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)

  • 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¶

  • De preferencia no usar contenerdores persistentes

  • Siempre hay que nombrar los contenedores persistentes

  • 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¶

  • Buscar para instalar la imagen de Ubuntu version 18.04 (bionic)

  • Si no la tenemos descargarla

  • Generar un contenedor persistente con los siguientes requisitos:

    • Habilitar el puerto 8888 en el puerto 8888
    • Montar una carpeta local (que gustes) en /root/data
    • Llamar al contenedor curso-i3
  • Dentro del contenedor instalar librerías con:

$ apt-get update
$ apt-get install sed grep curl csvkit vim git cowsay unzip unar nano tldr
$ apt-get install language-pack-en-base
  • Salir del contenedor (ctrl-D) y volver a entrar

Ahora nos tomaremos una pausa para ir a revisar el uso de la CLI¶

Descargando los datos de COVID¶

  • Vamos a descargar el archivo más reciente de la Secretaría de Salud (puede tardar)
$ curl --remote-name  https://datosabiertos.salud.gob.mx/gobmx/salud/datos_abiertos/datos_abiertos_covid19.zip
  • Vamos a descargar el diccionario de datos tambien
$ curl --remote-name https://datosabiertos.salud.gob.mx/gobmx/salud/datos_abiertos/diccionario_datos_covid19.zip

Descomprimiendo y revisando los datos¶

  • Descomprimir los archivos usando unzipo unar

  • Cambiar nombre para hacerlos más manejable usando mv

  • Revisar diccionario de datos usando in2csv

  • Jugar con los datos usando las herramientas de csvkit

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] .

El Dockerfile de la imagen que hicimos, en lugar de usar commit¶

FROM ubuntu:bionic

LABEL Julio Waissman <julio.waissman@unison.mx>

WORKDIR /root

RUN  apt-get -y update && \
     apt-get install -yq sed grep curl csvkit vim git cowsay unzip unar nano tldr 

RUN  apt-get install -yq locales && \
     locale-gen "en_US.UTF-8" && \
     export LANG=en_US.UTF-8

CMD ["bash"]

Ejemplo de Dockerfile¶

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

    • Descarga el archivo comprimido
    • Lee los archivos Dockerfile, app.py y requirements.txt
$ docker build -t flask-app .
$ docker image ls
$ docker run -p 4000:80 flask-app

Y esto es todo por el momento con Docker¶