Nutzen Sie Docker und Docker Compose, um Ihre Nest.js-Anwendungen nahtlos bereitzustellen und auszuführen.

„Aber es funktioniert auf meinem Computer …“ Der Entwicklerwitz unterstreicht perfekt die Herausforderung, Anwendungen auf verschiedenen Systemen bereitzustellen und auszuführen.

Der eigentliche Aufwand besteht darin, die erforderlichen Abhängigkeiten zu konfigurieren und sicherzustellen, dass die Softwareversionen mit Ihrer Anwendung kompatibel sind. Eine gute Workaround-Lösung für dieses Problem ist die Verwendung von Containerisierungstechnologien wie Docker.

Es ermöglicht Ihnen die mühelose Bereitstellung und Ausführung von Anwendungen – mit allen erforderlichen Abhängigkeiten – innerhalb des Container-Images; Dadurch entfällt die Notwendigkeit einer umfangreichen Konfiguration in Produktionssystemen.

Docker und Docker Compose verstehen

Docker ist eine Open-Source-Entwicklungsplattform, die Containerisierungstechnologie für die Erstellung und Verpackung von Anwendungen sowie deren Abhängigkeiten als tragbare Images bereitstellt.

instagram viewer

Diese Images werden dann als ausführbare Komponenten in isolierten Containerumgebungen ausgeführt. Das Ausführen von Anwendungen in diesen Containern garantiert eine konsistente Anwendungsleistung über verschiedene Produktionssysteme hinweg ohne Kompatibilitätsprobleme.

Andererseits, Docker Compose ist ein Tool Dies wird zusammen mit Docker verwendet, um den Prozess der Definition und Verwaltung von Multi-Container-Anwendungen zu vereinfachen.

Während Docker hauptsächlich zur Verwaltung einzelner Container verwendet wird, können Sie mit Docker Compose die Konfiguration mehrerer Container verwalten, die als einzelne Anwendung ausgeführt werden müssen.

Dies ist besonders nützlich, wenn eine Anwendung aus mehreren Diensten besteht, die zusammenarbeiten müssen, beispielsweise mehreren abhängigen API-Diensten und Datenbanken.

Bevor Sie in den Code eintauchen, müssen Sie ihn installieren Docker-Desktop auf Ihrem lokalen Rechner. Gehen Sie die systemspezifischen Anforderungen und Installationsschritte aus der offiziellen Dokumentation durch.

Den Code dieser Anwendung finden Sie in ihrer GitHub Repository.

Richten Sie ein Nest.js-Projekt ein

Dieser Leitfaden führt Sie durch den Prozess des Hochfahrens von zwei Docker-Containern, die nahtlos als eine einzige Nest.js-Anwendung funktionieren. Der erste Container enthält eine Instanz des Docker-Images des Nest.js-Webservers, während der zweite Container das PostgreSQL-Datenbankimage von Docker ausführt.

Installieren Sie zunächst das Nest.js-Befehlszeilentool:

npm i -g @nestjs/cli

Erstellen Sie nun ein neues Nest.js-Projekt, indem Sie den folgenden Befehl in Ihrem Terminal ausführen.

nest new docker-nest-app

Als Nächstes zeigt das CLI-Tool mehrere Paketmanager an, aus denen Sie zum Erstellen des Projekts auswählen können. Wählen Sie Ihre bevorzugte Option. In diesem Fall verwenden wir npm, der Node Package Manager.

Abschließend können Sie zum Projektverzeichnis navigieren und den Entwicklungsserver starten.

cd docker-nest-app
npm run start

Erstellen Sie das Datenbankmodul

Installieren Sie zunächst diese Abhängigkeiten:

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

Erstellen Sie als Nächstes im Stammverzeichnis Ihres Projekts eine .env Datei und fügen Sie die folgenden Datenbankverbindungskonfigurationswerte hinzu:

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

Fahren Sie abschließend fort und erstellen Sie das Datenbankmodul.

nest g module database

Nachdem das Modul erstellt wurde, öffnen Sie nun das Datenbank/Datenbank.module.ts Datei und fügen Sie den folgenden Datenbankkonfigurationscode ein:

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

Sobald Sie das Docker-PostgreSQL-Image mit dieser TypeORM-Konfiguration eingerichtet haben, stellt die Nest.js-Anwendung eine Verbindung zur Datenbank her.

Aktualisieren Sie die Datei app.module.ts

Aktualisieren Sie abschließend die Hauptanwendungsmoduldatei, um die Konfiguration für das Datenbankmodul zu integrieren.

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

Richten Sie eine Docker-Datei ein

Eine Docker-Datei erfasst die erforderlichen Anweisungen, die die Docker-Engine zum Erstellen eines Docker-Images benötigt. Dieses Bild umfasst den Quellcode der Anwendung und alle ihre Abhängigkeiten.

Erstellen Sie im Stammverzeichnis Ihres Projekts eine neue Datei und nennen Sie sie Dockerfile. Fügen Sie dann den folgenden Inhalt hinzu:

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

Hier ist, was jeder Befehl darstellt:

  1. AUS: Diese Anweisung gibt das Basis-Image an, das Docker zum Erstellen des Anwendungs-Images verwenden soll.
  2. ARBEITSVERZEICHNIS: Dieser Befehl weist Docker an, das festzulegen /app Verzeichnis als Arbeitsverzeichnis für die App im Container.
  3. KOPIERENpackage*.json./: Kopiert alle Dateien mit diesem Dateinamenformat aus dem aktuellen Verzeichnis in der Anwendung in das App Ordner.
  4. Führen Sie die NPM-Installation aus: Dieser Befehl installiert die erforderlichen Pakete und Abhängigkeiten, die die Anwendung im Docker-Container benötigt.
  5. KOPIEREN. .: Weist Docker an, alle Quellcodedateien der Anwendung aus dem aktuellen Verzeichnis in das zu kopieren /app Ordner.
  6. RUN npm run build: Der Befehl erstellt die Nest.js-Anwendung, bevor das Docker-Image erstellt wird. Es kompiliert den TypeScript-Code in JavaScript und speichert die Ausgabe des Build-Prozesses in einem dist Verzeichnis.
  7. CMD: Definiert den Befehl, der beim Start des Containers ausgeführt werden soll. In diesem Fall führen wir das aus npm-Laufstart: dev Befehl, der den Server im Entwicklungsmodus startet.

Diese Konfiguration ermöglicht es der Anwendung, Codeänderungen aktiv zu überwachen. Sobald Änderungen erkannt werden, wird der Container automatisch neu erstellt.

Erstellen Sie die Docker Compose-Datei

Erstellen Sie im Stammverzeichnis Ihres Projektordners einen neuen docker-compose.yml Datei und fügen Sie den folgenden Inhalt hinzu:

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 verwendet diese Anweisungen, um die beiden Images in zwei Docker-Containern zu erstellen und auszuführen. Der erste Container, der Server, hostet das Image der Anwendung. Läuft auf Port 3000.

Der zweite Container hostet das PostgreSQL-Datenbank-Image. Sie müssen für dieses Image keine Docker-Datei angeben – Docker verwendet zum Erstellen das bereits vorhandene PostgreSQL-Image in der Image-Registrierung von Docker.

Starten Sie die Docker-Container

Fahren Sie abschließend mit der Erstellung der Images fort und starten Sie die Container, indem Sie den folgenden Befehl ausführen:

docker compose up

Sobald der Vorgang erfolgreich abgeschlossen ist, sollten auf Ihrem Terminal ähnliche Protokollinformationen angezeigt werden.

Nachdem nun sowohl Ihr Webserver als auch Ihre Datenbankcontainer in Betrieb sind, können Sie Ihrer Nest.js-Anwendung weitere Funktionen hinzufügen. Das können Sie zum Beispiel Erstellen Sie eine Nest.js CRUD REST API.

Docker-Images an Docker Hub übertragen

Das Übertragen von Docker-Images an Docker Hub ähnelt fast dem Übertragen von Projekten an GitHub. Befolgen Sie diese Schritte, um das Docker-Image der Nest.js-Anwendung an Docker Hub zu übertragen.

  1. Geh 'rüber zu Docker-Hub, registrieren Sie sich und melden Sie sich auf der Übersichtsseite Ihres Kontos an.
  2. Drücke den Repository erstellen Klicken Sie auf die Schaltfläche, geben Sie den Namen Ihres Repositorys ein und legen Sie dessen Sichtbarkeit fest, indem Sie eine der beiden Optionen auswählen Öffentlich oder Privat, und klicken Sie dann Erstellen.
  3. Jetzt müssen Sie sich über das Terminal bei Ihrem Konto anmelden, indem Sie den folgenden Befehl ausführen und dann Ihren Docker-Benutzernamen und Ihr Passwort angeben.
    docker login
  4. Aktualisieren Sie als Nächstes den Bildnamen des Docker, sodass er diesem Format entspricht: / indem Sie den folgenden Befehl ausführen.
    docker tag /
  5. Zum Schluss pushen Sie das Docker-Image.
    docker push /

Nutzung der Containerisierungstechnologie von Docker in der Entwicklung

Mit der Containerisierungstechnologie von Docker können Sie eine Anwendung zusammen mit all ihren Abhängigkeiten in Docker-Images bündeln. Diese Images können dann problemlos in Containern in verschiedenen Entwicklungs- und Produktionsumgebungen ausgeführt werden.