Te has suscrito correctamente a Omniscientia
¡Excelente! A continuación, completa el pago para obtener acceso completo a Omniscientia
¡Bienvenid@! Has iniciado sesión correctamente.
¡Perfecto! Tu cuenta está completamente activada, ahora tienes acceso a todo el contenido.
Tu información de facturación está actualizada.
Artículo añadido a la lista de artículos pendientes.
Algo ha fallado al actualizar tu información de facturación.
Artículo borrado de la lista de artículos pendientes.
Ha ocurrido un error al añadir el artículo a la lista de artículos pendientes.
El artículo que intentas añadir ya está en tu lista.
Docker, aplicaciones para todos y en cualquier lugar

Docker, aplicaciones para todos y en cualquier lugar

Docker es un sistema operativo de contenedores, encargado de acelerar la forma en la que creamos aplicaciones. ¿No lo conoces? Te lo cuento todo

Ivan Gil
Ivan Gil
7 minutos de lectura

Bienvenido a un nuevo tutorial de aplicaciones web avanzadas 👏

Hoy quiero hablarte de Docker. Créeme que si no lo conoces y te dedicas a programar profesionalmente o tienes intención de hacerlo, te puede “salvar la vida” y evitarte situaciones muy incomodas 😅

¿Qué es Docker?

Esta es la primera pregunta que te debes estar haciendo y para que lo veas claro quiero ponerte un caso real (Si eres programador seguro que ya lo has vivido y si quieres serlo siento decirte que tarde o temprano te pasará, pero ¡tranquil@! Nos ha pasado a todos 😌).

Estás desarrollando una aplicación y tras mucho trabajo, test, depuraciones, etc. ha llegado el día de compartirla con tu jefe/a, compañero/a o el propio cliente, incluso te puede pasar subiéndola a tu propio servidor (no se libra nadie 🤣).
Tu preciosa y nueva aplicación funciona a las mil maravillas 🚀 y su interfaz abre una nueva era de la digitalización 🤩 (¡es posible que sea algo muy ingenioso que incluso cambie la manera como vemos el mundo! Un nuevo color para la calculadora de Windows por ejemplo 😎), como iba diciendo, te la llevas en un pendrive o la subes a un repositorio 🎁 (otro día te hablaré de los repositorios y lo necesarios que son) y justo cuando estás en la presentación la ejecutas con tu código genial de inicio 🐱‍💻 y … ERROR …. Empiezas a mirar y revisar todo, revisas el fallo que te ha dado (te sientes medio imbécil), te pones nervioso y te entran los sudores (aquí ya te vuelves imbécil del todo y aunque la propia aplicación te llamase por teléfono para decir que falla, no serías capaz de verlo), no entiendes nada… de hecho la acabas de probar en tu portátil y FUNCIONABA…. y es posible que lo único que te sale decir en ese momento es… lo siento 😯, no sé qué ha pasado, en mi ordenador funcionaba…. Y tú jefe que es de respuesta rápida te dice…. ¿Y qué hacemos? ¿Le damos tu ordenador al cliente?

¿Qué nos acaba de ocurrir? Muy posiblemente nuestra fantástica aplicación requiere de una librería del propio sistema operativo o un software que ya estaba en nuestro equipo, pero al pasarla al servidor o equipo nuevo, este no tenía ese software/librería o es otro sistema operativo y no es compatible con una parte de nuestra aplicación si no instalamos algo antes....

¿Cómo podemos solucionar esto? Y créeme, si no te ha pasado, TE PASARÁ.

Pues para eso precisamente existe Docker 🦸‍♂️📦

Docker es un sistema operativo de contenedores, encargado de acelerar la forma en la que creamos aplicaciones, permitiéndonos compartir y ejecutar aplicaciones modernas en diferentes sistemas operativos sin tener que pasar por problemas de compatibilidad y facilitándonos y estandarizando la puesta en marcha y mantenimiento de estas.

¿Cómo funciona?

Básicamente creamos nuestra aplicación y la metemos dentro de una caja junto a todo lo necesario para que funcione.

¿Tu aplicación funciona gracias a Linux? Bien, Linux estará en esa caja, pero… ¿necesitas todo de Linux? ¿No? Genial, quito el escritorio por aquí… todas las opciones de arranque, las aplicaciones, el reconocimiento facial, la IA skynet, dejo esto y aquello... ¿Qué? ¿Qué también necesitas este software que no viene con Linux? Lo ponemos también, no hay problema.

Docker, nos permite elegir la base de nuestra aplicación y sobre esta base podemos ir añadiendo todo lo que nos hará falta, después de esto, podremos añadir nuestra propia aplicación y no solo eso si no que dejaremos configurada una rutina de inicio por la que debe pasar nuestra aplicación (todos los comandos para que arranque sin problema).

De esta forma da igual el sistema operativo en el que estemos (Windows, Linux, MacOS, …) o, aunque se trate del mismo sistema operativo, pero sin ciertas aplicaciones o drivers/librerías instaladas, nuestra aplicación funcionará siempre que tengamos Docker instalado en nuestro sistema porque nuestro archivo Docker (imagen) ya contendrá todo lo necesario para ponerse en funcionamiento, incluso los archivos de otro sistema operativo.

¿Qué lo hace tan especial?

Bueno realmente si piensas en ejecutar una aplicación en varias plataformas o sistemas operativos, tienes la opción de adaptarla para que sea multiplataforma o lo primero que te viene a la mente es crear una máquina virtual con lo justo para que arranque el sistema operativo (para esto también se creó valgrant, otro día te hablaré de él).

Si no las conoces, las maquinas virtual son unos espacios que se crean dentro de un sistema operativo y consumen/comparten tu disco duro, memoria RAM y procesador (recursos en general) para ejecutar un sistema operativo dentro de otro. El problema de esto es que ejecutar por ejemplo todo Windows 10 dentro de nuestra maquina con Ubuntu (Linux) porque nos hacen falta 3 archivos de Windows y un programita para que funcione… es un poco EXAGERADO, sin tener en cuenta la cantidad de recursos innecesarios que se pierden.

Hasta ahora te he hablado de lo genial que es hacer funcionar tu aplicación en cualquier sitio, pero no siempre es suficiente con que arranque, hay que ejecutar comandos al iniciarla y volverlos a ejecutar si falla… por suerte Docker también nos resuelve esto.

Cada contenedor Docker contiene nuestra aplicación, (si la configuramos bien) lo justo y necesario para que esa aplicación funcione (incluso otro sistema operativo) pero además tiene todas las configuraciones y comandos para que encienda y funcione o realice la tarea que le programemos.

Cuando iniciamos por primera vez nuestro contenedor o IMAGEN, esos comandos se ejecutan y se ponen a trabajar, pero si ocurre o un fallo o simplemente paramos nuestro contenedor, cuando volvamos a iniciarlo volverá a ponerse en marcha y aquí tengo que darte el primer susto….

¡Nuestro contenedor no almacena datos 😲🤯! Estarás pensando… vaya m#@@!#€ ¡Esto significa que si mi aplicación se apaga! ¡lo pierdo todo!

Nada más lejos de la realidad, por ahora no quiero liarte demasiado, ya que iremos ampliando en próximos artículos pero recuerda que tu información se almacena en bases de datos y Docker también nos da la posibilidad de realizar funciones como por ejemplo lectura y escritura en una carpeta externa, de esta forma si por ejemplo tu aplicación es un sitio web que tiene sistema de usuarios y les dejas subir su foto de perfil, esas fotografías se almacenan en esa carpeta externa y si el contenedor se apaga y enciende todas las fotografías estarán a salvo.

Caso práctico

Siempre se dice que una imagen vale más que mil palabras y por eso mismo te voy a explicar cómo iniciarte en Docker y crear tu primer contenedor.

Supongamos que tenemos una aplicación de Node.js (que es en lo que centraré mis artículos), lo primero que necesitaremos será crear un dockerfile (este archivo contendrá todas las instrucciones para crear nuestra imagen (el archivo que lo contendrá todo)).

Nuestro fichero .dockerfile sería algo así….

FROM node: 16.8.0-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . ./
EXPOSE 4221
CMD npm run start
Archivo de ejemplo .dockerfile

Si revisamos el archivo de arriba (el docker file), en la línea 1 le indicamos con FROM que imagen o base utilizaremos. Como yo no necesito todo el sistema operativo y mi base es Node.js que funciona en todos, uso Node.js de base y me ahorro el resto, además utilizo la versión alpine que es la que viene con lo justo y necesario y ocupa menos. Puedes comprobar las imágenes de Node.js en el siguiente enlace: https://hub.docker.com/_/node

Lo siguiente que hago es crear el directorio que contiene la aplicación dentro de la imagen. En este caso la carpeta app

Después paso a copiar el archivo package.json y package.lock.json (por eso el *)

Más tarde ejecuto npm install (esto, si ya has usado Node.js o has leído mi anterior tutorial, sabrás que es para coger todas las dependencias y librerías que figuran en el package.json de la nueva imagen e instalarlas dentro)

Ahora lo que hago es coger todo lo que hay en el directorio actual (el de la aplicación en mi PC, por eso el . que significa la raíz) y lo copio a la raíz del WORKDIR de la imagen (./) o lo que es lo mismo, a la carpeta /app de nuestra nueva imagen Docker.

Con EXPOSE lo que hago es exponer el puerto por el que funciona mi aplicación (es decir que abro una puerta del contenedor para que mi aplicación Node.js se comunique con el mundo) (si tu aplicación usa otro puerto simplemente modifica el número del .dockerfile para que sea el que usa tu aplicación).

Por último, con CMD ejecuto el comando que realmente enciende la aplicación.

Ahora que ya tenemos nuestro .dockerfile acabado, podemos crear nuestra imagen de Docker con este comando:

Docker build -t mi-aplicación-node
Comando para compilar tu aplicación en un único archivo o "Imagen"

La -t indica que el texto siguiente es una etiqueta, de esta forma cuando ejecutemos Docker images para ver que imágenes Docker tenemos, veremos nuestra aplicación con el nombre mi-aplicación-node

Y ahora sí, ha llegado el gran momento, ya hemos convertido nuestra aplicación en un archivo con el comando anterior y vamos a ponerla a funcionar.

Ejecutamos: Docker run -p 4221:4221 -d mi-aplicación-node

Y si entras en http://localhost:4221 podrás ver cómo funciona.

Para probar, haz una sencilla aplicación web de Hola mundo, te dejo un enlace al tutorial donde explico cómo crearla: Tu primera aplicación web con Node.js.

¿No te resulta increíble 😁? Prueba a copiar tu imagen de Docker y llevarla a otro PC, no instales ni siquiera Node.js en ese otro PC e inicia la imagen Docker, verás como sin tener ni siquiera Node.js tu aplicación enciende y funciona perfectamente. Ahora imagina un servidor y todo lo que podrías hacer sin tener que instalarle porquerías y que cada aplicación tenga solo lo que necesita y qué si necesitas apagar y encender algo no tengas que configurar nada, solamente apagar y encender la imagen cuando vuelvas a estar listo y como si nada.

Resumen de ventajas

Docker nos permite mover toda nuestra aplicación en un solo archivo.

Ese archivo se puede ejecutar en cualquier equipo o servidor, sistema cloud, ...

Nuestra aplicación siempre estará lista para funcionar con decírselo, sin necesitar que nadie ejecute comandos, simplemente le indicaremos que se encienda y lo hará.

Si sufrimos un fallo en nuestra máquina, podremos poner nuestra aplicación en otro sitio y funcionará como si nada.

Nuestra aplicación y todo lo que necesita se encontrará dentro de un espacio aislado que dificulta el acceso o la mala configuración del anfitrión (servidor, equipo, …), además nos evita tener que instalar nada, si necesitamos una base de datos local, nuestro contenedor ya la tendrá, no hace falta que la instalemos en el servidor y la configuremos.

*Bonus

Cuando creamos el .dockerfile y después generamos la imagen con docker build es posible que se copien archivos que no nos interesa copiar, para evitar esto, en el directorio principal de nuestra aplicación (donde hemos creado el archivo .dockerfile) creamos un archivo llamado .dockerignore y dentro le indicamos que archivos o directorios queremos excluir. Por ejemplo:

.git
*dockerfile*
Node_modules
Archivo .dockerignore

Aquí acabamos de excluir de nuestra imagen Docker, los propios archivos para configurar la imagen Docker (no los necesitamos dentro), los archivos de GitHub (tu imagen se usará en producción, ¡no los necesitas!) y la carpeta node_modules (la carpeta node modules contiene los módulos npm pero recuerda que nuestra imagen Docker tiene un comando para descargar e instalar los módulos “npm install” así que no te hace falta copiarlos).

En próximos artículos mejoraremos un poco más nuestro contenedor y agregaremos algunos trucos muy útiles, además te contaré otras muchas ventajas y hablaremos también de sus inconvenientes y desventajas (también las tiene)

¿Qué te ha parecido el artículo? ¿Tienes dudas? ¿Te gustaría que explique algo más a fondo? Déjame un comentario abajo y te contesto 😉