Используйте Docker и Docker Compose для беспрепятственного развертывания и запуска приложений Nest.js.
«Но это работает на моем компьютере…» шутка разработчиков прекрасно подчеркивает сложность развертывания и запуска приложений в разных системах.
Настоящая проблема заключается в настройке необходимых зависимостей и обеспечении совместимости версий программного обеспечения с вашим приложением. Отличным решением этой проблемы является использование технологии контейнеризации, такой как Docker.
Он позволяет легко развертывать и запускать приложения со всеми необходимыми зависимостями внутри образа контейнера; устраняя необходимость в обширной настройке производственных систем.
Понимание Docker и Docker Compose
Докер — это платформа разработки с открытым исходным кодом, которая предоставляет технологию контейнеризации, используемую при создании и упаковке приложений вместе с их зависимостями в виде переносимых образов.
Эти образы затем запускаются как исполняемые компоненты в изолированных контейнерных средах. Запуск приложений в этих контейнерах гарантирует стабильную производительность приложений в различных производственных системах без каких-либо проблем совместимости.
С другой стороны, 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, менеджер пакетов Node.
Наконец, вы можете перейти в каталог проекта и запустить сервер разработки.
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.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 {}
Настройте Dockerfile
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" ]
Вот что представляет собой каждая команда:
- ОТ: эта инструкция указывает базовый образ, который Docker должен использовать для создания образа приложения.
- РАБОЧИЙ ДИАПАЗОН: эта команда указывает Docker установить /app каталог в качестве рабочего каталога приложения внутри контейнера.
- КОПИРОВАТЬпакет*.json./: копирует все файлы с этим форматом имени файла из текущего каталога приложения в приложение папка.
- ЗАПУСК установки npm: эта команда установит необходимые пакеты и зависимости, необходимые приложению, в контейнере Docker.
- КОПИРОВАТЬ. .: предписывает Docker скопировать все файлы исходного кода приложения из текущего каталога в /app папка.
- ЗАПУСК npm запустить сборку: команда собирает приложение Nest.js перед созданием образа Docker. Он компилирует код TypeScript в JavaScript и сохраняет выходные данные процесса сборки в файле. расстояние каталог.
- КМД: определяет команду, которая будет запускаться при запуске контейнера. В этом случае мы запустим запуск запуска npm: dev команда, которая запустит сервер в режиме разработки.
Эта конфигурация позволяет приложению активно отслеживать изменения кода. Как только изменения будут обнаружены, контейнер будет автоматически перестроен.
Создайте файл Docker Compose
В корневом каталоге папки вашего проекта создайте новый 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.
- Отправляйтесь в Докер-Хаб, зарегистрируйтесь и войдите на страницу обзора своей учетной записи.
- Нажмите кнопку Создать репозиторий кнопку, введите имя вашего репозитория, укажите его видимость, выбрав либо Общественный или Частный, а затем нажмите Создавать.
- Теперь вам нужно войти в свою учетную запись через терминал, выполнив приведенную ниже команду, а затем указать свое имя пользователя и пароль Docker.
docker login
- Затем обновите имя образа Docker, чтобы оно соответствовало этому формату:
/ выполнив команду ниже.docker tag
/ - Наконец, отправьте образ Docker.
docker push
/
Использование технологии контейнеризации Docker в разработке
Технология контейнеризации Docker позволяет объединить приложение со всеми его зависимостями в образы Docker. Эти образы затем могут без проблем работать в контейнерах в различных средах разработки и производства.