Използвайте Docker и Docker Compose за безпроблемно внедряване и стартиране на вашите Nest.js приложения.

„Но работи на моя компютър...“ шегата на разработчиците перфектно подчертава предизвикателството на внедряването и стартирането на приложения в различни системи.

Истинската караница е в конфигурирането на необходимите зависимости и гарантирането, че версиите на софтуера са съвместими с вашето приложение. Страхотно заобиколно решение на този проблем включва използването на технология за контейнеризиране като Docker.

Тя ви позволява без усилие да разгръщате и изпълнявате приложения – с всички необходими зависимости – в рамките на изображението на контейнера; премахване на необходимостта от обширна конфигурация в производствените системи.

Разбиране на Docker и Docker Compose

Докер е платформа за разработка с отворен код, която предоставя технология за контейнеризиране, използвана при изграждане и опаковане на приложения заедно с техните зависимости като преносими изображения.

След това тези изображения се изпълняват като изпълними компоненти в изолирани контейнерни среди. Изпълнението на приложения в тези контейнери гарантира последователна производителност на приложения в различни производствени системи без никакви проблеми със съвместимостта.

instagram viewer

От друга страна, Docker Compose е инструмент който се използва заедно с Docker за опростяване на процеса на дефиниране и управление на многоконтейнерни приложения.

Докато Docker се използва предимно за управление на отделни контейнери, Docker Compose ви позволява да управлявате конфигурацията на множество контейнери, които трябва да работят като едно приложение.

Това е особено полезно, когато едно приложение се състои от множество услуги, които трябва да работят заедно, като например няколко зависими API услуги и бази данни, между другото.

Преди да се потопите в кода, трябва да инсталирате Докер работен плот на вашата локална машина. Прегледайте специфичните за системата изисквания и стъпките за инсталиране от официалната документация.

Можете да намерите кода на това приложение в него 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, мениджърът на пакети на възли.

И накрая, можете да отидете до директорията на проекта и да завъртите сървъра за разработка.

cd docker-nest-app
npm run start

Създайте модула за база данни

Първо инсталирайте тези зависимости:

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

След това в главната директория на вашия проект създайте a .env файл и добавете следните стойности за конфигурация на връзката към базата данни:

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

И накрая, продължете и създайте модула на базата данни.

nest g module 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. WORKDIR: Тази команда инструктира Docker да зададе /app като работна директория за приложението в контейнера.
  3. КОПИЕпакет*.json./: Копира всички файлове с този формат на файловото име от текущата директория в приложението в ап папка.
  4. ИЗПЪЛНЕТЕ npm install: Тази команда ще инсталира необходимите пакети и зависимости, изисквани от приложението в контейнера на Docker.
  5. КОПИЕ. .: Инструктира Docker да копира всички файлове с изходния код на приложението от текущата директория в /app папка.
  6. RUN npm стартирайте компилация: Командата изгражда приложението Nest.js преди да създаде изображението на Docker. Той компилира кода на TypeScript в JavaScript и съхранява изхода от процеса на изграждане в a разст указател.
  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 контейнерите

Накрая продължете да създавате изображенията и стартирайте контейнерите, като изпълните следната команда:

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 /

Използване на технологията за контейнеризация на Docker в разработката

Технологията за контейнеризация на Docker ви позволява да групирате приложение заедно с всичките му зависимости в Docker изображения. След това тези изображения могат да работят гладко в контейнери в различни среди за разработка и производство без никакви проблеми.