Utilice Docker y Docker Compose para implementar y ejecutar sin problemas sus aplicaciones Nest.js.

"Pero funciona en mi computadora..." El chiste de los desarrolladores resalta perfectamente el desafío de implementar y ejecutar aplicaciones en diferentes sistemas.

La verdadera molestia radica en configurar las dependencias requeridas y garantizar que las versiones del software sean compatibles con su aplicación. Una excelente solución a este problema implica el uso de tecnología de contenedorización como Docker.

Le permite implementar y ejecutar aplicaciones sin esfuerzo (con todas las dependencias necesarias) dentro de la imagen del contenedor; eliminando la necesidad de una configuración extensa en los sistemas de producción.

Comprender Docker y Docker Compose

Estibador es una plataforma de desarrollo de código abierto que proporciona tecnología de contenedorización utilizada en la creación y empaquetado de aplicaciones junto con sus dependencias como imágenes portátiles.

Luego, estas imágenes se ejecutan como componentes ejecutables dentro de entornos de contenedores aislados. La ejecución de aplicaciones dentro de estos contenedores garantiza un rendimiento constante de las aplicaciones en diferentes sistemas de producción sin problemas de compatibilidad.

instagram viewer

Por otro lado, Docker Compose es una herramienta que se utiliza junto con Docker para simplificar el proceso de definición y gestión de aplicaciones multicontenedor.

Si bien Docker se utiliza principalmente para administrar contenedores individuales, Docker Compose le permite administrar la configuración de múltiples contenedores que deben ejecutarse como una sola aplicación.

Esto es particularmente útil cuando una aplicación consta de múltiples servicios que necesitan trabajar juntos, como varios servicios API dependientes y bases de datos, entre otros.

Antes de sumergirse en el código, debe instalar Escritorio acoplable en su máquina local. Siga los requisitos específicos del sistema y los pasos de instalación de la documentación oficial.

Puedes encontrar el código de esta aplicación en su GitHub repositorio.

Configurar un proyecto Nest.js

Esta guía lo guiará a través del proceso de creación de dos contenedores Docker que funcionan perfectamente como una única aplicación Nest.js. El primer contenedor contendrá una instancia de la imagen Docker del servidor web Nest.js, mientras que el segundo contenedor ejecutará la imagen de la base de datos PostgreSQL de Docker.

Para comenzar, instale la herramienta de línea de comandos Nest.js:

npm i -g @nestjs/cli

Ahora, cree un nuevo proyecto Nest.js ejecutando el siguiente comando en su terminal.

nest new docker-nest-app

A continuación, la herramienta CLI mostrará varios administradores de paquetes entre los que puede elegir para crear el proyecto. Elige tu opción preferida. En este caso, usaremos npm, el administrador de paquetes de nodos.

Por último, puede navegar hasta el directorio del proyecto y activar el servidor de desarrollo.

cd docker-nest-app
npm run start

Crear el módulo de base de datos

Primero, instale estas dependencias:

npm install pg typeorm @nestjs/typeorm @nestjs/config

A continuación, en el directorio raíz de su proyecto, cree un .env y agregue los siguientes valores de configuración de conexión de base de datos:

DATABASE_HOST="db"
DATABASE_PORT=5432
DATABASE_USER="testUser"
DATABASE_PASSWORD="mypassword123"

Por último, continúe y cree el módulo de base de datos.

nest g module database

Ahora, después de que se haya creado el módulo, abra el base de datos/base de datos.module.ts archivo e incluya el siguiente código de configuración de la base de datos:

import { Module } from'@nestjs/common';
import { TypeOrmModule } from'@nestjs/typeorm';
import { ConfigModule, ConfigService } from'@nestjs/config';

@Module({
imports: [
ConfigModule.forRoot(),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
type: 'postgres',
host: configService.get<string>('DATABASE_HOST'),
port: configService.get<number>('DATABASE_PORT'),
username: configService.get<string>('DATABASE_USER'),
password: configService.get<string>('DATABASE_PASSWORD'),
synchronize: true,
}),
inject: [ConfigService],
}),
],
})

exportclass DatabaseModule {}

Una vez que haya configurado la imagen de Docker PostgreSQL usando esta configuración TypeORM, la aplicación Nest.js establecerá una conexión con la base de datos.

Actualice el archivo app.module.ts

Por último, actualice el archivo del módulo de aplicación principal para incorporar la configuración del módulo de base de datos.

import { Module } from'@nestjs/common';
import { ConfigModule } from'@nestjs/config';
import { AppController } from'./app.controller';
import { AppService } from'./app.service';
import { DatabaseModule } from'./database/database.module';

@Module({
imports: [
ConfigModule.forRoot({
envFilePath: '.env',
}),
DatabaseModule,
],
controllers: [AppController],
providers: [AppService],
})

exportclass AppModule {}

Configurar un archivo Docker

Un Dockerfile captura el conjunto de instrucciones que necesita el motor Docker para crear una imagen de Docker. Esta imagen abarca el código fuente de la aplicación y todas sus dependencias.

En el directorio raíz de su proyecto, cree un nuevo archivo y asígnele el nombre Dockerfile. Luego, agregue el siguiente contenido:

FROM node:16.3.0-alpine3.13
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY. .
RUN npm run build
CMD [ "npm", "run", "start: dev" ]

Esto es lo que representa cada comando:

  1. DE: Esta instrucción especifica la imagen base que Docker debe usar para crear la imagen de la aplicación.
  2. DIRTRABAJO: Este comando le indica a Docker que configure el /app directorio como directorio de trabajo para la aplicación dentro del contenedor.
  3. COPIARpaquete*.json./: copia todos los archivos con ese formato de nombre de archivo desde el directorio actual de la aplicación al aplicación carpeta.
  4. EJECUTAR instalación npm: este comando instalará los paquetes y las dependencias requeridas por la aplicación dentro del contenedor Docker.
  5. COPIAR. .: Le indica a Docker que copie todos los archivos de código fuente de la aplicación desde el directorio actual al /app carpeta.
  6. EJECUTAR npm ejecutar compilación: el comando crea la aplicación Nest.js antes de crear la imagen de Docker. Compila el código TypeScript en JavaScript y almacena el resultado del proceso de compilación en un dist. directorio.
  7. CMD: Define el comando que se ejecutará cuando se inicie el contenedor. En este caso, ejecutaremos el Inicio de ejecución de npm: dev comando, que iniciará el servidor en modo de desarrollo.

Esta configuración permite que la aplicación supervise activamente los cambios de código. Una vez que se detecten cambios, el contenedor se reconstruirá automáticamente.

Cree el archivo de redacción de Docker

En el directorio raíz de la carpeta de su proyecto, cree un nuevo docker-compose.yml archivo y agregue el siguiente contenido:

version:'3.9'

services:
server:
build:.
ports:
-'3000:3000'
depends_on:
-db
db:
image:'postgres'
ports:
-'5432:5432'
environment:
POSTGRES_PASSWORD:'mypassword123'
POSTGRES_USER:'testUser'
volumes:
-data:/var/lib/postgresql/data

volumes:
data:

Docker Compose utilizará estas instrucciones para crear y ejecutar las dos imágenes en dos contenedores Docker. El primer contenedor, el servidor, alojará la imagen de la aplicación; ejecutándose en el puerto 3000.

El segundo contenedor alojará la imagen de la base de datos PostgreSQL. No es necesario especificar un Dockerfile para esta imagen: Docker utilizará la imagen de PostgreSQL preexistente en el registro de imágenes de Docker para crearla.

Inicie los contenedores Docker

Finalmente, proceda a construir las imágenes e iniciar los contenedores ejecutando el siguiente comando:

docker compose up

Una vez que el proceso se complete con éxito, debería ver información de registro similar en su terminal.

Ahora, con su servidor web y sus contenedores de bases de datos en funcionamiento, continúe y agregue más funciones a su aplicación Nest.js. Por ejemplo, puedes crear una API CRUD REST de Nest.js.

Enviar imágenes de Docker a Docker Hub

Enviar imágenes de Docker a Docker Hub es casi similar a enviar proyectos a GitHub. Siga estos pasos para enviar la imagen de Docker de la aplicación Nest.js a Docker Hub.

  1. Dirigirse a Centro acoplable, regístrese e inicie sesión en la página de descripción general de su cuenta.
  2. Haga clic en el Crear repositorio , complete el nombre de su repositorio, especifique su visibilidad seleccionando Público o Privadoy luego haga clic en Crear.
  3. Ahora, debe iniciar sesión en su cuenta a través de la terminal ejecutando el siguiente comando y luego proporcionar su nombre de usuario y contraseña de Docker.
    docker login
  4. A continuación, actualice el nombre de la imagen de Docker para que coincida con este formato: / ejecutando el siguiente comando.
    docker tag /
  5. Por último, presione la imagen de Docker.
    docker push /

Utilizando la tecnología de contenedorización de Docker en el desarrollo

La tecnología de contenedorización de Docker le permite agrupar una aplicación junto con todas sus dependencias en imágenes de Docker. Luego, estas imágenes pueden ejecutarse sin problemas dentro de contenedores en diferentes entornos de desarrollo y producción sin ningún problema.