“Упакувати додаток Node.js у контейнер”

Ця стаття проведе вас через процес контейнеризації та запуску Node.js додатку.

pic

Чому ми віддаємо перевагу контейнеризації коду додатка?

Контейнеризація додатка має численні переваги, які вирішують різні проблеми, з якими стикаються розробники та команди DevOps при розгортанні, запуску та масштабуванні додатків. Ось чому контейнеризація є цінною практикою:

  1. Узгодженість середовищ, 2. Спрощене керування залежностями, 3. Переносимість, 4. Масштабованість, 5. Швидше розгортання, 6. Ефективне використання ресурсів, 7. Ізоляція

Як Docker допомагає контейнеризувати додаток?

Docker надає можливість упаковувати та запускати додаток в слабо ізольованому середовищі, яке називається контейнером. Ізоляція та безпека дозволяють запускати багато контейнерів одночасно на одному хості. Контейнери є легкими та містять все необхідне для запуску додатка, тому вам не потрібно покладатися на те, що встановлено на хості. Ви можете ділитися контейнерами під час роботи, будучи впевненими, що кожен, з ким ви поділитеся, отримає той самий контейнер, який працює так само.

Давайте почнемо контейнеризувати Node.js додаток

Попередні вимоги

Переконайтеся, що Docker та Git встановлені на вашому хості.

Клонування коду додатка

Клонуйте зразковий додаток, щоб використовувати його з цим посібником. Відкрийте термінал, змініть директорію на ту, в якій ви хочете працювати, і виконайте наступну команду для клонування репозиторію:

git clone https://github.com/ganeshkr-54/docker-nodejs-sample.git

Тепер, коли у нас є код додатка, ми можемо створити необхідні ресурси Docker для контейнеризації нашого додатка. Створіть файли Dockerfile та compose.yml

Dockerfile

# syntax=docker/dockerfile:1  

ARG NODE_VERSION=18.0.0  

FROM node:${NODE_VERSION}-alpine as base  
WORKDIR /usr/src/app  
EXPOSE 3000  

FROM base as dev  
RUN --mount=type=bind,source=package.json,target=package.json \  
 --mount=type=bind,source=package-lock.json,target=package-lock.json \  
 --mount=type=cache,target=/root/.npm \  
 npm ci --include=dev  
USER node  
COPY . .  
CMD npm run dev  

FROM base as prod  
RUN --mount=type=bind,source=package.json,target=package.json \  
 --mount=type=bind,source=package-lock.json,target=package-lock  
 npm ci --omit=dev  
USER node  
COPY . .  
CMD node src/index.js

У Dockerfile спочатку додається мітка as base до інструкції FROM node:${NODE_VERSION}-alpine. Це дозволяє вам посилатися на цю стадію збірки в інших стадіях збірки. Далі додається нова стадія збірки з міткою dev для встановлення залежностей для розробки та запуску контейнера за допомогою npm run dev. І, зрештою, додається стадія з міткою prod, яка виключає залежності для розробки та запускає ваш додаток за допомогою node src/index.js.

compose.yml

services:  
 server:  
 build:  
 context: .  

target: dev  
 порти:  
 - 3000:3000  
 - 9229:9229  
 змінні оточення:  
 NODE_ENV: production  
 POSTGRES_HOST: db  
 POSTGRES_USER: postgres  
 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}  
 POSTGRES_DB: example  
 залежить від:  
 db:  
 умова: service_healthy  
 томи:  
 - ./src:/usr/src/app/src  
 db:  
 образ: postgres  
 перезапуск: always  
 користувач: postgres  
 томи:  
 - db-data:/var/lib/postgresql/data  
 змінні оточення:  
 - POSTGRES_DB=example  
 - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}  
 відкрито:  
 - 5432  
 healthcheck:  
 тест: ["CMD", "pg_isready"]  
 інтервал: 10s  
 тайм-аут: 5s  
 спроби: 5  
томи:  
 db-data:

Не забудьте створити файл .env для зберігання пароля для Postgres

POSTGRES_PASSWORD=xxxxxxx

Ось які файли повинні бути в каталозі проекту:

pic

У файлі compose ми створюємо два сервіси: сервіс "server", який представляє додаток, і сервіс "db", що містить базу даних postgres та том для збереження даних.

Відкрийте src/persistence/postgres.js у IDE або текстовому редакторі. Ви помітите, що цей додаток використовує базу даних Postgres і потребує деяких змінних оточення для підключення до бази даних.

Тому в розділі змінних оточення в файлі compose ми визначили змінні оточення, які вказують конфігурацію бази даних.

Щоб запустити стадію dev за допомогою Compose, ми оновили файл compose.yaml, додавши інструкцію target: dev, щоб вибрати стадію dev з нашого багатоступеневого Dockerfile.

Також ми додали новий том до сервісу server для зв'язування томів. Для цього додатка ми монтуємо ./src з нашого локального комп'ютера в /usr/src/app/src в контейнері. І наостанок, відкриваємо порт 9229 для налагодження.

Том “db-data” у сервісі “db” зберігає дані бази даних між запусками контейнера.

Запуск додатка

Ви можете запустити додаток у фоновому режимі, додавши опцію -d. У директорії docker-nodejs-sample виконайте наступну команду в терміналі:

docker compose up --build -d

Перевірка з'єднань

docker-compose up -d  
docker ps  
curl http://localhost:3000  
docker logs 

Відкрийте браузер і перегляньте додаток за адресою http://localhost:3000

Ви повинні побачити простий додаток для списку справ.

Підсумок

У цьому розділі ви дізналися, як контейнеризувати та запустити ваш Node.js додаток за допомогою Docker.

Ми розглянули налаштування файлу Compose для додавання імітованої бази даних і збереження даних. Ми також дізналися, як створити багатоступеневий Dockerfile та налаштувати зв'язування томів для розробки.

Дякуємо

Перекладено з: Containerize a Node.js application

Leave a Reply

Your email address will not be published. Required fields are marked *