Как контейнеризировать приложение Nest.js с помощью Docker и Docker Compose
Что такое Docker и Docker Compose?
Docker — это платформа разработки с открытым исходным кодом, которая предоставляет технологию упаковки, используемую при создании и упаковке приложений, а также их зависимости в виде переносимых образов.
Эти образы затем запускаются как исполняемые компоненты в изолированной контейнерной среде. Запуск приложений в этих контейнерах обеспечивает стабильную производительность приложений в различных производственных системах без каких-либо проблем совместимости.
С другой стороны, Docker Compose — это инструмент, используемый вместе с Docker для упрощения процесса определения и управления многоконтейнерными приложениями.
Хотя Docker в основном используется для управления отдельными контейнерами, Docker Compose позволяет управлять конфигурацией нескольких контейнеров, которые необходимо запускать как одно приложение.
Это особенно полезно, когда приложение включает в себя несколько сервисов, которым необходимо работать вместе, например несколько зависимых API и сервисов баз данных.
Прежде чем погрузиться в код, вам необходимо установить Docker Desktop на локальный компьютер.
Настройте проект Nest.js
В этом руководстве рассматривается процесс настройки двух контейнеров Docker, которые без проблем работают как одно приложение Nest.js. Первый контейнер будет содержать экземпляр образа Docker веб-сервера Nest.js, а второй контейнер будет выполнять образ базы данных Docker PostgreSQL.
Для начала установите инструмент командной строки Nest.js:
npm я -g @nestjs/cli
Теперь создайте новый проект Nest.js, выполнив приведенную ниже команду в своем терминале.
гнездо нового приложения docker-nest
Затем инструмент CLI отобразит несколько менеджеров пакетов, из которых вы сможете выбрать один из них для создания проекта. Нажмите предпочтительный вариант. В этом примере используется npm.
Наконец, вы можете перейти в папку проекта и запустить сервер разработки.
запуск запуска cd docker-nest-app npm
Создать модуль базы данных
Сначала установите зависимости:
npm install pg typeorm @nestjs/typeorm @nestjs/config
Затем в корневом каталоге проекта создайте файл .env и добавьте следующие значения конфигурации подключения к базе данных:
DATABASE_HOST=”db” DATABASE_PORT=5432 DATABASE_USER=”testUser” DATABASE_PASSWORD=”mypassword123″
Наконец, давайте продолжим и создадим модуль базы данных.
База данных модуля G гнезда
Теперь, после создания модуля, откройте файл базы данных /database.module.ts и включите следующий код конфигурации базы данных:
импортировать {Модуль} из ‘@nestjs/common’; импортировать { TypeOrmModule } из ‘@nestjs/typeorm’; импортировать { ConfigModule, ConfigService } из ‘@nestjs/config’; @Module({ imports: ( ConfigModule.forRoot(), TypeOrmModule.forRootAsync({ imports: (ConfigModule), useFactory: async (configService: ConfigService) => ({ type: ‘postgres’, хост: configService.get(‘DATABASE_HOST) ‘), порт: configService.get(‘DATABASE_PORT’), имя пользователя: configService.get(‘DATABASE_USER’), пароль: configService.get(‘DATABASE_PASSWORD’), синхронизировать: true, }), inject: (ConfigService), } ), ), }) класс экспорта DatabaseModule {}
После настройки образа Docker PostgreSQL с использованием этой конфигурации TypeORM приложение Nest.js установит соединение с базой данных.
Обновить файл app.module.ts
Наконец, обновите файл основного модуля приложения, включив в него конфигурацию модуля базы данных.
импортировать {Модуль} из ‘@nestjs/common’; импортировать { ConfigModule } из ‘@nestjs/config’; импортировать {AppController} из ‘./app.controller’; импортировать {AppService} из ‘./app.service’; импортировать { DatabaseModule } из ‘./database/database.module’; @Module({ импортирует: ( ConfigModule.forRoot({ envFilePath: ‘.env’, }), DatabaseModule, ), контроллеры: (AppController), поставщики: (AppService), }) класс экспорта AppModule {}
Настройте Dockerfile
Dockerfile записывает необходимый набор инструкций, которые нужны движку Docker для создания образа Docker. Он включает исходный код приложения и все его зависимости.
В корневом каталоге проекта создайте новый файл и назовите его Dockerfile. Затем добавьте следующее:
ОТ узла: 16.3.0-alpine3.13 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm запустить сборку CMD («npm», «run», «start:dev»)
Там:
- FROM указывает базовый образ, который Docker должен использовать для создания образа приложения.
- WORKDIR указывает Docker установить каталог /app в качестве рабочего каталога приложения в контейнере.
- COPY package*.json./ копирует все файлы с этим форматом имени файла из текущего каталога приложения в каталог приложения.
- RUN npm install устанавливает необходимые пакеты и зависимости, необходимые приложению, в контейнере Docker.
- COPY… указывает Docker скопировать все файлы исходного кода приложения из текущего каталога в каталог /app.
- RUN npm run build собирает приложение Nest.js перед созданием образа Docker. Он компилирует код TypeScript в JavaScript и сохраняет результаты процесса сборки в каталоге dist.
- CMD определяет команду, которая будет запускаться при запуске контейнера. В этом случае мы запустим команду npm run start:dev, чтобы запустить сервер в режиме разработки.
Эта конфигурация позволяет приложению активно отслеживать изменения кода. При обнаружении изменений контейнер автоматически перестраивается.
Создать файл Docker Compose
В корне каталога проекта создайте новый файл docker-compose.yml и добавьте следующий контент:
версия: ‘3.9’ сервисы: сервер: сборка: . порты: – ‘3000:3000’ depend_on: – db db: image: ‘postgres’ порты: – ‘5432:5432’ среда: POSTGRES_PASSWORD: ‘mypassword123’ POSTGRES_USER: ‘testUser’ тома: – data:/var/lib/postgresql /объемы данных: данные:
Docker Compose будет использовать эти инструкции для создания и запуска двух образов в двух контейнерах Docker. Первый контейнер, сервер, будет хранить изображения приложения; работает на порту 3000.
Во втором контейнере будет храниться образ базы данных PostgreSQL. Вам не нужно указывать Dockerfile для этого образа — Docker будет использовать образ PostgreSQL, доступный в реестре образов Docker, для его сборки.
Запустить Docker-контейнер
Наконец, продолжайте создавать образы и запустите контейнер, выполнив следующую команду:
докер составить
После успешного завершения этого процесса вы увидите ту же информацию журнала на терминале.
Теперь, когда ваш веб-сервер и контейнер базы данных работают, добавьте больше функциональности в свое приложение Nest.js. Например, вы можете создать Nest.js CRUD REST API.
Отправьте образ Docker в Docker Hub.
Следуй этим шагам:
1. Перейдите в Docker Hub, зарегистрируйтесь и войдите в панель управления учетной записью.
2. Нажмите кнопку «Создать репозиторий», введите имя репозитория, определите его видимость, выбрав Public или Private, затем нажмите «Создать».
3. Теперь вам необходимо войти в учетную запись через терминал, выполнив приведенную ниже команду, а затем указать имя пользователя и пароль Docker.
вход в докер
4. Затем обновите имя образа Docker, чтобы оно соответствовало этому формату: / с помощью команды:
тег докера /
5. Наконец, отправьте образ Docker.
докер push /
Технология контейнеризации Docker позволяет упаковать приложение вместе со всеми его зависимостями в образ Docker. Эти образы затем могут без проблем работать в контейнерах в различных средах разработки и производства.