Utilisez Docker et Docker Compose pour déployer et exécuter de manière transparente vos applications Nest.js.
"Mais ça marche sur mon ordinateur..." La blague du développeur met parfaitement en évidence le défi du déploiement et de l'exécution d'applications sur différents systèmes.
Le vrai problème réside dans la configuration des dépendances requises et dans la garantie que les versions du logiciel sont compatibles avec votre application. Une excellente solution de contournement à ce problème consiste à utiliser une technologie de conteneurisation telle que Docker.
Il vous permet de déployer et d'exécuter sans effort des applications (avec toutes les dépendances nécessaires) au sein de l'image du conteneur; éliminant le besoin d’une configuration étendue dans les systèmes de production.
Comprendre Docker et Docker Compose
Docker est une plate-forme de développement open source qui fournit une technologie de conteneurisation utilisée pour créer et empaqueter des applications ainsi que leurs dépendances sous forme d'images portables.
Ces images sont ensuite exécutées en tant que composants exécutables dans des environnements de conteneurs isolés. L'exécution d'applications dans ces conteneurs garantit des performances d'application cohérentes sur différents systèmes de production sans aucun problème de compatibilité.
D'autre part, Docker Compose est un outil qui est utilisé avec Docker pour simplifier le processus de définition et de gestion des applications multi-conteneurs.
Alors que Docker est principalement utilisé pour gérer des conteneurs individuels, Docker Compose vous permet de gérer la configuration de plusieurs conteneurs qui doivent s'exécuter comme une seule application.
Ceci est particulièrement utile lorsqu'une application est composée de plusieurs services qui doivent fonctionner ensemble, tels que plusieurs services API dépendants et bases de données, entre autres.
Avant de plonger dans le code, vous devez installer Bureau Docker sur votre machine locale. Parcourez la configuration requise spécifique au système et les étapes d'installation de la documentation officielle.
Vous pouvez trouver le code de cette application dans son GitHub dépôt.
Configurer un projet Nest.js
Ce guide vous guidera tout au long du processus de création de deux conteneurs Docker qui fonctionnent de manière transparente comme une seule application Nest.js. Le premier conteneur contiendra une instance de l'image Docker du serveur Web Nest.js, tandis que le deuxième conteneur exécutera l'image de la base de données PostgreSQL de Docker.
Pour commencer, installez l'outil de ligne de commande Nest.js :
npm i -g @nestjs/cli
Maintenant, créez un nouveau projet Nest.js en exécutant la commande ci-dessous dans votre terminal.
nest new docker-nest-app
Ensuite, l'outil CLI affichera plusieurs gestionnaires de packages parmi lesquels vous pourrez choisir pour créer le projet. Choisissez votre option préférée. Dans ce cas, nous utiliserons npm, le gestionnaire de packages de nœuds.
Enfin, vous pouvez accéder au répertoire du projet et lancer le serveur de développement.
cd docker-nest-app
npm run start
Créer le module de base de données
Tout d'abord, installez ces dépendances :
npm install pg typeorm @nestjs/typeorm @nestjs/config
Ensuite, dans le répertoire racine de votre projet, créez un .env et ajoutez les valeurs de configuration de connexion à la base de données suivantes :
DATABASE_HOST="db"
DATABASE_PORT=5432
DATABASE_USER="testUser"
DATABASE_PASSWORD="mypassword123"
Enfin, allez-y et créez le module de base de données.
nest g module database
Maintenant, une fois le module créé, ouvrez le base de données/base de données.module.ts et incluez le code de configuration de base de données suivant :
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 {}
Une fois que vous avez configuré l'image Docker PostgreSQL à l'aide de cette configuration TypeORM, l'application Nest.js établira une connexion à la base de données.
Mettre à jour le fichier app.module.ts
Enfin, mettez à jour le fichier principal du module d'application pour incorporer la configuration du module de base de données.
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 {}
Configurer un fichier Docker
Un Dockerfile capture l'ensemble d'instructions requis par le moteur Docker pour créer une image Docker. Cette image englobe le code source de l'application et toutes ses dépendances.
Dans le répertoire racine de votre projet, créez un nouveau fichier et nommez-le Dockerfile. Ensuite, ajoutez le contenu suivant :
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" ]
Voici ce que représente chaque commande :
- DEPUIS: Cette instruction spécifie l'image de base que Docker doit utiliser pour créer l'image de l'application.
- RÉPERT TRAVAIL: Cette commande demande à Docker de définir le /app répertoire comme répertoire de travail de l'application dans le conteneur.
- COPIEpaquet*.json./: copie tous les fichiers avec ce format de nom de fichier du répertoire actuel de l'application vers le application dossier.
- EXÉCUTER l'installation de npm: Cette commande installera les packages et dépendances requis par l'application dans le conteneur Docker.
- COPIE. .: demande à Docker de copier tous les fichiers de code source de l'application du répertoire actuel vers le /app dossier.
- RUN npm exécuter la construction: La commande génère l'application Nest.js avant de créer l'image Docker. Il compile le code TypeScript en JavaScript et stocke la sortie du processus de construction dans un fichier dist annuaire.
- CMD: Définit la commande à exécuter au démarrage du conteneur. Dans ce cas, nous exécuterons le npm run start: dev commande, qui démarrera le serveur en mode développement.
Cette configuration permet à l'application de surveiller activement les modifications du code. Une fois les changements détectés, le conteneur sera automatiquement reconstruit.
Créer le fichier de composition Docker
Dans le répertoire racine de votre dossier de projet, créez un nouveau docker-compose.yml fichier et ajoutez le contenu suivant :
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 utilisera ces instructions pour créer et exécuter les deux images dans deux conteneurs Docker. Le premier conteneur, le serveur, hébergera l'image de l'application; fonctionnant sur le port 3000.
Le deuxième conteneur hébergera l'image de la base de données PostgreSQL. Vous n'avez pas besoin de spécifier un fichier Docker pour cette image: Docker utilisera l'image PostgreSQL préexistante sur le registre d'images de Docker pour la créer.
Démarrez les conteneurs Docker
Enfin, procédez à la création des images et démarrez les conteneurs en exécutant la commande suivante :
docker compose up
Une fois le processus terminé avec succès, vous devriez voir des informations de journal similaires sur votre terminal.
Maintenant que votre serveur Web et vos conteneurs de base de données sont opérationnels, continuez et ajoutez plus de fonctionnalités à votre application Nest.js. Par exemple, vous pouvez créer une API Nest.js CRUD REST.
Transférer des images Docker vers Docker Hub
Transférer des images Docker vers Docker Hub est presque similaire à transférer des projets vers GitHub. Suivez ces étapes pour transférer l'image Docker de l'application Nest.js vers Docker Hub.
- Rendez-vous sur Centre Docker, inscrivez-vous et connectez-vous à la page de présentation de votre compte.
- Clique le Créer un référentiel bouton, renseignez le nom de votre référentiel, précisez sa visibilité en sélectionnant soit Publique ou Privé, puis cliquez sur Créer.
- Maintenant, vous devez vous connecter à votre compte via le terminal en exécutant la commande ci-dessous, puis fournir votre nom d'utilisateur et votre mot de passe Docker.
docker login
- Ensuite, mettez à jour le nom de l'image du Docker pour qu'il corresponde à ce format:
/ en exécutant la commande ci-dessous.docker tag
/ - Enfin, poussez l'image Docker.
docker push
/
Utilisation de la technologie de conteneurisation de Docker dans le développement
La technologie de conteneurisation de Docker vous permet de regrouper une application avec toutes ses dépendances dans des images Docker. Ces images peuvent ensuite fonctionner sans problème dans des conteneurs dans différents environnements de développement et de production.