Gør brug af Docker og Docker Compose til problemfrit at implementere og køre dine Nest.js-applikationer.
"Men det virker på min computer..." udvikler joke fremhæver perfekt udfordringen med at implementere og køre applikationer på tværs af forskellige systemer.
Det virkelige besvær ligger i at konfigurere de nødvendige afhængigheder og sikre, at softwareversionerne er kompatible med din applikation. En fantastisk løsning på dette problem involverer brug af containeriseringsteknologi såsom Docker.
Det giver dig mulighed for ubesværet at implementere og køre applikationer – med alle nødvendige afhængigheder – i containerbilledet; eliminerer behovet for omfattende konfiguration i produktionssystemer.
Forstå Docker og Docker Compose
Docker er en open source-udviklingsplatform, der leverer containeriseringsteknologi, der bruges til at bygge og pakke applikationer sammen med deres afhængigheder som bærbare billeder.
Disse billeder køres derefter som eksekverbare komponenter i isolerede containermiljøer. Kørsel af applikationer i disse beholdere garanterer ensartet applikationsydelse på tværs af forskellige produktionssystemer uden kompatibilitetsproblemer.
På den anden side, Docker Compose er et værktøj der bruges sammen med Docker til at forenkle processen med at definere og administrere multi-container-applikationer.
Mens Docker primært bruges til at administrere individuelle containere, giver Docker Compose dig mulighed for at administrere konfigurationen af flere containere, der skal køre som en enkelt applikation.
Dette er især nyttigt, når en applikation består af flere tjenester, der skal arbejde sammen, såsom flere afhængige API-tjenester og databaser, blandt andre.
Før du dykker ned i koden, skal du installere Docker Desktop på din lokale maskine. Gennemgå de systemspecifikke krav og installationstrin fra den officielle dokumentation.
Du kan finde denne applikations kode i dens GitHub depot.
Konfigurer et Nest.js-projekt
Denne guide vil lede dig gennem processen med at oprette to Docker-containere, der problemfrit fungerer som en enkelt Nest.js-applikation. Den første container vil indeholde en forekomst af Nest.js-webserverens Docker-billede, mens den anden container vil udføre Dockers PostgreSQL-databasebillede.
For at komme i gang skal du installere kommandolinjeværktøjet Nest.js:
npm i -g @nestjs/cli
Opret nu et nyt Nest.js-projekt ved at køre kommandoen nedenfor i din terminal.
nest new docker-nest-app
Dernæst vil CLI-værktøjet vise flere pakkeadministratorer, som du kan vælge imellem for at oprette projektet. Vælg din foretrukne mulighed. I dette tilfælde vil vi bruge npm, Node Package Manager.
Til sidst kan du navigere til projektbiblioteket og skrue udviklingsserveren op.
cd docker-nest-app
npm run start
Opret databasemodulet
Først skal du installere disse afhængigheder:
npm install pg typeorm @nestjs/typeorm @nestjs/config
Dernæst skal du i dit projekts rodmappe oprette en .env fil, og tilføj følgende databaseforbindelseskonfigurationsværdier:
DATABASE_HOST="db"
DATABASE_PORT=5432
DATABASE_USER="testUser"
DATABASE_PASSWORD="mypassword123"
Til sidst skal du gå videre og oprette databasemodulet.
nest g module database
Nu, efter at modulet er blevet oprettet, skal du åbne database/database.modul.ts fil og inkludere følgende databasekonfigurationskode:
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 {}
Når du har konfigureret Docker PostgreSQL-billedet ved hjælp af denne TypeORM-konfiguration, etablerer Nest.js-applikationen en forbindelse til databasen.
Opdater app.module.ts-filen
Til sidst skal du opdatere hovedapplikationsmodulfilen for at inkorporere konfigurationen for databasemodulet.
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 {}
Konfigurer en Dockerfile
En Dockerfile fanger det nødvendige sæt instruktioner, som Docker-motoren skal bruge for at skabe et Docker-billede. Dette billede omfatter applikationens kildekode og alle dens afhængigheder.
I dit projekts rodmappen skal du oprette en ny fil og navngive den, Dockerfile. Tilføj derefter følgende indhold:
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" ]
Her er hvad hver kommando repræsenterer:
- FRA: Denne instruktion specificerer det basisbillede, som Docker skal bruge til at bygge programmets image.
- WORKDIR: Denne kommando instruerer Docker om at indstille /app mappe som arbejdsmappe for appen i containeren.
- KOPIpakke*.json./: Kopierer alle filer med det filnavnsformat fra den aktuelle mappe i programmet til app folder.
- KØR npm installation: Denne kommando vil installere de nødvendige pakker og afhængigheder, der kræves af applikationen i Docker-beholderen.
- KOPI. .: Instruerer Docker til at kopiere alle applikationens kildekodefiler fra den aktuelle mappe til /app folder.
- KØR npm kør build: Kommandoen bygger Nest.js-applikationen, før du opretter Docker-billedet. Den kompilerer TypeScript-koden til JavaScript og gemmer byggeprocesoutputtet i en dist vejviser.
- CMD: Definerer kommandoen, der skal køres, når containeren starter. I dette tilfælde kører vi npm run start: dev kommando, som starter serveren i udviklingstilstand.
Denne konfiguration gør det muligt for applikationen aktivt at overvåge kodeændringer. Når ændringer er opdaget, vil beholderen automatisk gennemgå en genopbygning.
Opret Docker Compose-filen
I rodmappen i din projektmappe skal du oprette en ny docker-compose.yml fil, og tilføj følgende indhold:
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 vil bruge disse instruktioner til at bygge og køre de to billeder i to Docker-containere. Den første container, serveren, vil være vært for programmets image; kører på port 3000.
Den anden container vil være vært for PostgreSQL-databasebilledet. Du behøver ikke at angive en Dockerfil for dette billede – Docker vil bruge det allerede eksisterende PostgreSQL-billede på Dockers billedregistrering til at bygge det.
Start Docker Containers
Til sidst skal du fortsætte med at bygge billederne og starte containerne ved at køre følgende kommando:
docker compose up
Når processen er gennemført, bør du se lignende logoplysninger på din terminal.
Nu, med både din webserver og databasebeholdere oppe at køre, skal du gå videre og tilføje mere funktionalitet til din Nest.js-applikation. For eksempel kan du byg en Nest.js CRUD REST API.
Pusher Docker-billeder til Docker Hub
At skubbe Docker-billeder til Docker Hub svarer næsten til at skubbe projekter til GitHub. Følg disse trin for at skubbe Nest.js-applikationens Docker-billede til Docker Hub.
- Gå over til Docker Hub, tilmeld dig og log ind på din kontos oversigtsside.
- Klik på Opret lager knappen, udfyld navnet på dit lager, angiv dets synlighed ved at vælge enten Offentlig eller Privat, og klik derefter skab.
- Nu skal du logge ind på din konto via terminalen ved at køre kommandoen nedenfor, og derefter angive dit Docker-brugernavn og adgangskode.
docker login
- Opdater derefter Dockers billednavn for at matche dette format:
/ ved at køre kommandoen nedenfor.docker tag
/ - Til sidst skal du trykke på Docker-billedet.
docker push
/
Bruger Dockers containeriseringsteknologi under udvikling
Dockers containeriseringsteknologi giver dig mulighed for at samle en applikation sammen med alle dens afhængigheder i Docker-billeder. Disse billeder kan derefter køre problemfrit i containere i forskellige udviklings- og produktionsmiljøer uden problemer.