Benytt deg av Docker og Docker Compose for sømløst å distribuere og kjøre Nest.js-appene dine.
"Men det fungerer på datamaskinen min..." Utviklerspøk fremhever perfekt utfordringen med å distribuere og kjøre applikasjoner på tvers av forskjellige systemer.
Det virkelige problemet ligger i å konfigurere de nødvendige avhengighetene og sikre at programvareversjonene er kompatible med applikasjonen din. En god løsning på dette problemet innebærer bruk av containeriseringsteknologi som Docker.
Den lar deg enkelt distribuere og kjøre applikasjoner – med alle nødvendige avhengigheter – innenfor beholderbildet; eliminerer behovet for omfattende konfigurasjon i produksjonssystemer.
Forstå Docker og Docker Compose
Docker er en åpen kildekode-utviklingsplattform som tilbyr containeriseringsteknologi som brukes til å bygge og pakke applikasjoner sammen med deres avhengigheter som bærbare bilder.
Disse bildene kjøres deretter som kjørbare komponenter i isolerte containermiljøer. Å kjøre applikasjoner i disse beholderne garanterer konsistent applikasjonsytelse på tvers av forskjellige produksjonssystemer uten kompatibilitetsproblemer.
På den andre siden, Docker Compose er et verktøy som brukes sammen med Docker for å forenkle prosessen med å definere og administrere multi-container-applikasjoner.
Mens Docker primært brukes til å administrere individuelle containere, lar Docker Compose deg administrere konfigurasjonen av flere containere som må kjøres som en enkelt applikasjon.
Dette er spesielt nyttig når en applikasjon består av flere tjenester som må fungere sammen, for eksempel flere avhengige API-tjenester og databaser, blant andre.
Før du dykker inn i koden, må du installere Docker Desktop på din lokale maskin. Gå gjennom de systemspesifikke kravene og installasjonstrinnene fra den offisielle dokumentasjonen.
Du finner denne applikasjonens kode i dens GitHub oppbevaringssted.
Konfigurer et Nest.js-prosjekt
Denne guiden vil lede deg gjennom prosessen med å spinne opp to Docker-beholdere som sømløst fungerer som en enkelt Nest.js-applikasjon. Den første beholderen vil inneholde en forekomst av Nest.js-nettserverens Docker-bilde, mens den andre beholderen vil kjøre Dockers PostgreSQL-databasebilde.
For å komme i gang, installer kommandolinjeverktøyet Nest.js:
npm i -g @nestjs/cli
Opprett nå et nytt Nest.js-prosjekt ved å kjøre kommandoen nedenfor i terminalen din.
nest new docker-nest-app
Deretter vil CLI-verktøyet vise flere pakkeadministratorer som du kan velge mellom for å opprette prosjektet. Velg ditt foretrukne alternativ. I dette tilfellet bruker vi npm, Node Package Manager.
Til slutt kan du navigere til prosjektkatalogen og spinne opp utviklingsserveren.
cd docker-nest-app
npm run start
Opprett databasemodulen
Installer først disse avhengighetene:
npm install pg typeorm @nestjs/typeorm @nestjs/config
Deretter oppretter du en i prosjektets rotkatalog .env fil, og legg til følgende konfigurasjonsverdier for databasetilkobling:
DATABASE_HOST="db"
DATABASE_PORT=5432
DATABASE_USER="testUser"
DATABASE_PASSWORD="mypassword123"
Til slutt, fortsett og lag databasemodulen.
nest g module database
Nå, etter at modulen er opprettet, åpner du database/database.modul.ts fil og inkludere følgende databasekonfigurasjonskode:
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 satt opp Docker PostgreSQL-bildet ved hjelp av denne TypeORM-konfigurasjonen, vil Nest.js-applikasjonen etablere en tilkobling til databasen.
Oppdater app.module.ts-filen
Til slutt oppdaterer du hovedapplikasjonsmodulfilen for å inkludere konfigurasjonen for databasemodulen.
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 {}
Sett opp en dockerfile
En Dockerfil fanger opp det nødvendige settet med instruksjoner som kreves av Docker-motoren for å lage et Docker-bilde. Dette bildet omfatter applikasjonens kildekode og alle dens avhengigheter.
I rotkatalogen til prosjektet ditt, lag en ny fil og navngi den, Dockerfile. Deretter legger du til følgende innhold:
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 hva hver kommando representerer:
- FRA: Denne instruksjonen spesifiserer basisbildet som Docker skal bruke for å bygge programmets bilde.
- WORKDIR: Denne kommandoen instruerer Docker å angi /app katalogen som arbeidskatalogen for appen i beholderen.
- KOPIEREpakke*.json./: Kopierer alle filer med det filnavnformatet fra gjeldende katalog i programmet til app mappe.
- KJØR npm installasjon: Denne kommandoen vil installere de nødvendige pakkene og avhengighetene som kreves av applikasjonen i Docker-beholderen.
- KOPIERE. .: Instruerer Docker å kopiere alle programmets kildekodefiler fra gjeldende katalog til /app mappe.
- KJØR npm kjøre build: Kommandoen bygger Nest.js-applikasjonen før du oppretter Docker-bildet. Den kompilerer TypeScript-koden til JavaScript og lagrer byggeprosessen i en dist katalog.
- CMD: Definerer kommandoen som skal kjøres når beholderen starter. I dette tilfellet kjører vi npm kjørestart: dev kommando, som vil starte serveren i utviklingsmodus.
Denne konfigurasjonen gjør det mulig for applikasjonen å aktivt overvåke kodeendringer. Når endringer er oppdaget, vil beholderen automatisk gjenoppbygges.
Opprett Docker Compose-filen
Opprett en ny i rotkatalogen til prosjektmappen din docker-compose.yml fil, og legg til følgende innhold:
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 bruke disse instruksjonene til å bygge og kjøre de to bildene i to Docker-beholdere. Den første beholderen, serveren, vil være vert for programmets bilde; kjører på port 3000.
Den andre beholderen vil være vert for PostgreSQL-databasebildet. Du trenger ikke spesifisere en Dockerfil for dette bildet – Docker vil bruke det eksisterende PostgreSQL-bildet på Dockers bilderegister for å bygge det.
Start Docker Containers
Til slutt, fortsett å bygge bildene og start beholderne ved å kjøre følgende kommando:
docker compose up
Når prosessen er fullført, bør du se lignende logginformasjon på terminalen din.
Nå, med både nettserveren og databasebeholderne i gang, kan du legge til mer funksjonalitet til Nest.js-applikasjonen din. For eksempel kan du bygge et Nest.js CRUD REST API.
Skyver Docker-bilder til Docker Hub
Å skyve Docker-bilder til Docker Hub er nesten likt å skyve prosjekter til GitHub. Følg disse trinnene for å sende Nest.js-applikasjonen Docker-bilde til Docker Hub.
- Gå over til Docker Hub, registrer deg og logg på kontooversiktssiden.
- Klikk på Opprett depot -knappen, fyll inn navnet på depotet ditt, spesifiser dets synlighet ved å velge enten Offentlig eller Privat, og klikk deretter Skape.
- Nå må du logge på kontoen din via terminalen ved å kjøre kommandoen nedenfor, og deretter oppgi Docker-brukernavn og passord.
docker login
- Deretter oppdaterer du Dockers bildenavn for å matche dette formatet:
/ ved å kjøre kommandoen nedenfor.docker tag
/ - Til slutt, trykk på Docker-bildet.
docker push
/
Bruker Dockers containeriseringsteknologi under utvikling
Dockers containeriseringsteknologi lar deg samle en applikasjon sammen med alle dens avhengigheter i Docker-bilder. Disse bildene kan deretter kjøre jevnt i containere i forskjellige utviklings- og produksjonsmiljøer uten problemer.