Uporabite Docker in Docker Compose za brezhibno uvajanje in izvajanje aplikacij Nest.js.

"Ampak deluje na mojem računalniku ..." šala razvijalca odlično poudarja izziv uvajanja in izvajanja aplikacij v različnih sistemih.

Prava težava je pri konfiguriranju zahtevanih odvisnosti in zagotavljanju, da so različice programske opreme združljive z vašo aplikacijo. Odlična rešitev te težave vključuje uporabo tehnologije posodabljanja, kot je Docker.

Omogoča vam enostavno uvajanje in izvajanje aplikacij – z vsemi potrebnimi odvisnostmi – znotraj slike vsebnika; odpravlja potrebo po obsežni konfiguraciji proizvodnih sistemov.

Razumevanje Dockerja in Docker Compose

Docker je odprtokodna razvojna platforma, ki ponuja tehnologijo kontejnerizacije, ki se uporablja pri gradnji in pakiranju aplikacij poleg njihovih odvisnosti kot prenosne slike.

Te slike se nato izvajajo kot izvršljive komponente znotraj izoliranih vsebniških okolij. Izvajanje aplikacij v teh vsebnikih zagotavlja dosledno delovanje aplikacij v različnih proizvodnih sistemih brez težav z združljivostjo.

Po drugi strani, Docker Compose je orodje ki se uporablja skupaj z Dockerjem za poenostavitev postopka definiranja in upravljanja aplikacij z več vsebniki.

Medtem ko se Docker uporablja predvsem za upravljanje posameznih vsebnikov, Docker Compose omogoča upravljanje konfiguracije več vsebnikov, ki se morajo izvajati kot ena aplikacija.

To je še posebej uporabno, če je aplikacija sestavljena iz več storitev, ki morajo delovati skupaj, kot je med drugim več odvisnih storitev API in baz podatkov.

Preden se poglobite v kodo, jo morate namestiti Namizje Docker na vašem lokalnem računalniku. Preglejte sistemske zahteve in korake namestitve iz uradne dokumentacije.

Kodo te aplikacije najdete v GitHub repozitorij.

Nastavite projekt Nest.js

Ta vodnik vas bo vodil skozi postopek vrtenja dveh vsebnikov Docker, ki brezhibno delujeta kot ena sama aplikacija Nest.js. Prvi vsebnik bo vseboval primerek slike Docker spletnega strežnika Nest.js, medtem ko bo drugi vsebnik izvajal Dockerjevo sliko baze podatkov PostgreSQL.

Za začetek namestite orodje ukazne vrstice Nest.js:

npm i -g @nestjs/cli

Zdaj ustvarite nov projekt Nest.js tako, da v terminalu zaženete spodnji ukaz.

nest new docker-nest-app

Nato bo orodje CLI prikazalo več upraviteljev paketov, med katerimi lahko izbirate, da ustvarite projekt. Izberite želeno možnost. V tem primeru bomo uporabili npm, upravitelj paketov vozlišč.

Nazadnje se lahko pomaknete do imenika projekta in zavrtite razvojni strežnik.

cd docker-nest-app
npm run start

Ustvarite modul baze podatkov

Najprej namestite te odvisnosti:

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

Nato v korenskem imeniku projekta ustvarite a .env in dodajte naslednje konfiguracijske vrednosti povezave z bazo podatkov:

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

Nazadnje, nadaljujte in ustvarite modul baze podatkov.

nest g module database

Zdaj, ko je bil modul ustvarjen, odprite baza podatkov/baza podatkov.modul.ts in vključite naslednjo konfiguracijsko kodo baze podatkov:

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

Ko nastavite sliko Docker PostgreSQL s to konfiguracijo TypeORM, bo aplikacija Nest.js vzpostavila povezavo z bazo podatkov.

Posodobite datoteko app.module.ts

Na koncu posodobite datoteko modula glavne aplikacije, da bo vključevala konfiguracijo za modul baze podatkov.

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

Nastavite datoteko Docker

Datoteka Docker zajame zahtevani nabor navodil, ki jih motor Docker potrebuje za ustvarjanje slike Docker. Ta slika zajema izvorno kodo aplikacije in vse njene odvisnosti.

V korenskem imeniku vašega projekta ustvarite novo datoteko in jo poimenujte Dockerfile. Nato dodajte naslednjo vsebino:

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

Tukaj je, kaj vsak ukaz predstavlja:

  1. OD: To navodilo določa osnovno sliko, ki naj jo Docker uporabi za izdelavo slike aplikacije.
  2. DELOVNI DIR: Ta ukaz naroči Dockerju, naj nastavi /app kot delovni imenik za aplikacijo v vsebniku.
  3. KOPIRATIpaket*.json./: Kopira vse datoteke s to obliko imena datoteke iz trenutnega imenika v aplikaciji v aplikacija mapo.
  4. ZAGENI namestitev npm: Ta ukaz bo namestil zahtevane pakete in odvisnosti, ki jih zahteva aplikacija znotraj vsebnika Docker.
  5. KOPIRATI. .: Dockerju naroči, naj kopira vse datoteke izvorne kode aplikacije iz trenutnega imenika v /app mapo.
  6. RUN npm zaženi gradnjo: Ukaz zgradi aplikacijo Nest.js, preden ustvari sliko Docker. Prevede kodo TypeScript v JavaScript in shrani izhod postopka gradnje v a dist imenik.
  7. CMD: definira ukaz, ki se zažene ob zagonu vsebnika. V tem primeru bomo zagnali npm run start: dev ukaz, ki bo zagnal strežnik v razvojnem načinu.

Ta konfiguracija omogoča aplikaciji, da aktivno spremlja spremembe kode. Ko so zaznane spremembe, bo vsebnik samodejno obnovljen.

Ustvarite datoteko Docker Compose

V korenskem imeniku mape projekta ustvarite novo docker-compose.yml datoteko in dodajte naslednjo vsebino:

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 bo uporabil ta navodila za izdelavo in zagon dveh slik v dveh vsebnikih Docker. Prvi vsebnik, strežnik, bo gostil sliko aplikacije; deluje na vratih 3000.

Drugi vsebnik bo gostil sliko baze podatkov PostgreSQL. Za to sliko vam ni treba določiti Dockerfile—Docker bo za izdelavo uporabil že obstoječo sliko PostgreSQL v Dockerjevem registru slik.

Zaženite vsebnike Docker

Nazadnje nadaljujte z izdelavo slik in zaženite vsebnike z izvajanjem naslednjega ukaza:

docker compose up

Ko je postopek uspešno zaključen, bi morali videti podobne podatke dnevnika na vašem terminalu.

Zdaj, ko sta vaš spletni strežnik in vsebniki baze podatkov pripravljena in delujeta, nadaljujte in dodajte več funkcij svoji aplikaciji Nest.js. Na primer, lahko zgradite API Nest.js CRUD REST.

Potiskanje Dockerjevih slik v Docker Hub

Potiskanje Dockerjevih slik v Docker Hub je skoraj podobno potiskanju projektov v GitHub. Sledite tem korakom, da potisnete sliko Docker aplikacije Nest.js v Docker Hub.

  1. Pojdite na Docker Hub, se prijavite in prijavite na stran s pregledom svojega računa.
  2. Kliknite na Ustvari repozitorij gumb, vnesite ime svojega skladišča, določite njegovo vidnost tako, da izberete bodisi Javno oz Zasebnoin nato kliknite Ustvari.
  3. Zdaj se morate prijaviti v svoj račun prek terminala, tako da zaženete spodnji ukaz, nato pa vnesite svoje uporabniško ime in geslo za Docker.
    docker login
  4. Nato posodobite ime Dockerjeve slike, da bo ustrezalo tej obliki: / tako, da zaženete spodnji ukaz.
    docker tag /
  5. Na koncu potisnite sliko Dockerja.
    docker push /

Uporaba Dockerjeve tehnologije kontejnerizacije v razvoju

Dockerjeva tehnologija kontejnerizacije vam omogoča, da združite aplikacijo skupaj z vsemi njenimi odvisnostmi v slike Docker. Te slike lahko nato nemoteno tečejo znotraj vsebnikov v različnih razvojnih in produkcijskih okoljih brez težav.