Docker para principiantes! Aprende en 5 mins lo necesario!

¿Cuántas veces tienes código que funciona a la perfección en tu ordenador y de repente deja de funcionar? ?Se lo pasas a algún compañero y en su ordenador saltan mil errores? ?Te matas a trabajar durante un largo tiempo y cuando entregas el proyecto no funciona? Todos estos errores se solventan, y además, muy fácilmente, con un contenedor y la ayuda de Docker. ¡Léete el post y aprende!

meme sobre docker
Meme cortes?a de Saad A Akash

¡Espera! Si no sabes qué es MLOps, te vendrá? bien leerte este post introductorio antes de seguir leyendo.

¿Qué es Docker?

Docker es un software Open Source que automatiza el despliegue de aplicaciones dentro de contenedores. Esto facilita el empaquetado y aislamiento de software para que después pueda ser desplegado en otro entorno. Todo ello aportando una API muy amigable para que sea fácil de usar.

¿Qué es un Contenedor?

Un contenedor es la unidad estándar de software que empaqueta el código y todas sus dependencias para que la aplicación se ejecute de manera eficaz y robusta independientemente del entorno en el que se despliegue.

Estructura de aplicaciones lanzadas en contenedores a trav?s de docker
Imagen sacada de la página oficial de Docker

Las instrucciones para crear el contenedor se denomina imagen. Es decir, una imagen es el blueprint del contenedor. Esta imagen se puede compartir y en cualquier sitio donde se despliegue se va a poder replicar con totalidad el contenedor original. Dentro de estas instrucciones se encuentra el código, herramientas de sistema, librerías y configuraciones del contenedor.

Una imagen se convierte en un contenedor Docker al ser ejecutadas en Docker Engine.

Hay diferentes tipos de contenedores Docker que se pueden ejecutar en Docker Engine:

  • Estándar: contenedores creados según las guías de Docker para poder ser ejecutados en cualquier entorno.
  • Ligeros: contenedores que comparten el núcleo del sistema operativo, por lo que no necesitan un OS por cada aplicación. Esto aumenta la eficiencia del servidor y reduce los costes del servidor y de licencias.
  • Seguros: este tipo de contenedor Docker proporciona un aislamiento seguro.

Si es virtualización de SW… ¿en qué se diferencian Docker y una VM?

Una máquina virtual (VM) se trata de una emulación de un ordenador. Es decir, un aislamiento de recursos que proporciona los beneficios de la virtualización. Sin embargo, sigue siendo diferente a la virtualización que ofrecen los contenedores. Una VM virtualiza Hardware y Software mientras que un contenedor virtualiza sólo el Software. Un contenedor suele ser más portable y eficiente porque además replica menos software.

Una VM necesita, aparte del hipervisor, un sistema operativo completo y las librerías necesarias.

Un contenedor comparte el OS con el host. Esto hace que los contenedores se ejecuten como procesos nativos y no introducen gastos adicionales. Además, las aplicaciones pueden compartir librerías y datos entre contenedores.

Estructura de contenedores con docker
Imagen sacada de la página oficial de Docker
Estructura de aplicaciones lanzadas con VM
Imagen sacada de la página oficial de Docker

Vamos a generar una imagen Docker

Para generar una imagen Docker, necesitamos un dockerfile. Se trata de un fichero de texto con las instrucciones para crear una imagen. (Valga la redundancia, las instrucciones de las instrucciones para crear un contenedor).

Configuración de la docker file

Crear una docker file es muy sencillo. Sólo hay que abrir el editor de texto y definir las instrucciones. El nombre del fichero no importa, por defecto es Dockerfile, pero se puede usar cualquiera y tener varios en la misma carpeta.

# Cada instruccion en el fichero genera una capa que se manda a la cache de la imagen local 
# Especificamos que la imagen se va a basar en la ultima version oficial disponible de Ubuntu
FROM ubuntu:latest
 
# Identificamos quien se encarga de la gestion de la imagen
LABEL maintainer="nombre@compania.com"
 
# Actualizamos los paquetes de la imagen
RUN apt-get update && apt-get upgrade -y
 
# Instalamos NGINX, que va a ser la App que vamos a dockerizar.
RUN apt-get install nginx -y
 
# La exponemos en el puerto 80
EXPOSE 80
 
# Para terminar, lanzamos el comando para iniciar NGINX en el contenedor
CMD ["nginx", "-g", "daemon off;"]

Lanzamos nuestro contenedor Docker

Gracias al maravilloso mundo de Internet, siempre se puede encontrar aplicaciones gratuitas para casi todo. Y como no, Docker no iba a ser la excepción. Tenemos la página de play with docker (link) que nos permite lanzar contenedores de manera gratuita.

Play with docker preview
Captura de pantalla de Play with Docker

Lo primero que tenemos que hacer es iniciar sesión (la página nos da una sesión con ID aleatorio que caduca a las 4 horas).

Una vez dentro, crearemos una instancia nueva dando a «+Add new instance». Se nos creará una instancia que se gestiona por consola.

terminal de play with docker

Ahora, vamos a crear la Dockerfile. Para ello usaremos el editor vi. Ejecutamos «vi Dockerfile», pulsamos la «i» para entrar en modo de inserción, y pegamos/escribimos los comandos de más arriba. Para guardar el fichero presionamos «Esc» y después «:x» .

editor de texto de play with docker

El siguiente paso es construir la imagen. Para ello usaremos el comando docker build <path> .

Al final del proceso deberíamos tener un mensaje diciéndonos que se ha conseguido construir la imagen.

El ?último paso es lanzar la imagen y probar la conexión. Para ello usamos el comando docker run -p 80:80 <image ID> . La opción -p 80:80 sirve para exponer el contenedor en el puerto 80 como host y 80 para el mundo. Si no sabemos el Image ID, podemos usar el comando docker images para que nos muestre todas las imágenes disponibles.

contenedores lanzados con docker

Si ahora nos dirigimos a la dirección IP que nos presta el servicio, deberíamos tener una aplicación de NGINX funcionando:

NGINX docker container

Para configurar imágenes de nuestras propias Apps

Para poder hacer esto, mi recomendación sería encontrar imágenes base para las aplicaciones que queráis desplegar. Ya una vez tengamos el dockerfile base, sería editarlo a nuestro gusto.

Por suerte, Docker Hub es un repositorio de docker files en el que podemos encontrar estos ficheros base de los que hablo (link)

imagenes base de docker hub

Resumiendo

Docker se trata de un software de contenedores. Estos contenedores sirven para replicar aplicaciones software de manera eficiente en cualquier entorno. Esta réplica se consigue mediante el aislamiento del software y dependencias que necesita la aplicación.

Si quieres seguir aprendiendo sobre todo este mundo de Machine Learning con nosotros, ¡echa un vistazo a otros post!