Utilizza Docker e Docker Compose per distribuire ed eseguire senza problemi le tue applicazioni Nest.js.

"Ma funziona sul mio computer..." la battuta degli sviluppatori evidenzia perfettamente la sfida di distribuire ed eseguire applicazioni su sistemi diversi.

La vera seccatura sta nel configurare le dipendenze richieste e garantire che le versioni del software siano compatibili con la tua applicazione. Un'ottima soluzione alternativa a questo problema prevede l'utilizzo di una tecnologia di containerizzazione come Docker.

Ti consente di distribuire ed eseguire facilmente le applicazioni, con tutte le dipendenze necessarie, all'interno dell'immagine del contenitore; eliminando la necessità di una configurazione estesa nei sistemi di produzione.

Comprendere Docker e Docker Compose

Docker è una piattaforma di sviluppo open source che fornisce la tecnologia di containerizzazione utilizzata nella creazione e nel confezionamento di applicazioni insieme alle loro dipendenze come immagini portatili.

instagram viewer

Queste immagini vengono quindi eseguite come componenti eseguibili all'interno di ambienti contenitori isolati. L'esecuzione delle applicazioni all'interno di questi contenitori garantisce prestazioni applicative coerenti tra diversi sistemi di produzione senza problemi di compatibilità.

D'altra parte, Docker Compose è uno strumento che viene utilizzato insieme a Docker per semplificare il processo di definizione e gestione di applicazioni multi-contenitore.

Mentre Docker viene utilizzato principalmente per gestire singoli contenitori, Docker Compose consente di gestire la configurazione di più contenitori che devono essere eseguiti come un'unica applicazione.

Ciò è particolarmente utile quando un'applicazione è composta da più servizi che devono collaborare, ad esempio diversi servizi API dipendenti e database, tra gli altri.

Prima di immergerti nel codice, devi installare Desktop Docker sul tuo computer locale. Segui i requisiti specifici del sistema e i passaggi di installazione dalla documentazione ufficiale.

Puoi trovare il codice di questa applicazione nel file GitHub deposito.

Configura un progetto Nest.js

Questa guida ti guiderà attraverso il processo di creazione di due contenitori Docker che funzionino perfettamente come un'unica applicazione Nest.js. Il primo contenitore conterrà un'istanza dell'immagine Docker del server Web Nest.js, mentre il secondo contenitore eseguirà l'immagine del database PostgreSQL di Docker.

Per iniziare, installa lo strumento da riga di comando Nest.js:

npm i -g @nestjs/cli

Ora crea un nuovo progetto Nest.js eseguendo il comando seguente nel tuo terminale.

nest new docker-nest-app

Successivamente, lo strumento CLI mostrerà diversi gestori di pacchetti tra cui scegliere per creare il progetto. Scegli la tua opzione preferita. In questo caso, useremo npm, il gestore dei pacchetti del nodo.

Infine, puoi accedere alla directory del progetto e avviare il server di sviluppo.

cd docker-nest-app
npm run start

Creare il modulo database

Innanzitutto, installa queste dipendenze:

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

Successivamente, nella directory principale del tuo progetto, crea un file .env file e aggiungere i seguenti valori di configurazione della connessione al database:

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

Infine, vai avanti e crea il modulo database.

nest g module database

Ora, dopo aver creato il modulo, apri il file database/database.module.ts file e includere il seguente codice di configurazione del database:

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 {}

Dopo aver configurato l'immagine Docker PostgreSQL utilizzando questa configurazione TypeORM, l'applicazione Nest.js stabilirà una connessione al database.

Aggiorna il file app.module.ts

Infine, aggiorna il file del modulo dell'applicazione principale per incorporare la configurazione per il modulo del database.

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 {}

Configura un Dockerfile

Un Dockerfile cattura il set di istruzioni necessarie al motore Docker per creare un'immagine Docker. Questa immagine racchiude il codice sorgente dell'applicazione e tutte le sue dipendenze.

Nella directory root del tuo progetto, crea un nuovo file e chiamalo Dockerfile. Quindi, aggiungi i seguenti contenuti:

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" ]

Ecco cosa rappresenta ciascun comando:

  1. DA: questa istruzione specifica l'immagine di base che Docker dovrebbe utilizzare per creare l'immagine dell'applicazione.
  2. DIR.LAVORO: questo comando indica a Docker di impostare il file /app directory come directory di lavoro per l'app all'interno del contenitore.
  3. COPIApacchetto*.json./: copia tutti i file con quel formato di nome file dalla directory corrente nell'applicazione al file app cartella.
  4. ESEGUIRE l'installazione di npm: questo comando installerà i pacchetti e le dipendenze richiesti dall'applicazione all'interno del contenitore Docker.
  5. COPIA. .: indica a Docker di copiare tutti i file del codice sorgente dell'applicazione dalla directory corrente nel file /app cartella.
  6. ESEGUI npm esegui build: il comando crea l'applicazione Nest.js prima di creare l'immagine Docker. Compila il codice TypeScript in JavaScript e memorizza l'output del processo di compilazione in un file dist directory.
  7. CMD: definisce il comando da eseguire all'avvio del contenitore. In questo caso, eseguiremo il file npm avvio esecuzione: dev comando, che avvierà il server in modalità di sviluppo.

Questa configurazione consente all'applicazione di monitorare attivamente le modifiche al codice. Una volta rilevate le modifiche, il contenitore verrà automaticamente sottoposto a ricostruzione.

Crea il file di composizione Docker

Nella directory principale della cartella del progetto, creane una nuova docker-compose.yml file e aggiungi il seguente contenuto:

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 utilizzerà queste istruzioni per creare ed eseguire le due immagini in due contenitori Docker. Il primo contenitore, il server, ospiterà l'immagine dell'applicazione; in esecuzione sulla porta 3000.

Il secondo contenitore ospiterà l'immagine del database PostgreSQL. Non è necessario specificare un Dockerfile per questa immagine: Docker utilizzerà l'immagine PostgreSQL preesistente nel registro delle immagini di Docker per crearla.

Avvia i contenitori Docker

Infine, procedi con la creazione delle immagini e avvia i contenitori eseguendo il seguente comando:

docker compose up

Una volta completato con successo il processo, dovresti vedere informazioni di registro simili sul tuo terminale.

Ora, con il tuo server web e i contenitori del database attivi e funzionanti, vai avanti e aggiungi ulteriori funzionalità alla tua applicazione Nest.js. Ad esempio, puoi creare un'API REST CRUD Nest.js.

Invio delle immagini Docker all'hub Docker

Il push delle immagini Docker su Docker Hub è quasi simile al push dei progetti su GitHub. Segui questi passaggi per inviare l'immagine Docker dell'applicazione Nest.js a Docker Hub.

  1. Vai a Hub Docker, registrati e accedi alla pagina di panoramica del tuo account.
  2. Clicca il Crea archivio pulsante, inserisci il nome del tuo repository, specifica la sua visibilità selezionando uno dei due Pubblico O Privato, quindi fare clic su Creare.
  3. Ora devi accedere al tuo account tramite il terminale eseguendo il comando seguente, quindi fornire nome utente e password Docker.
    docker login
  4. Successivamente, aggiorna il nome dell'immagine del Docker in modo che corrisponda a questo formato: / eseguendo il comando seguente.
    docker tag /
  5. Infine, invia l'immagine Docker.
    docker push /

Utilizzo della tecnologia di containerizzazione di Docker nello sviluppo

La tecnologia di containerizzazione di Docker ti consente di raggruppare un'applicazione insieme a tutte le sue dipendenze in immagini Docker. Queste immagini possono quindi essere eseguite senza problemi all'interno di contenitori in diversi ambienti di sviluppo e produzione senza problemi.