Skorzystaj z Docker i Docker Compose, aby bezproblemowo wdrażać i uruchamiać aplikacje Nest.js.

„Ale to działa na moim komputerze…” żart programisty doskonale podkreśla wyzwanie, jakie stanowi wdrażanie i uruchamianie aplikacji w różnych systemach.

Prawdziwy problem polega na skonfigurowaniu wymaganych zależności i upewnieniu się, że wersje oprogramowania są kompatybilne z Twoją aplikacją. Świetnym obejściem tego problemu jest użycie technologii konteneryzacji, takiej jak Docker.

Umożliwia łatwe wdrażanie i uruchamianie aplikacji — ze wszystkimi niezbędnymi zależnościami — w obrazie kontenera; eliminując potrzebę rozbudowanej konfiguracji w systemach produkcyjnych.

Zrozumienie Dockera i Docker Compose

Doker to platforma programistyczna typu open source, która zapewnia technologię konteneryzacji stosowaną przy budowaniu i pakowaniu aplikacji wraz z ich zależnościami w postaci przenośnych obrazów.

Obrazy te są następnie uruchamiane jako komponenty wykonywalne w izolowanych środowiskach kontenerowych. Uruchamianie aplikacji w tych kontenerach gwarantuje stałą wydajność aplikacji w różnych systemach produkcyjnych bez żadnych problemów ze zgodnością.

Z drugiej strony, Docker Compose jest narzędziem który jest używany razem z Dockerem w celu uproszczenia procesu definiowania aplikacji wielokontenerowych i zarządzania nimi.

Chociaż Docker jest używany głównie do zarządzania pojedynczymi kontenerami, Docker Compose umożliwia zarządzanie konfiguracją wielu kontenerów, które muszą działać jako pojedyncza aplikacja.

Jest to szczególnie przydatne, gdy aplikacja składa się z wielu usług, które muszą ze sobą współpracować, takich jak między innymi kilka zależnych usług API i baz danych.

Zanim zagłębisz się w kod, musisz zainstalować Pulpit Dockera na komputerze lokalnym. Zapoznaj się z wymaganiami specyficznymi dla systemu i etapami instalacji z oficjalnej dokumentacji.

Kod tej aplikacji znajdziesz w jej pliku GitHub magazyn.

Skonfiguruj projekt Nest.js

Ten przewodnik przeprowadzi Cię przez proces tworzenia dwóch kontenerów Docker, które bezproblemowo działają jako pojedyncza aplikacja Nest.js. Pierwszy kontener będzie zawierał instancję obrazu Dockera serwera WWW Nest.js, podczas gdy drugi kontener będzie wykonywał obraz bazy danych PostgreSQL Dockera.

Aby rozpocząć, zainstaluj narzędzie wiersza poleceń Nest.js:

npm i -g @nestjs/cli

Teraz utwórz nowy projekt Nest.js, uruchamiając poniższe polecenie w terminalu.

nest new docker-nest-app

Następnie narzędzie CLI wyświetli kilka menedżerów pakietów do wyboru w celu utworzenia projektu. Wybierz preferowaną opcję. W tym przypadku skorzystamy npm, menedżer pakietów węzłów.

Na koniec możesz przejść do katalogu projektu i uruchomić serwer programistyczny.

cd docker-nest-app
npm run start

Utwórz moduł bazy danych

Najpierw zainstaluj te zależności:

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

Następnie w katalogu głównym projektu utwórz plik .środka plik i dodaj następujące wartości konfiguracyjne połączenia z bazą danych:

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

Na koniec przejdź dalej i utwórz moduł bazy danych.

nest g module database

Teraz, po utworzeniu modułu, otwórz plik baza danych/baza danych.moduł.ts plik i dołącz następujący kod konfiguracji bazy danych:

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 skonfigurowaniu obrazu Docker PostgreSQL przy użyciu tej konfiguracji TypeORM aplikacja Nest.js nawiąże połączenie z bazą danych.

Zaktualizuj plik app.module.ts

Na koniec zaktualizuj główny plik modułu aplikacji, aby uwzględnić konfigurację modułu bazy danych.

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

Skonfiguruj plik Dockerfile

Plik Dockerfile przechwytuje wymagany zestaw instrukcji potrzebnych silnikowi Dockera do utworzenia obrazu Dockera. Ten obraz obejmuje kod źródłowy aplikacji i wszystkie jego zależności.

W katalogu głównym projektu utwórz nowy plik i nadaj mu nazwę Dockerfile. Następnie dodaj następującą zawartość:

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

Oto, co reprezentuje każde polecenie:

  1. Z: Ta instrukcja określa obraz podstawowy, którego Docker powinien użyć do zbudowania obrazu aplikacji.
  2. KATALOG PRACY: To polecenie instruuje Dockera, aby ustawić /app katalog jako katalog roboczy aplikacji w kontenerze.
  3. KOPIUJpakiet*.json./: Kopiuje wszystkie pliki o tym formacie nazwy pliku z bieżącego katalogu aplikacji do aplikacja teczka.
  4. Uruchom instalację npm: To polecenie zainstaluje wymagane pakiety i zależności wymagane przez aplikację w kontenerze Docker.
  5. KOPIUJ. .: instruuje Dockera, aby skopiował wszystkie pliki kodu źródłowego aplikacji z bieżącego katalogu do pliku /app teczka.
  6. RUN npm uruchom kompilację: Polecenie tworzy aplikację Nest.js przed utworzeniem obrazu Dockera. Kompiluje kod TypeScript do JavaScript i przechowuje dane wyjściowe procesu kompilacji w pliku odl informator.
  7. CMD: Określa polecenie, które ma zostać uruchomione podczas uruchamiania kontenera. W tym przypadku uruchomimy start uruchomienia npm: rozw polecenie, które uruchomi serwer w trybie deweloperskim.

Ta konfiguracja umożliwia aplikacji aktywne monitorowanie zmian w kodzie. Po wykryciu zmian kontener zostanie automatycznie poddany przebudowie.

Utwórz plik tworzenia Dockera

W katalogu głównym folderu projektu utwórz nowy plik docker-compose.yml plik i dodaj następującą treść:

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 użyje tych instrukcji do zbudowania i uruchomienia dwóch obrazów w dwóch kontenerach Docker. Pierwszy kontener, serwer, będzie hostował obraz aplikacji; działa na porcie 3000.

Drugi kontener będzie hostem obrazu bazy danych PostgreSQL. Nie musisz określać pliku Docker dla tego obrazu — Docker użyje istniejącego obrazu PostgreSQL w rejestrze obrazów Dockera, aby go zbudować.

Uruchom kontenery Docker

Na koniec przystąp do budowania obrazów i uruchom kontenery, uruchamiając następujące polecenie:

docker compose up

Po pomyślnym zakończeniu procesu powinieneś zobaczyć podobne informacje w dzienniku na swoim terminalu.

Teraz, gdy zarówno serwer WWW, jak i kontenery baz danych są już uruchomione, możesz dodać więcej funkcji do swojej aplikacji Nest.js. Na przykład możesz zbuduj API REST Nest.js CRUD.

Wypychanie obrazów Dockera do Docker Hub

Wypychanie obrazów Dockera do Docker Hub jest prawie podobne do wypychania projektów do GitHub. Wykonaj poniższe kroki, aby wypchnąć obraz platformy Docker aplikacji Nest.js do usługi Docker Hub.

  1. Udaj się do Centrum Dockera, zarejestruj się i zaloguj na stronie przeglądu swojego konta.
  2. Kliknij Utwórz repozytorium przycisk, wpisz nazwę swojego repozytorium, określ jego widoczność, wybierając jedną z opcji Publiczny Lub Prywatny, a następnie kliknij Tworzyć.
  3. Teraz musisz zalogować się na swoje konto za pośrednictwem terminala, uruchamiając poniższe polecenie, a następnie podać swoją nazwę użytkownika i hasło Dockera.
    docker login
  4. Następnie zaktualizuj nazwę obrazu Dockera, aby pasowała do tego formatu: / uruchamiając poniższe polecenie.
    docker tag /
  5. Na koniec wypchnij obraz Dockera.
    docker push /

Wykorzystanie technologii konteneryzacji Dockera w rozwoju

Technologia konteneryzacji Dockera umożliwia pakowanie aplikacji wraz ze wszystkimi jej zależnościami w obrazy Dockera. Obrazy te mogą następnie bezproblemowo działać w kontenerach w różnych środowiskach programistycznych i produkcyjnych.