Развертывание приложения Node.js с помощью Docker: пошаговая инструкция

Браузеры постоянно обновляются, и для успешного запуска приложения важно учитывать множество факторов, в том числе программные зависимости или переменные среды. Чтобы гарантировать стабильную работу проекта и удовлетворение потребностей пользователей, программное обеспечение должно быть установлено и настроено правильно.

Вручную выполнять и проверять настройки слишком сложно и долго, намного эффективнее и удобнее автоматизировать процессы, используя Node.js. В этой статье мы рассмотрим, что это такое Node.js и Docker, зачем они нужны и как пользоваться этими инструментами.

Что такое Node.js?

Node.js — это прикладная платформа, позволяющая разработчикам быстро и легко создавать веб-приложения.

Мощная среда выполнения JavaScript с открытым исходным кодом существует с 2009 года, представляет собой кроссплатформенную среду исполнения, основанную на движке Chrome V8. Это означает, что она может работать на любой операционной системе, поддерживающей движок Chrome V8, включая платформы Windows, MacOS, Linux и Unix.

В Node реализована событийно-ориентированная архитектура, позволяющая создавать программы с высокой масштабируемостью и скоростью. Он также включает несколько встроенных библиотек JavaScript для сетевого программирования, таких как http-сервер и сетевые модули, например модули net и dns, для связи между различными компьютерами или устройствами через сетевое соединение.

Самое лучшее в Node — это его лёгкость, что делает его идеальным для создания небольших приложений с минимальными усилиями. Поскольку он работает асинхронно в собственной однопоточной среде, выполнение кода происходит гораздо быстрее, чем в традиционных фреймворках для веб-разработки. Инструмент может обрабатывать несколько запросов одновременно, не порождая каждый раз новые потоки, а также позволяет выполнять задачи одновременно, чтобы еще больше увеличить производительность и снизить накладные расходы.

Node имеет обширную библиотеку модулей, позволяющих разработчикам быстро и легко внедрять в свои проекты специфические функции, не начиная работу с нуля, что значительно облегчает жизнь при создании современных веб-приложений. А менеджер пакетов Node npm обеспечивает легкий доступ к сотням тысяч дополнительных бесплатных пакетов в рамках процветающей экосистемы, что позволяет сократить время разработки и повысить ее качество в целом.

Сочетание высокой производительности, масштабируемости, надежности, гибкости и простоты использования Node делает его популярным среди разработчиков программного обеспечения во многих отраслях.

Зачем нужен Docker?

Docker — технология контейнеров приложений, обеспечивающая легкий и портативный способ разработки, развертывания и запуска приложений. Это популярная платформа с открытым исходным кодом для работы в облаке или локальной среде.

Он обладает целым рядом преимуществ по сравнению с традиционными решениями виртуализации.

  • Контейнеры Docker гораздо легче виртуальных машин, благодаря чему удаётся значительно сокращает время, необходимое для запуска новых приложений на существующей инфраструктуре.
  • Docker упрощает процесс разработки. Можно запускать несколько изолированных приложений на одном хосте, при этом обеспечивается согласованность работы приложений на разных платформах. Это означает, что пользователи могут написать код один раз и развернуть его универсально на любой платформе.
  • Благодаря реестру библиотек образов пользователи могут быстро находить готовые образы, созданные другими пользователями или организациями, которые соответствуют их потребностям, что экономит время при настройке собственных сред или быстром развертывании новых приложений.
  • Любые обновления одного контейнера затрагивают все остальные, поскольку контейнеры работают под управлением одной и той же операционной системы. Это избавляет от необходимости обновлять каждый контейнер по отдельности, а значит, экономит не только время, но и ресурсы, связанные с использованием памяти.
  • Docker обеспечивает повышенную безопасность, поскольку каждое приложение изолировано от базовой инфраструктуры, а уязвимости в одном приложении не относятся к другому. Такой подход позволяет компаниям сохранять контроль над своими приложениями и при этом сокращать расходы на их обслуживание.
  • Благодаря простому в использовании интерфейсу Docker разработчики могут создавать собственные образы, которые можно повторно использовать в разных проектах, что обеспечивает максимальную надёжность. Это обеспечивает гибкость, поскольку каждое приложение запускается в своей собственной виртуальной среде с необходимыми зависимостями.

Совокупность этих преимуществ делает Docker отличным выбором для команд разработчиков ПО, которые ищут эффективное решение, не требующее дополнительной установки и настройки, но при этом способное обеспечить высокий уровень производительности при масштабировании без ущерба для безопасности и стабильности при одновременном запуске множества сервисов.

Что нужно перед началом работы

Первым делом нужно установить ПО на компьютер. Воспользуйтесь официальными ресурсами для скачивания.

https://nodejs.org/en

https://www.docker.com/

Также вам могут пригодиться фреймворки и дополнительные инструменты для Node.js: Express, Meteor, Koa, Next.js, Micro, Socket.io.

Развертывание приложения Node.js

Процесс состоит из нескольких шагов, разберём их с примерами.

  1. Создаём приложение в Node.js.

Сначала нужно настроить конфигурации и зависимости.

Создаём каталог с исходными файлами, где «node_app» - его название.

mkdir node_app

В нашем примере он корневой, переходим в него.

cd node_app

Создаём и открываем конфигурационный файл, оставляя в нём стандартные данные.

nano package.json

Обратите внимание на зависимость dependencies, где должен быть указан сетевой фреймворк Express.

Сохраняем и закрываем файл, а затем устанавливаем зависимости.

npm install

Исходный код приложения имеет следующую структуру.

timeweb.js — точка входа;

index.html — разметка веб-страницы.

В настоящих приложениях визуальное описание страничек находится в различных файлах, например, style.css. В нашем примере, чтобы ничего не усложнять, мы представим CSS-стили в HTML.

Создаём и открываем файл, в котором представлен минимальный код, необходимый для запуска сервера.

nano timeweb.js

Готово. Переходим к следующему этапу.

  1. Создаем Dockerfile

Dockerfile — это текстовый файл, который содержит инструкции для создания Docker-образа. Он является основным компонентом в процессе создания и управления контейнерами с использованием Docker. Он предоставляет возможность автоматизировать процесс сборки образа, что позволяет легко масштабировать и развертывать приложения в контейнерах. В нем можно указывать все необходимые зависимости, настройки окружения и команды для запуска приложения.

Инструкции из Dockerfile имеют вид «название и аргументы». Если необходимы комментарии, их ставят после символа #. Важно, что все инструкции выполняются в строгой последовательности, предусмотренной в файле.

Итак, с помощью следующей команды создаём и открываем Dockerfile.

nano Dockerfile

  • Установка образа Node.js

В первую очередь, Dockerfile определяет базовый образ, на основе которого будет создан новый. Он может быть официальным от Docker или пользовательским, созданным заранее.

Добавляем в Dockerfile инструкцию для использования Node.

FROM node:19-alpine

  • Установка рабочего каталога

Образ в дальнейшем станет контейнером, для него нужно прописать, откуда брать команды. Используем следующую инструкцию.

WORKDIR /app

  • Копирование конфигурационных файлов

На компьютере уже есть нужные для работы файлы, остаётся их перенести в файловую систему контейнера. Пишем команду с перечислением соответствующих фацлов.

COPY package.json package-lock.json ./

Для остальных файлов тоже актуальна команда COPY, при этом следует указать директорию, а не сам файл.

  • Установка зависимостей NPM

У нас есть возможность получить зависимости из реестра NPM.

RUN npm install

Также можно ввести сразу несколько команд в таком виде.

RUN [“command1”, “command2”, “command3”]

  • Запуск приложения.

CMD npm start

Эта инструкция применяется, когда контейнер уже задействован.

  1. Создаем образ Docker

В Dockerfile есть описание, на базе которого формируется образ Docker. Нам нужно задать команду из корня каталога.

docker build . -t nodeproject

В данном случае -t устанавливает имя тега нового образа, в будущем он будет доступен по nodeproject:latest.

Выполняем проверку.

docker images nodeproject:latest

Если название не писать, система выдаст сведения обо всех существующих образах.

  1. Запуск контейнера Docker

Образы возможно запускать в виде контейнеров, указывая их название.

docker run nodeproject

В этом случае образ запускается как отдельный процесс системы. Желательно открывать его в фоновом режим.

docker run -d nodeproject

Контейнер будет запущен в автономном режиме, сформировав длинный идентификатор. Его можно применять в других командах.

Перед запуском целесообразно проверять, был ли уже запущен контейнер или нет.

docker ps

В результате отобразится отчёт о выполненной операции.

Контейнер можно остановить. Вместе «name» укажите актуальное название.

docker stop name

Чтобы удалить его, введите следующую команду, также заменив название.

docker rm name

Логи автономного контейнера

Чтобы посмотреть логи в терминале, нужно ввести команду.

docker logs myname

Как повысить эффективность работы

Для успешного использования Docker необходим надежный сервер, который будет обеспечивать требуемые ресурсы и производительность. Именно поэтому многие разработчики предпочитают взять в аренду сервер dedicated.

Это выделенный физический сервер, который полностью находится в распоряжении одного пользователя или организации. Это означает, что вы получаете полный доступ к ресурсам этого сервера и можете настроить его под свои нужды.

Сервер dedicated обеспечивает высокую производительность благодаря отсутствию других пользователей, которые могут влиять на работу вашего приложения. Это особенно важно для приложений Node.js, которые требуют большого количества ресурсов. Вы полностью контролируете сервер и можете настроить его под свои нужды. Вы можете выбрать операционную систему, в том числе Linux, установить необходимое ПО и настроить сетевые параметры.

Подведём итоги

Мы рассмотрели несколько команд и инструкций для создания приложения, Dockerfile и образа, а также запуска контейнеров и дальнейшей работы с ними. Использование Dockerfile позволяет автоматизировать процесс развертывания приложений и упростить работу разработчикам, особенно при использовании сервера dedicated.

Всё ещё остались вопросы?