A lo largo de los años, las aplicaciones y herramientas se han vuelto más complejas para adaptarse a los cambiantes requisitos y expectativas de las personas. Pero esto puede crear problemas de compatibilidad de código y acceso remoto. Por ejemplo, una base de código que funciona correctamente en Windows puede desarrollar errores de compatibilidad cuando se instala en Linux.
Afortunadamente, Docker viene al rescate. Pero podrías estar preguntándote: ¿qué es Docker y cómo ayuda? Aprenderás todo esto y más en este tutorial.
Pero antes de comenzar, aquí hay algunos requisitos previos:
-
Conocimiento de comandos de Linux
-
Conocimiento del uso de la terminal
-
Conocimiento de Node.js y Express.js
Tabla de Contenidos
¿Qué es Docker?
Docker es una herramienta de código abierto que facilita la ejecución de software de manera consistente, sin importar dónde te encuentres. Lo hace colocando tu aplicación y todo lo que necesita (como bibliotecas y configuraciones) en un contenedor (del cual hablaré más adelante).
Imagina un contenedor como una caja: contiene tu aplicación y todas sus partes, por lo que funciona exactamente igual en tu computadora portátil, un servidor o en la nube. Docker ayuda a los desarrolladores a evitar el problema de “funciona en mi máquina” al garantizar que todo esté empaquetado de manera confiable y portátil.
Docker fue creado por Solomon Hykes en 2013. Con el tiempo, ha evolucionado para abarcar una amplia gama de herramientas. Se ha convertido en una herramienta fundamental para mejorar los procesos de implementación de aplicaciones y redes.
Antes de continuar, aquí tienes algunos términos clave con los que te encontrarás a medida que avanzamos en este tutorial:
Motor de Docker
El motor de Docker, como su nombre lo indica, es la potencia detrás de las aplicaciones de Docker. Tiene un componente cliente y un componente servidor. El cliente de Docker, en nuestro caso, es la herramienta de interfaz de línea de comandos o terminal de Docker que utilizaremos para enviar los comandos relevantes para la ejecución del proyecto. El servidor de Docker, conocido popularmente como el demonio, es el servidor que se encarga de ejecutar las diversas imágenes y contenedores de Docker.
Imagen de Docker
Las imágenes de Docker son plantillas predefinidas de software y sistemas ejecutables. Docker ofrece una amplia gama de imágenes que van desde plantillas de sistemas operativos hasta plantillas de servidores, plantillas de software, y así sucesivamente. Puedes encontrar todas estas en el registro de Docker Hub donde se almacenan estas imágenes.
También puedes crear una imagen específica y alojarla públicamente en Docker Hub o en un registro privado.
Contenedores de Docker
Los contenedores de Docker son instancias compactas ejecutables construidas sobre la plantilla generada que es la imagen de Docker. Son paquetes livianos y portátiles que incluyen todo lo necesario para ejecutar un software: código, tiempo de ejecución, bibliotecas y herramientas del sistema. Un contenedor garantiza que la aplicación se ejecute de manera consistente independientemente del entorno.
Beneficios de usar Docker
A continuación, algunos de los beneficios de usar Docker como desarrollador backend:
-
Docker es una gran herramienta para crear una sólida cultura de DevOps para el desarrollo de aplicaciones, ya que aclara las funciones de los equipos de desarrollo y operaciones.
-
También es bastante flexible, lo que permite una fácil implementación de microservicios y aplicaciones backend monolíticas distribuidas.
-
También minimiza los errores por configuraciones incorrectas de dependencias durante las instalaciones, ya que porta la aplicación con sus dependencias necesarias todo a la vez.
Pasando a otro tema, nos sumergiremos en cómo Dockerizar una aplicación de Node.JS Express. Pero antes de eso, necesitarás instalar Docker en tu computadora. Puedes omitir esto si ya lo tienes instalado.
Cómo instalar Docker
Docker es una herramienta multiplataforma que se puede instalar en todos los sistemas operativos populares (Windows, Mac OS y distribuciones de Linux). Para este tutorial, solo resaltaré cómo configurar Docker en Windows.
Si actualmente estás usando cualquier sistema operativo que no sea Windows, puedes configurar Docker fácilmente siguiendo los pasos en la documentación de Docker aquí.
Para los usuarios de Windows, es esencial que tu PC cumpla con las especificaciones mínimas; de lo contrario, la instalación no será exitosa. Los requisitos mínimos son los siguientes:
-
Una versión de Windows OS no inferior a Windows 10 Home
-
Una PC con WSL-2 instalado o hipervisor habilitado.
Con eso, pasemos a descargar el ejecutable del instalador de Docker. Puedes descargar el último instalador de Docker desde aquí. Después de hacerlo, ejecuta el software y acepta los términos y condiciones. Al completar con éxito, inicia la aplicación. Esto es lo que deberías ver:
Para confirmar que has instalado la aplicación correctamente, ve al terminal de la línea de comandos y ejecuta Docker --version
. Deberías ver la versión exacta de la herramienta del motor Docker que has instalado si fue exitoso.
Ahora pasaremos al proyecto en sí.
Proyecto de demostración: Cómo contenerizar una aplicación Node.js
En esta sección, contenerizaremos un sencillo servicio backend basado en Node.js con dependencias mínimas. Esto te mostrará cómo contenerizar y trasladar una aplicación utilizando una técnica de contenerización de aplicaciones Docker conocida como el Dockerfile. Ten en cuenta que si tienes una aplicación más compleja, puede ser mejor utilizar la herramienta YAML de Docker compose.
Para empezar, configuraremos la aplicación de muestra de Node.js. Proporcionaré todo el código de configuración en este artículo, a continuación. Pero primero, vamos a entender qué es un Dockerfile.
¿Qué es un Dockerfile?
Básicamente, un Dockerfile es un sistema de plantillas que permite al usuario introducir comandos que, al ejecutarse, pueden producir una imagen funcional de la aplicación. Esta imagen luego se puede convertir en un contenedor.
Aquí hay algunos comandos incluidos en la estructura básica de un Dockerfile:
-
CMD
: establece el comando predeterminado a ejecutar si no se especifica ningún comando cuando el contenedor se inicia. Se puede anular proporcionando un comando al ejecutar el contenedor (docker run ...
). -
ENTRYPOINT
: Especifica el comando principal que se ejecuta siempre cuando el contenedor se inicia. No se anula fácilmente, pero se pueden añadir argumentos.
Nota queCMD
yENTRYPOINT
especifican qué comando o proceso debe ejecutar el contenedor al iniciarse. Pero se utilizan de manera diferente y tienen propósitos distintos. UtilizaCMD
para un comportamiento predeterminado que se puede anular. UtilizaENTRYPOINT
para un comando fijo que define el propósito principal del contenedor. -
FROM
: Esta es generalmente la declaración inicial en un Dockerfile. Este comando obtiene una imagen base que forma la base para construir la imagen de la aplicación en cuestión. Por ejemplo, en nuestra aplicación, la imagen base para una aplicación Node.js es tener instalado el motor Node.js básico. -
WORKDIR
: Esta sintaxis define el directorio de trabajo activo donde vivirán los archivos de la aplicación dentro del contenedor definido. Se creará una carpeta automática si aún no está disponible. -
COPY
: Esta sintaxis se utiliza para asegurar que los archivos necesarios para crear la imagen de Docker desde el archivo del proyecto de la base de código sean copiados al contenedor de Docker recién creado. Los directorios de estos archivos están cuidadosamente destacados. -
RUN
: Esta sintaxis especifica el script que deseas que se ejecute antes de completar la contenedorización de la aplicación. -
ENV
: Esta sintaxis se utiliza para resaltar las variables ambientales y secretos que serán invocados durante el proceso de ejecución de la aplicación. -
EXPOSE
: Esta sintaxis mapea el puerto de navegación donde la aplicación se utiliza para comunicarse con el internet externo. Por ejemplo,EXPOSE: 3000
mapea la interfaz web de la aplicación alocalhost:3000
.
Profundizando en Docker, repasemos rápidamente algunos comandos clave de Docker que utilizaremos a lo largo de este tutorial:
-
Docker ps
: Este comando lista todos los contenedores en ejecución en tu terminal Docker. -
Docker run
: Este comando ejecuta una imagen de Docker para activar una instancia de un contenedor. -
Docker build
: Este comando funciona basado en el archivo Docker para generar una imagen de un servicio o aplicación. -
Docker rm
: Este comando se puede usar para eliminar una imagen utilizando los detalles de identificación de la imagen.
Cómo contenerizar la aplicación
Ahora podemos comenzar a contenerizar nuestra aplicación simple de Node/Express. Para seguir el tutorial, puedes obtener el código base de aquí.
Al probarlo localmente, devuelve una API CRUD donde puedes crear, obtener, actualizar y eliminar productos cuando se ejecuta. Empaquetaremos la aplicación para un fácil despliegue en la nube usando nuestro motor Docker. Podremos hacer esto usando la herramienta Dockerfile que discutimos anteriormente.
Paso 1: Crea el dockerfile
En tu carpeta de proyecto, crea un archivo llamado Dockerfile
. Asegúrate de que el nombre sea exactamente “Dockerfile” (sin extensión y sensible a mayúsculas en algunos sistemas, así que asegúrate de que esté en mayúsculas).
Si estás usando un editor de código, simplemente crea un nuevo archivo llamado Dockerfile
. Si estás usando un editor de texto básico, guarda el archivo con el nombre Dockerfile
y asegúrate de que no se guarde accidentalmente con una extensión como .txt
.
Luego ingresa la primera línea:
FROM Node:18-alpine
Este comando obtiene la imagen base que usaremos para ejecutar nuestra aplicación Express, que es el propio motor Node.
Quizás te estés preguntando para qué sirve alpine
. Alpine es una versión liviana, mucho más comprimida de una imagen Docker. Excluye la incorporación de paquetes adicionales que no son directamente esenciales para el sistema operativo base. Se recomienda como una buena práctica de codificación estándar usar distribuciones ligeras para una ejecución más rápida y un uso fácil.
Paso 2: Establecer el directorio de trabajo
WORKDIR /app
Esto establece el directorio de trabajo de la imagen en la carpeta /app
del contenedor. Se asegura de que todas las acciones de archivo ocurran aquí y todos los archivos se copien en este directorio.
Paso 3: Copiar los archivos necesarios
COPY package.json
Este comando copia los archivos package.json
que tienen una lista de dependencias y paquetes a instalar para alimentar nuestra aplicación.
Paso 4: Ejecutar un script de configuración
RUN npm install
Este comando asegura que todas las dependencias necesarias para alimentar nuestras aplicaciones de Node.js estén instaladas en el contenedor.
Paso 5: Copiar los archivos de código
COPY . .
Este comando asegura que todos los archivos dentro del directorio local se copien en el sistema de archivos del contenedor dentro del directorio de trabajo establecido.
Paso 6: Exponer el puerto del servidor
EXPOSE 3000
Este comando expone el puerto del servidor que pretendemos utilizar para acceder al contenedor. En este caso, es el puerto 3000.
Paso 7: Incluir el comando para iniciar el contenedor
CMD ["npm", "run", "dev"]4
Este comando se ejecuta al final para encender la aplicación de Node.js. Simplemente ejecuta el comando npm run dev
, que es lo que usarías para un entorno de desarrollo. Para ejecutarlo en un entorno de producción, usarías en su lugar el comando npm start
.
Al haber completado este proceso, así es como debería lucir la estructura final del Dockerfile:
FROM Node:18-alpine
WORKDIR /app
COPY package.json
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]
Probando el contenedor Docker
Para resumir, crearemos una imagen Docker de nuestra aplicación Node.js. Para hacer esto, ejecuta el comando docker build -t nodeapp .
. El comando docker build
construye la imagen, mientras que el -t
permite especificar los detalles de la etiqueta de la imagen.
En nuestro caso, asignamos el nombre nodeapp
a la imagen que crearemos y la imagen se creará dentro del directorio de trabajo.
¡Felicidades! Has construido exitosamente tu primera imagen Docker. Para ver todas las imágenes en tu repositorio local, ejecuta el comando docker images
.
Para crear una instancia de trabajo de tu imagen para pruebas, ejecuta el comando docker run nodeapp
.
Estamos utilizando Mongo DB como nuestra base de datos para este tutorial, así que necesitaremos pasar la URL de MongoDB como una variable de entorno al contenedor de Docker. Las variables de entorno te ayudan a proteger ciertas variables clave que no deben exponerse al público. Otras variables que se pueden pasar como variables de entorno incluyen claves de API y códigos de encriptación.
Para pasar la URL de MongoDB al contenedor de Docker, utilizamos la etiqueta -e
para asegurar que Docker reconozca el valor correspondiente ingresado como una variable de entorno.
docker run -e JWT_SECRETS={ingresa el valor de tu elección} -e MONGO_URL={La URL de mongo de tu elección} nodeapp
.
Para también usar el contenedor en segundo plano, simplemente adjunta la etiqueta -d
que representa la opción de detach. Esta opción permite que el contenedor se ejecute en segundo plano a pesar de salir del terminal de línea de comandos.
En caso de no haber errores, al navegar a localhost:5000
también debería producir algo similar a la imagen a continuación.
Conclusión
En este artículo, aprendiste qué es Docker y cómo funciona, junto con sus comandos comunes y cómo usarlo para contenerizar una aplicación backend. Avanzando desde lo básico, también puedes explorar otros usos de Docker en integración continua y desarrollo. Para aprender más sobre Docker, puedes consultar su documentación aquí.
También te recomendaría utilizar tus nuevos conocimientos para implementar proyectos con casos de uso reales, así como explorar la red en aplicaciones Docker. Para hacer que tu aplicación esté en vivo, puedes implementar fácilmente la imagen de Docker que creaste en cualquiera de los populares proveedores de servicios en la nube como AWS, GCP, Azure, entre otros.
¡Siéntete libre de hacerme cualquier pregunta! También puedes consultar mis otros artículos aquí. ¡Hasta la próxima, sigue programando!
Source:
https://www.freecodecamp.org/news/containerize-a-nodejs-application-using-docker/