Využite Docker a Docker Compose na bezproblémové nasadenie a spustenie vašich aplikácií Nest.js.
„Ale na mojom počítači to funguje...“ vtip vývojárov dokonale poukazuje na výzvu nasadzovania a spúšťania aplikácií naprieč rôznymi systémami.
Skutočný problém spočíva v konfigurácii požadovaných závislostí a zabezpečení kompatibility verzií softvéru s vašou aplikáciou. Skvelé riešenie tohto problému zahŕňa použitie technológie kontajnerizácie, ako je napríklad Docker.
Umožňuje vám bez námahy nasadzovať a spúšťať aplikácie – so všetkými potrebnými závislosťami – v rámci obrazu kontajnera; eliminuje potrebu rozsiahlej konfigurácie vo výrobných systémoch.
Pochopenie Docker a Docker Compose
Docker je open-source vývojová platforma, ktorá poskytuje technológiu kontajnerizácie používanú pri vytváraní a balení aplikácií spolu s ich závislosťami ako prenosné obrázky.
Tieto obrazy sa potom spúšťajú ako spustiteľné komponenty v izolovaných prostrediach kontajnerov. Spúšťanie aplikácií v týchto kontajneroch zaručuje konzistentný výkon aplikácií naprieč rôznymi produkčnými systémami bez akýchkoľvek problémov s kompatibilitou.
Na druhej strane, Docker Compose je nástroj ktorý sa používa spolu s Dockerom na zjednodušenie procesu definovania a správy multi-kontajnerových aplikácií.
Zatiaľ čo Docker sa primárne používa na správu jednotlivých kontajnerov, Docker Compose vám umožňuje spravovať konfiguráciu viacerých kontajnerov, ktoré musia bežať ako jedna aplikácia.
To je užitočné najmä vtedy, keď aplikácia pozostáva z viacerých služieb, ktoré musia spolupracovať, ako je okrem iného niekoľko závislých služieb API a databáz.
Predtým, ako sa ponoríte do kódu, musíte ho nainštalovať Docker Desktop na vašom lokálnom počítači. Prejdite si systémové požiadavky a kroky inštalácie z oficiálnej dokumentácie.
V ňom nájdete kód tejto aplikácie GitHub Úložisko.
Nastavte projekt Nest.js
Táto príručka vás prevedie procesom vytvorenia dvoch kontajnerov Docker, ktoré bez problémov fungujú ako jedna aplikácia Nest.js. Prvý kontajner bude obsahovať inštanciu obrazu Docker webového servera Nest.js, zatiaľ čo druhý kontajner spustí obraz databázy PostgreSQL Docker.
Ak chcete začať, nainštalujte nástroj príkazového riadka Nest.js:
npm i -g @nestjs/cli
Teraz vytvorte nový projekt Nest.js spustením príkazu nižšie v termináli.
nest new docker-nest-app
Ďalej nástroj CLI zobrazí niekoľko správcov balíkov, z ktorých si môžete vybrať na vytvorenie projektu. Vyberte si preferovanú možnosť. V tomto prípade použijeme npm, správca balíkov uzlov.
Nakoniec môžete prejsť do adresára projektu a spustiť vývojový server.
cd docker-nest-app
npm run start
Vytvorte databázový modul
Najprv nainštalujte tieto závislosti:
npm install pg typeorm @nestjs/typeorm @nestjs/config
Ďalej v koreňovom adresári projektu vytvorte a .env súbor a pridajte nasledujúce konfiguračné hodnoty pripojenia k databáze:
DATABASE_HOST="db"
DATABASE_PORT=5432
DATABASE_USER="testUser"
DATABASE_PASSWORD="mypassword123"
Nakoniec pokračujte a vytvorte databázový modul.
nest g module database
Teraz, po vytvorení modulu, otvorte database/database.module.ts súbor a zahrňte nasledujúci konfiguračný kód databázy:
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 {}
Po nastavení obrazu Docker PostgreSQL pomocou tejto konfigurácie TypeORM aplikácia Nest.js vytvorí pripojenie k databáze.
Aktualizujte súbor app.module.ts
Nakoniec aktualizujte súbor hlavného aplikačného modulu, aby obsahoval konfiguráciu pre databázový modul.
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 {}
Nastavte súbor Dockerfile
Dockerfile zachytáva požadovanú sadu pokynov, ktoré potrebuje Docker engine na vytvorenie obrazu Docker. Tento obrázok obsahuje zdrojový kód aplikácie a všetky jej závislosti.
V koreňovom adresári svojho projektu vytvorte nový súbor a pomenujte ho Dockerfile. Potom pridajte nasledujúci obsah:
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" ]
Tu je to, čo každý príkaz predstavuje:
- OD: Táto inštrukcia špecifikuje základný obraz, ktorý by mal Docker použiť na vytvorenie obrazu aplikácie.
- WORKDIR: Tento príkaz dáva Dockerovi pokyn, aby nastavil /app adresár ako pracovný adresár pre aplikáciu v kontajneri.
- KOPÍROVAŤbalíček*.json./: Skopíruje všetky súbory s týmto formátom názvu súboru z aktuálneho adresára v aplikácii do aplikácie priečinok.
- SPUSTITE inštaláciu npm: Tento príkaz nainštaluje požadované balíky a závislosti požadované aplikáciou v kontajneri Docker.
- KOPÍROVAŤ. .: Inštruuje Docker, aby skopíroval všetky súbory zdrojového kódu aplikácie z aktuálneho adresára do /app priečinok.
- RUN npm spustiť zostavenie: Príkaz vytvorí aplikáciu Nest.js pred vytvorením obrazu Docker. Kompiluje kód TypeScript do JavaScriptu a ukladá výstup procesu zostavenia do a dist adresár.
- CMD: Definuje príkaz, ktorý sa má spustiť pri spustení kontajnera. V tomto prípade spustíme štart chodu npm: dev príkaz, ktorý spustí server vo vývojovom režime.
Táto konfigurácia umožňuje aplikácii aktívne monitorovať zmeny kódu. Po zistení zmien kontajner automaticky prejde prestavbou.
Vytvorte súbor Docker Compose File
V koreňovom adresári priečinka projektu vytvorte nový docker-compose.yml súbor a pridajte nasledujúci obsah:
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 použije tieto pokyny na zostavenie a spustenie dvoch obrázkov v dvoch kontajneroch Docker. Prvý kontajner, server, bude hostiť obrázok aplikácie; beží na porte 3000.
Druhý kontajner bude hostiť obraz databázy PostgreSQL. Pre tento obrázok nemusíte špecifikovať súbor Docker – Docker na jeho zostavenie použije už existujúci obrázok PostgreSQL v registri obrázkov Docker.
Spustite kontajnery Docker
Nakoniec pokračujte v zostavovaní obrázkov a spustite kontajnery spustením nasledujúceho príkazu:
docker compose up
Po úspešnom dokončení procesu by ste mali vidieť podobné informácie denníka na vašom termináli.
Teraz, keď je váš webový server aj databázové kontajnery v prevádzke, pokračujte a pridajte do svojej aplikácie Nest.js ďalšie funkcie. Napríklad môžete vytvoriť rozhranie Nest.js CRUD REST API.
Presunutie obrázkov Docker do centra Docker
Presunutie obrázkov Docker do Docker Hub je takmer podobné presunutiu projektov na GitHub. Ak chcete odoslať obrázok Docker aplikácie Nest.js do centra Docker Hub, postupujte podľa týchto krokov.
- Zamierte k Docker Hub, zaregistrujte sa a prihláste sa na stránku prehľadu svojho účtu.
- Kliknite na Vytvorte úložisko vyplňte názov svojho úložiska, špecifikujte jeho viditeľnosť výberom jedného z nich Verejné alebo Súkromnéa potom kliknite Vytvorte.
- Teraz sa musíte prihlásiť do svojho účtu cez terminál spustením príkazu nižšie a potom zadať svoje používateľské meno a heslo Docker.
docker login
- Potom aktualizujte názov obrázka Docker tak, aby zodpovedal tomuto formátu:
/ spustením príkazu nižšie.docker tag
/ - Nakoniec zatlačte obrázok Docker.
docker push
/
Využitie technológie kontajnerov Docker vo vývoji
Technológia kontajnerizácie spoločnosti Docker vám umožňuje spojiť aplikáciu spolu so všetkými jej závislosťami do obrázkov Docker. Tieto obrázky potom môžu bez problémov bežať v rámci kontajnerov v rôznych vývojových a produkčných prostrediach.