¿Qué es docker y como usarlo?

¿Qué es docker?

Docker es una de las herramientas que deberían ser imprescindibles para cualquier desarrollador. Facilita la "configuración" de un entorno de trabajo. Con tan solo un par de comandos podemos tener listas las dependencias (servicios) para correr nuestra aplicación web o cualquier otro proyecto en el que estemos trabajando

¿Cómo instalarlo?

Ve a la página oficial de docker. Como desarrolladores nos basta con descargar Docker Desktop, el cuál está disponible para cualquier plataforma.

¿Cómo funciona?

Una de las partes importantes de Docker es el concepto de imagen. Podemos decir que una imagen es el estado de un conjunto de binarios, que bien puede ser por ejemplo una máquina debian que tiene instalado Apache dentro de ella (De hecho, este es el caso de la imagen oficial de Apache la cual puedes consultar aquí).

Una imagen debe ser un solo servicio, es decir, si planeas hacer una aplicación con un servidor Apache y que requiera una base de datos MariaDB tendrás al menos dos imágenes para lograrlo: una para el servidor web y otra para la base de datos.

Además, cada imagen por lo general expone un puerto.

Una imagen no es dinámica. Es decir, sólo es la forma de crear algo que realmente podemos manipular: contenedores. La imagen es la base para crear un contenedor. Podemos tener muchas contenedores corriendo la misma imagen.

En el diagrama de abajo podemos ver un ejemplo de dos contenedores (creadas de dos imagenes distintas: una de Apache y otra de MariaDB). Las imagenes exponen puertos, pero estas NO están disponibles para acceso externo incluso nosotros a través de "localhost"  tampoco podemos acceder a estos servicios. Para hacerlo se deben publicar los puertos en nuestro sistema anfitrión.



Finalmente podemos hacer que estos servicios se queden encapsulados y se comuniquen entre ellos gracias al concepto de redes: no necesitas saber como funciona una red, simplemente tener en cuenta que los contenedores dentro de una red son accesibles entre ellos.

¡Deja de hablar! Enséñame a usarlo.

Ok, ok. Para eso tendremos que usar la terminal. Si eres de Windows, usa Powershell.
Para la práctica descargaremos la imagen oficial de MongoDB y la imagen de un cliente para para mongo escrito en JavaScript. Después crearemos una red y crearemos un contenedor por cada imagen.

1. Descargar imagenes. 
Para descargar imagenes debes ir a Docker Hub el cual es un registro publico de imágenes. Busca el servicio o utilería que necesites y descárgalo desde la terminal con:
docker pull <image>

En mi caso usé: 

docker pull mongo-express

docker pull mongo 



2. Crear red
Para que el contenedor del panel de administración pueda conectarse con la base de datos debe iniciarse en la misma red que el contenedor de mongo.
La crearemos y la llamaremos red-mongo-prueba.
docker network create red-mongo-prueba

Nota: Se devolverá un identificador distinto siempre.

3. Crear contenedores
Para crear contenedores en docker usamos el comando
docker run <nombre_de_la_imagen>
No obstante, usaremos algunas opciones para configurar el contenedor.

    3.a. Crear contenedor de mongoDB.

docker run -it -d --name mongo1 --network red-mongo-prueba mongo


     3.b. Crear contenedor de cliente web mongodb
 docker run -it -d --network red-mongo-prueba -e ME_CONFIG_MONGODB_SERVER=mongo1 -p 8081:8081 --name mongo2 mongo-express

    Como en este contenedor nos interesa conectarnos a través de nuestro       navegador es importante "publicar" el puerto del contenedor a nuestra máquina (opción -p). 


4. Ver contenedores creados:
Para ello usaremos el comando
docker ps



Podemos observar que tenemos un contenedor llamado mongo1 que se refiere a la base de datos (imagen mongo) y mongo2 que es el cliente (imagen mongo-express). También notamos en amarillo y verde la diferencia de los puertos de los contenedores: Uno se expone (verde) y el otro está encapsulado dentro del motor de docker. Si quisiéramos conectarnos a través de nuestra computadora sería imposible pues no hemos publicado el puerto.

5. Ir al cliente en nuestro navegador:

Abre localhost:8081 y verás el cliente:



Resumen

Hemos aprendido conceptos importantes de docker: imágenes, contenedores y redes. Las imágenes son distintas a los contenedores, una imagen es la forma de crear un contenedor. Una red es la forma de conectar instancias de contenedores para que se comuniquen entre ellos y finalmente debemos publicar el puerto que expone un contenedor para que podamos usarlo en nuestra máquina (y posiblemente en otras).

En la práctica aprendimos a levantar una base de datos de MongoDB y un cliente web para ella. 

¿Qué sigue?

Aunque aprendido lo básico, estos contenedores no tienen persistencia de datos. Una vez que se apagan todo lo que estaba dentro de ellos desaparece. Para ello es importante el concepto de "volumen". También podemos automatizar la creación de ambientes de trabajo (múltiples contenedores) con compose.

Comentarios