Využijte Docker a Docker Compose k bezproblémovému nasazení a spouštění aplikací Nest.js.

„Ale na mém počítači to funguje...“ vtip vývojářů dokonale zdůrazňuje výzvu nasazení a spouštění aplikací napříč různými systémy.

Skutečný problém spočívá v konfiguraci požadovaných závislostí a zajištění kompatibility verzí softwaru s vaší aplikací. Skvělé řešení tohoto problému zahrnuje použití technologie kontejnerizace, jako je Docker.

Umožňuje vám bez námahy nasazovat a spouštět aplikace – se všemi nezbytnými závislostmi – v rámci obrazu kontejneru; eliminuje potřebu rozsáhlé konfigurace ve výrobních systémech.

Porozumění Dockeru a Docker Compose

Přístavní dělník je open-source vývojová platforma, která poskytuje technologii kontejnerizace používanou při vytváření a balení aplikací spolu s jejich závislostmi jako přenosné obrázky.

Tyto obrazy jsou pak spouštěny jako spustitelné komponenty v prostředí izolovaných kontejnerů. Spouštění aplikací v těchto kontejnerech zaručuje konzistentní výkon aplikací napříč různými produkčními systémy bez jakýchkoli problémů s kompatibilitou.

instagram viewer

Na druhou stranu, Docker Compose je nástroj který se používá společně s Dockerem ke zjednodušení procesu definování a správy vícekontejnerových aplikací.

Zatímco Docker se primárně používá ke správě jednotlivých kontejnerů, Docker Compose umožňuje spravovat konfiguraci více kontejnerů, které musí běžet jako jedna aplikace.

To je zvláště užitečné, když se aplikace skládá z více služeb, které potřebují spolupracovat, jako je mimo jiné několik závislých služeb API a databází.

Než se ponoříte do kódu, musíte jej nainstalovat Docker Desktop na vašem místním počítači. Projděte si systémové požadavky a kroky instalace z oficiální dokumentace.

V něm najdete kód této aplikace GitHub úložiště.

Nastavte projekt Nest.js

Tato příručka vás provede procesem vytvoření dvou kontejnerů Docker, které bez problémů fungují jako jedna aplikace Nest.js. První kontejner bude obsahovat instanci obrázku Docker webového serveru Nest.js, zatímco druhý kontejner spustí obrázek databáze PostgreSQL Docker.

Chcete-li začít, nainstalujte nástroj příkazového řádku Nest.js:

npm i -g @nestjs/cli

Nyní vytvořte nový projekt Nest.js spuštěním příkazu níže v terminálu.

nest new docker-nest-app

Dále nástroj CLI zobrazí několik správců balíčků, ze kterých si můžete vybrat pro vytvoření projektu. Vyberte preferovanou možnost. V tomto případě použijeme npm, Správce balíčků uzlů.

Nakonec můžete přejít do adresáře projektu a spustit vývojový server.

cd docker-nest-app
npm run start

Vytvořte modul databáze

Nejprve nainstalujte tyto závislosti:

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

Dále v kořenovém adresáři projektu vytvořte a .env a přidejte následující konfigurační hodnoty databázového připojení:

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

Nakonec pokračujte a vytvořte modul databáze.

nest g module database

Nyní, po vytvoření modulu, otevřete soubor databáze/databáze.modul.ts soubor a zahrňte následující konfigurační kód databáze:

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

Jakmile nastavíte image Docker PostgreSQL pomocí této konfigurace TypeORM, aplikace Nest.js naváže připojení k databázi.

Aktualizujte soubor app.module.ts

Nakonec aktualizujte soubor hlavního aplikačního modulu, aby zahrnoval konfiguraci databázového modulu.

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 Dockerfile

Dockerfile zachycuje požadovanou sadu instrukcí, kterou potřebuje engine Docker k vytvoření obrazu Dockeru. Tento obrázek zahrnuje zdrojový kód aplikace a všechny její závislosti.

V kořenovém adresáři svého projektu vytvořte nový soubor a pojmenujte jej Dockerfile. Poté přidejte následující 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" ]

Zde je to, co každý příkaz představuje:

  1. Z: Tato instrukce určuje základní bitovou kopii, kterou by měl Docker použít k vytvoření bitové kopie aplikace.
  2. WORKDIR: Tento příkaz dává Dockeru pokyn k nastavení /app adresář jako pracovní adresář pro aplikaci v kontejneru.
  3. KOPÍROVATbalíček*.json./: Zkopíruje všechny soubory s tímto formátem názvu souboru z aktuálního adresáře v aplikaci do aplikace složku.
  4. SPUSTIT instalaci npm: Tento příkaz nainstaluje požadované balíčky a závislosti požadované aplikací v kontejneru Docker.
  5. KOPÍROVAT. .: Instruuje Docker, aby zkopíroval všechny soubory zdrojového kódu aplikace z aktuálního adresáře do /app složku.
  6. RUN npm spustit sestavení: Příkaz vytvoří aplikaci Nest.js před vytvořením obrazu Docker. Zkompiluje kód TypeScript do JavaScriptu a uloží výstup procesu sestavení do a dist adresář.
  7. CMD: Definuje příkaz, který se má spustit při spuštění kontejneru. V tomto případě spustíme npm spuštění spuštění: dev příkaz, který spustí server ve vývojovém režimu.

Tato konfigurace umožňuje aplikaci aktivně sledovat změny kódu. Jakmile jsou zjištěny změny, kontejner automaticky projde přestavbou.

Vytvořte soubor Docker Compose File

V kořenovém adresáři složky projektu vytvořte nový docker-compose.yml soubor a přidejte následující 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 tyto pokyny k vytvoření a spuštění dvou obrazů ve dvou kontejnerech Docker. První kontejner, server, bude hostit obraz aplikace; běží na portu 3000.

Druhý kontejner bude hostit obraz databáze PostgreSQL. Pro tento obraz nemusíte specifikovat Dockerfile – Docker k jeho vytvoření využije již existující obraz PostgreSQL v registru obrazů Dockeru.

Spusťte kontejnery Docker

Nakonec pokračujte ve vytváření obrázků a spusťte kontejnery spuštěním následujícího příkazu:

docker compose up

Jakmile je proces úspěšně dokončen, měli byste na svém terminálu vidět podobné informace protokolu.

Nyní, když je váš webový server i databázové kontejnery spuštěny a spuštěny, pokračujte a přidejte do své aplikace Nest.js další funkce. Například můžete vytvořit rozhraní Nest.js CRUD REST API.

Odeslání obrázků Docker do centra Docker

Přenášení obrázků Dockeru do Docker Hub je téměř podobné přenášení projektů na GitHub. Chcete-li odeslat obrázek Docker aplikace Nest.js do centra Docker, postupujte podle těchto kroků.

  1. Zamiřte k Docker Hub, zaregistrujte se a přihlaste se na stránku přehledu svého účtu.
  2. Klikněte na Vytvořit úložiště vyplňte název svého úložiště, určete jeho viditelnost výběrem jedné z nich Veřejnost nebo Soukroméa poté klepněte na Vytvořit.
  3. Nyní se musíte přihlásit ke svému účtu prostřednictvím terminálu spuštěním příkazu níže a poté zadat své uživatelské jméno a heslo Docker.
    docker login
  4. Dále aktualizujte název obrázku Dockeru, aby odpovídal tomuto formátu: / spuštěním příkazu níže.
    docker tag /
  5. Nakonec zatlačte obraz Dockeru.
    docker push /

Využití technologie kontejnerů Docker ve vývoji

Technologie kontejnerizace společnosti Docker vám umožňuje seskupovat aplikaci spolu se všemi jejími závislostmi do obrazů Docker. Tyto obrazy pak mohou bez problémů běžet v rámci kontejnerů v různých vývojových a produkčních prostředích.