Ця стаття проведе вас через процес контейнеризації та запуску Node.js додатку.
Чому ми віддаємо перевагу контейнеризації коду додатка?
Контейнеризація додатка має численні переваги, які вирішують різні проблеми, з якими стикаються розробники та команди DevOps при розгортанні, запуску та масштабуванні додатків. Ось чому контейнеризація є цінною практикою:
- Узгодженість середовищ, 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
Ось які файли повинні бути в каталозі проекту:
У файлі 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