Χρησιμοποιήστε το Docker και το Docker Compose για να αναπτύξετε και να εκτελέσετε απρόσκοπτα τις εφαρμογές σας Nest.js.

"Αλλά λειτουργεί στον υπολογιστή μου..." το αστείο προγραμματιστή υπογραμμίζει τέλεια την πρόκληση της ανάπτυξης και εκτέλεσης εφαρμογών σε διαφορετικά συστήματα.

Η πραγματική ταλαιπωρία έγκειται στη διαμόρφωση των απαιτούμενων εξαρτήσεων και στη διασφάλιση της συμβατότητας των εκδόσεων λογισμικού με την εφαρμογή σας. Μια εξαιρετική λύση σε αυτό το πρόβλημα περιλαμβάνει τη χρήση τεχνολογίας κοντέινερ όπως το Docker.

Σας επιτρέπει να αναπτύσσετε και να εκτελείτε εύκολα εφαρμογές —με όλες τις απαραίτητες εξαρτήσεις— εντός της εικόνας του κοντέινερ. εξαλείφοντας την ανάγκη για εκτεταμένη διαμόρφωση στα συστήματα παραγωγής.

Κατανόηση του Docker και του Docker Compose

Λιμενεργάτης είναι μια πλατφόρμα ανάπτυξης ανοιχτού κώδικα που παρέχει τεχνολογία αποθήκευσης εμπορευματοκιβωτίων που χρησιμοποιείται σε εφαρμογές κατασκευής και συσκευασίας παράλληλα με τις εξαρτήσεις τους ως φορητές εικόνες.

instagram viewer

Στη συνέχεια, αυτές οι εικόνες εκτελούνται ως εκτελέσιμα στοιχεία σε απομονωμένα περιβάλλοντα κοντέινερ. Η εκτέλεση εφαρμογών σε αυτά τα κοντέινερ εγγυάται σταθερή απόδοση εφαρμογής σε διαφορετικά συστήματα παραγωγής χωρίς προβλήματα συμβατότητας.

Αφ 'ετέρου, Το Docker Compose είναι ένα εργαλείο που χρησιμοποιείται μαζί με το Docker για την απλοποίηση της διαδικασίας καθορισμού και διαχείρισης εφαρμογών πολλαπλών κοντέινερ.

Ενώ το Docker χρησιμοποιείται κυρίως για τη διαχείριση μεμονωμένων κοντέινερ, το Docker Compose σάς επιτρέπει να διαχειρίζεστε τη διαμόρφωση πολλών κοντέινερ που πρέπει να εκτελούνται ως μία εφαρμογή.

Αυτό είναι ιδιαίτερα χρήσιμο όταν μια εφαρμογή αποτελείται από πολλές υπηρεσίες που πρέπει να συνεργάζονται, όπως πολλές εξαρτημένες υπηρεσίες API και βάσεις δεδομένων, μεταξύ άλλων.

Πριν βουτήξετε στον κώδικα, πρέπει να εγκαταστήσετε Docker Desktop στο τοπικό σας μηχάνημα. Ακολουθήστε τις απαιτήσεις του συστήματος και τα βήματα εγκατάστασης από την επίσημη τεκμηρίωση.

Μπορείτε να βρείτε τον κωδικό αυτής της εφαρμογής σε αυτήν GitHub αποθήκη.

Ρυθμίστε ένα έργο Nest.js

Αυτός ο οδηγός θα σας καθοδηγήσει στη διαδικασία περιστροφής δύο κοντέινερ Docker που λειτουργούν απρόσκοπτα ως μια ενιαία εφαρμογή Nest.js. Το πρώτο κοντέινερ θα περιέχει μια παρουσία της εικόνας Docker του διακομιστή ιστού Nest.js, ενώ το δεύτερο κοντέινερ θα εκτελέσει την εικόνα βάσης δεδομένων PostgreSQL του Docker.

Για να ξεκινήσετε, εγκαταστήστε το εργαλείο γραμμής εντολών Nest.js:

npm i -g @nestjs/cli

Τώρα, δημιουργήστε ένα νέο έργο Nest.js εκτελώντας την παρακάτω εντολή στο τερματικό σας.

nest new docker-nest-app

Στη συνέχεια, το εργαλείο CLI θα εμφανίσει αρκετούς διαχειριστές πακέτων από τους οποίους μπορείτε να επιλέξετε για να δημιουργήσετε το έργο. Επιλέξτε την επιλογή που προτιμάτε. Σε αυτή την περίπτωση, θα χρησιμοποιήσουμε npm, το Node Package Manager.

Τέλος, μπορείτε να πλοηγηθείτε στον κατάλογο του έργου και να περιστρέψετε τον διακομιστή ανάπτυξης.

cd docker-nest-app
npm run start

Δημιουργήστε τη μονάδα βάσης δεδομένων

Πρώτα, εγκαταστήστε αυτές τις εξαρτήσεις:

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

Στη συνέχεια, στον ριζικό κατάλογο του έργου σας, δημιουργήστε ένα .env αρχείο και προσθέστε τις ακόλουθες τιμές διαμόρφωσης σύνδεσης βάσης δεδομένων:

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

Τέλος, προχωρήστε και δημιουργήστε τη μονάδα βάσης δεδομένων.

nest g module database

Τώρα, αφού δημιουργηθεί η ενότητα, ανοίξτε το database/database.module.ts αρχείο και περιλαμβάνει τον ακόλουθο κώδικα διαμόρφωσης βάσης δεδομένων:

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

Μόλις ρυθμίσετε την εικόνα του Docker PostgreSQL χρησιμοποιώντας αυτήν τη διαμόρφωση TypeORM, η εφαρμογή Nest.js θα δημιουργήσει μια σύνδεση με τη βάση δεδομένων.

Ενημερώστε το αρχείο app.module.ts

Τέλος, ενημερώστε το κύριο αρχείο λειτουργικής μονάδας εφαρμογής για να ενσωματώσει τη διαμόρφωση για τη μονάδα βάσης δεδομένων.

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

Ρυθμίστε ένα αρχείο Docker

Ένα Dockerfile καταγράφει το απαιτούμενο σύνολο οδηγιών που απαιτούνται από τη μηχανή Docker για τη δημιουργία μιας εικόνας Docker. Αυτή η εικόνα περιλαμβάνει τον πηγαίο κώδικα της εφαρμογής και όλες τις εξαρτήσεις της.

Στον ριζικό κατάλογο του έργου σας, δημιουργήστε ένα νέο αρχείο και ονομάστε το Dockerfile. Στη συνέχεια, προσθέστε τα ακόλουθα περιεχόμενα:

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

Εδώ είναι τι αντιπροσωπεύει κάθε εντολή:

  1. ΑΠΟ: Αυτή η οδηγία καθορίζει τη βασική εικόνα που πρέπει να χρησιμοποιήσει το Docker για τη δημιουργία της εικόνας της εφαρμογής.
  2. ΔΙΕΥΘΥΝΤΗΣ ΕΡΓΑΣΙΑΣ: Αυτή η εντολή δίνει εντολή στον Docker να ορίσει το /app κατάλογο ως τον κατάλογο εργασίας για την εφαρμογή εντός του κοντέινερ.
  3. ΑΝΤΙΓΡΑΦΟπακέτο*.json./: Αντιγράφει όλα τα αρχεία με αυτήν τη μορφή ονόματος αρχείου από τον τρέχοντα κατάλογο της εφαρμογής στο εφαρμογή ντοσιέ.
  4. Εκτέλεση εγκατάστασης npm: Αυτή η εντολή θα εγκαταστήσει τα απαιτούμενα πακέτα και τις εξαρτήσεις που απαιτούνται από την εφαρμογή μέσα στο κοντέινερ Docker.
  5. ΑΝΤΙΓΡΑΦΟ. .: Αναθέτει στον Docker να αντιγράψει όλα τα αρχεία πηγαίου κώδικα της εφαρμογής από τον τρέχοντα κατάλογο στον /app ντοσιέ.
  6. RUN npm run build: Η εντολή δημιουργεί την εφαρμογή Nest.js πριν δημιουργήσει την εικόνα Docker. Μεταγλωττίζει τον κώδικα TypeScript σε JavaScript και αποθηκεύει την έξοδο της διαδικασίας κατασκευής σε α απόσταση Ευρετήριο.
  7. CMD: Καθορίζει την εντολή που θα εκτελείται κατά την εκκίνηση του κοντέινερ. Σε αυτήν την περίπτωση, θα εκτελέσουμε το npm έναρξη εκτέλεσης: dev εντολή, η οποία θα ξεκινήσει τον διακομιστή σε λειτουργία ανάπτυξης.

Αυτή η διαμόρφωση επιτρέπει στην εφαρμογή να παρακολουθεί ενεργά τις αλλαγές κώδικα. Μόλις εντοπιστούν αλλαγές, το κοντέινερ θα υποβληθεί αυτόματα σε ανακατασκευή.

Δημιουργήστε το αρχείο σύνθεσης Docker

Στον ριζικό κατάλογο του φακέλου του έργου σας, δημιουργήστε ένα νέο docker-compose.yml αρχείο και προσθέστε το ακόλουθο περιεχόμενο:

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 θα χρησιμοποιήσει αυτές τις οδηγίες για να δημιουργήσει και να εκτελέσει τις δύο εικόνες σε δύο κοντέινερ Docker. Το πρώτο κοντέινερ, ο διακομιστής, θα φιλοξενήσει την εικόνα της εφαρμογής. τρέχει στη θύρα 3000.

Το δεύτερο κοντέινερ θα φιλοξενήσει την εικόνα της βάσης δεδομένων PostgreSQL. Δεν χρειάζεται να καθορίσετε ένα Dockerfile για αυτήν την εικόνα—Το Docker θα χρησιμοποιήσει την προϋπάρχουσα εικόνα PostgreSQL στο μητρώο εικόνων του Docker για να τη δημιουργήσει.

Ξεκινήστε τα Docker Containers

Τέλος, προχωρήστε στη δημιουργία των εικόνων και ξεκινήστε τα κοντέινερ εκτελώντας την ακόλουθη εντολή:

docker compose up

Μόλις ολοκληρωθεί επιτυχώς η διαδικασία, θα πρέπει να δείτε παρόμοιες πληροφορίες καταγραφής στο τερματικό σας.

Τώρα, με τα κοντέινερ του διακομιστή ιστού και της βάσης δεδομένων σας σε λειτουργία, προχωρήστε και προσθέστε περισσότερη λειτουργικότητα στην εφαρμογή Nest.js. Για παράδειγμα, μπορείτε δημιουργήστε ένα Nest.js CRUD REST API.

Ωθώντας τις εικόνες Docker στο Docker Hub

Η προώθηση εικόνων Docker στο Docker Hub είναι σχεδόν παρόμοια με την προώθηση έργων στο GitHub. Ακολουθήστε αυτά τα βήματα για να προωθήσετε την εικόνα Docker της εφαρμογής Nest.js στο Docker Hub.

  1. Κατευθυνθείτε προς Docker Hub, εγγραφείτε και συνδεθείτε στη σελίδα επισκόπησης του λογαριασμού σας.
  2. Κάντε κλικ στο Δημιουργία αποθετηρίου κουμπί, συμπληρώστε το όνομα του αποθετηρίου σας, καθορίστε την ορατότητά του επιλέγοντας ένα από τα δύο Δημόσιο ή Ιδιωτικόςκαι μετά κάντε κλικ Δημιουργώ.
  3. Τώρα, πρέπει να συνδεθείτε στον λογαριασμό σας μέσω του τερματικού εκτελώντας την παρακάτω εντολή και, στη συνέχεια, δώστε το όνομα χρήστη και τον κωδικό πρόσβασής σας στο Docker.
    docker login
  4. Στη συνέχεια, ενημερώστε το όνομα της εικόνας του Docker για να ταιριάζει με αυτήν τη μορφή: / εκτελώντας την παρακάτω εντολή.
    docker tag /
  5. Τέλος, πιέστε την εικόνα Docker.
    docker push /

Χρησιμοποιώντας την τεχνολογία Containerization της Docker στην ανάπτυξη

Η τεχνολογία κοντέινερ του Docker σάς δίνει τη δυνατότητα να ομαδοποιήσετε μια εφαρμογή μαζί με όλες τις εξαρτήσεις της σε εικόνες Docker. Αυτές οι εικόνες μπορούν στη συνέχεια να εκτελούνται ομαλά μέσα σε κοντέινερ σε διαφορετικά περιβάλλοντα ανάπτυξης και παραγωγής χωρίς προβλήματα.