Maak gebruik van Docker en Docker Compose om uw Nest.js-applicaties naadloos te implementeren en uit te voeren.
"Maar het werkt op mijn computer..." grap van de ontwikkelaar benadrukt perfect de uitdaging van het implementeren en uitvoeren van applicaties op verschillende systemen.
Het echte gedoe ligt in het configureren van de vereiste afhankelijkheden en het garanderen dat de softwareversies compatibel zijn met uw applicatie. Een goede oplossing voor dit probleem is het gebruik van containerisatietechnologie zoals Docker.
Hiermee kunt u moeiteloos applicaties implementeren en uitvoeren (met alle noodzakelijke afhankelijkheden) binnen de containerimage; waardoor de noodzaak voor uitgebreide configuratie in productiesystemen wordt geëlimineerd.
Docker en Docker Compose begrijpen
Dokwerker is een open-source ontwikkelingsplatform dat containerisatietechnologie biedt die wordt gebruikt bij het bouwen en verpakken van applicaties, naast hun afhankelijkheden als draagbare images.
Deze afbeeldingen worden vervolgens uitgevoerd als uitvoerbare componenten binnen geïsoleerde containeromgevingen. Het uitvoeren van applicaties binnen deze containers garandeert consistente applicatieprestaties op verschillende productiesystemen zonder compatibiliteitsproblemen.
Aan de andere kant, Docker Compose is een hulpmiddel dat samen met Docker wordt gebruikt om het proces van het definiëren en beheren van applicaties met meerdere containers te vereenvoudigen.
Hoewel Docker voornamelijk wordt gebruikt om individuele containers te beheren, kunt u met Docker Compose de configuratie beheren van meerdere containers die als één enkele applicatie moeten worden uitgevoerd.
Dit is met name handig wanneer een applicatie uit meerdere services bestaat die moeten samenwerken, zoals onder meer verschillende afhankelijke API-services en databases.
Voordat je in de code duikt, moet je installeren Docker-bureaublad op uw lokale computer. Doorloop de systeemspecifieke vereisten en installatiestappen uit de officiële documentatie.
U kunt de code van deze toepassing vinden in het GitHub opslagplaats.
Zet een Nest.js-project op
Deze gids leidt u door het proces van het opzetten van twee Docker-containers die naadloos werken als één Nest.js-applicatie. De eerste container bevat een exemplaar van de Docker-image van de Nest.js-webserver, terwijl de tweede container de PostgreSQL-databaseimage van Docker zal uitvoeren.
Installeer het opdrachtregelprogramma Nest.js om aan de slag te gaan:
npm i -g @nestjs/cli
Maak nu een nieuw Nest.js-project door de onderstaande opdracht in uw terminal uit te voeren.
nest new docker-nest-app
Vervolgens geeft de CLI-tool verschillende pakketbeheerders weer waaruit u kunt kiezen om het project te maken. Kies uw voorkeursoptie. In dit geval zullen we gebruiken npm, de knooppuntpakketbeheerder.
Ten slotte kunt u naar de projectmap navigeren en de ontwikkelingsserver opstarten.
cd docker-nest-app
npm run start
Maak de databasemodule
Installeer eerst deze afhankelijkheden:
npm install pg typeorm @nestjs/typeorm @nestjs/config
Maak vervolgens in de hoofdmap van uw project een .env bestand en voeg de volgende configuratiewaarden voor de databaseverbinding toe:
DATABASE_HOST="db"
DATABASE_PORT=5432
DATABASE_USER="testUser"
DATABASE_PASSWORD="mypassword123"
Ga ten slotte door en maak de databasemodule.
nest g module database
Nadat de module is gemaakt, opent u nu het database/database.module.ts bestand en voeg de volgende databaseconfiguratiecode toe:
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 {}
Zodra u de Docker PostgreSQL-afbeelding hebt ingesteld met behulp van deze TypeORM-configuratie, zal de Nest.js-applicatie een verbinding tot stand brengen met de database.
Werk het app.module.ts-bestand bij
Werk ten slotte het hoofdtoepassingsmodulebestand bij om de configuratie voor de databasemodule op te nemen.
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 {}
Stel een Dockerbestand in
Een Dockerfile legt de vereiste set instructies vast die de Docker-engine nodig heeft om een Docker-image te maken. Deze afbeelding omvat de broncode van de toepassing en al zijn afhankelijkheden.
Maak in de hoofdmap van uw project een nieuw bestand en noem dit Dockerfile. Voeg vervolgens de volgende inhoud toe:
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" ]
Dit is wat elke opdracht vertegenwoordigt:
- VAN: deze instructie specificeert de basisimage die Docker moet gebruiken om de image van de applicatie te bouwen.
- WERKDIR: Deze opdracht instrueert Docker om de /app map als de werkmap voor de app in de container.
- KOPIËRENpakket*.json./: Kopieert alle bestanden met dat bestandsnaamformaat van de huidige map in de toepassing naar de app map.
- RUN npm-installatie: Met deze opdracht worden de vereiste pakketten en afhankelijkheden geïnstalleerd die vereist zijn voor de toepassing in de Docker-container.
- KOPIËREN. .: Instrueert Docker om alle broncodebestanden van de toepassing van de huidige map naar de /app map.
- RUN npm run-build: Met de opdracht wordt de Nest.js-app gebouwd voordat de Docker-image wordt gemaakt. Het compileert de TypeScript-code in JavaScript en slaat de uitvoer van het bouwproces op in een afstand map.
- CMD: Definieert de opdracht die moet worden uitgevoerd wanneer de container start. In dit geval voeren we de npm run start: dev commando, waarmee de server in de ontwikkelingsmodus wordt gestart.
Met deze configuratie kan de applicatie codewijzigingen actief monitoren. Zodra er wijzigingen worden gedetecteerd, wordt de container automatisch opnieuw opgebouwd.
Maak het Docker Compose-bestand
Maak in de hoofdmap van uw projectmap een nieuw docker-compose.yml bestand en voeg de volgende inhoud toe:
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 gebruikt deze instructies om de twee images in twee Docker-containers te bouwen en uit te voeren. De eerste container, de server, zal de afbeelding van de applicatie hosten; draait op poort 3000.
De tweede container host de PostgreSQL-database-image. U hoeft geen Dockerfile op te geven voor deze image. Docker gebruikt de reeds bestaande PostgreSQL-image in het Docker-imageregister om deze te bouwen.
Start de Docker-containers
Ga ten slotte verder met het bouwen van de afbeeldingen en start de containers door de volgende opdracht uit te voeren:
docker compose up
Zodra het proces met succes is voltooid, zou u vergelijkbare loginformatie op uw terminal moeten zien.
Nu zowel uw webserver als uw databasecontainers actief zijn, kunt u doorgaan en meer functionaliteit toevoegen aan uw Nest.js-applicatie. Dat kan bijvoorbeeld bouw een Nest.js CRUD REST API.
Docker-images naar Docker Hub pushen
Het pushen van Docker-images naar Docker Hub lijkt vrijwel op het pushen van projecten naar GitHub. Volg deze stappen om de Docker-image van de Nest.js-applicatie naar Docker Hub te pushen.
- Ga naar Docker-hub, meld u aan en log in op de overzichtspagina van uw account.
- Klik op de Repository maken knop, vul de naam van uw repository in en specificeer de zichtbaarheid ervan door een van beide te selecteren Openbaar of Privaaten klik vervolgens op Creëren.
- Nu moet u via de terminal inloggen op uw account door de onderstaande opdracht uit te voeren en vervolgens uw Docker-gebruikersnaam en -wachtwoord op te geven.
docker login
- Update vervolgens de naam van de Docker-afbeelding zodat deze overeenkomt met deze indeling:
/ door de onderstaande opdracht uit te voeren.docker tag
/ - Druk ten slotte op de Docker-afbeelding.
docker push
/
Gebruik maken van de containerisatietechnologie van Docker in ontwikkeling
Met de containerisatietechnologie van Docker kunt u een applicatie samen met al zijn afhankelijkheden bundelen in Docker-images. Deze images kunnen vervolgens probleemloos binnen containers in verschillende ontwikkel- en productieomgevingen worden uitgevoerd.