Как Докер, так и Node.js возросла популярность за последние 5 лет. Бегом Node.js работа с контейнерами docker с помощью docker-compose для локальной разработки-это отличный опыт. В этом пошаговом руководстве мы рассмотрим, как Node.js докер и докер-компоновка с многоступенчатой сборкой докера работают синхронно. Время раскалываться.
Содержание
- Докер новая норма
- Node.js на докере с высокой масштабируемостью
- Предположения для докера с Node.js
- Шаги
- TLDR; Дайте мне быстрый обзор
- Соображения
- Вывод
Докер-новая норма
Docker изменил то, как мы, инженеры-программисты, работаем за последние 5-7 лет.
Контейнеры облегчили доставку всего стека, включая операционную систему, а не только кода.
Существует более чем одна причина для использования docker везде, особенно в среде разработки. Docker был второй по популярности платформой в опросе Stack Overflow 2020, как и в 2019 году. Это же исследование 2020 издание также цитирует
”Мы также наблюдаем некоторый рост популярности контейнерных технологий, таких как Docker и Kubernetes, из года в год».
Докером пользуются 35% всех респондентов и 39,2% профессиональных разработчиков. Можно с уверенностью сказать, что 1/3 или более инженеров-программистов используют docker. В 2020 году и далее, если вы не используете docker в качестве разработчика, вы наверняка что-то упускаете.
Node.js на докере с высокой масштабируемостью
Node.js первоначально был выпущен в 2009 году. Он использовался для веб-приложений с высоким трафиком крупными компаниями, такими как Paypal, Netflix, Ebay и LinkedIn, и это лишь некоторые из них. Он, безусловно, прошел боевые испытания за последние 10 лет и доказал свою отвагу.
Это также хорошо работает с большой командой, примером которой является Spotify. Его использовали 90 команд и 600 разработчиков в Spotify. Согласно W3tech, 1% веб-сайтов используют Node.js.
1% веб-сайтов, отслеживаемых W3tech, может показаться небольшим числом, но Node.js пользуется популярностью на сайтах с высоким трафиком, как упоминалось выше.
Благодаря высокой масштабируемости программного обеспечения на картинке становится намного проще масштабировать приложение по горизонтали с помощью Docker и Kubernetes. Мы можем сказать это, используя Докер с Node.js обеспечивает высокую масштабируемость.
Предположения для Докера с Node.js
- У вас есть некоторое представление об использовании Node.js (express js или любой другой фреймворк)
- У вас есть некоторый опыт использования Docker (предпочтительна локальная разработка, производственные среды)
- Я использую Docker версии 19.03.13 и docker-compose версии 1.27.4, надеюсь, у вас есть похожие версии.
- Для первой части этого урока мы будем использовать Node.js 8 + с установленными npm и npx.
Шаги
Давайте глубже погрузимся в пошаговые детали этого руководства о том, как запустить Node.js экспресс-демонстрационное приложение на docker с помощью docker-compose.
1. Настройте экспресс с помощью экспресс-генератора
В качестве первого шага пришло время создать голый костяк Node.js экспресс-заявка. Для создания приложения express js мы будем использовать генератор экспресс-приложений.
1.1 Используйте экспресс-генератор для создания приложения
Для создания вашей демо-версии Node.js экспресс-заявка на докера с Node.js, выполните следующие команды:Копировать
npx express-generator --view=pug express-app
Обратите внимание, что мы создаем веб-приложение, а не API, и используем pug в качестве механизма шаблонов для представлений. Это должно дать вам результат, как показано ниже:
Теперь давайте запустим приложение, чтобы посмотреть, как оно выглядит в браузере, нет Node.js на докере еще нет. Чтобы начать Node.js экспресс-приложение, пожалуйста, выполните следующие команды:Копировать
cd express-app
npm install
DEBUG=express-app:* npm start
После этого вы должны увидеть что-то вроде ниже:
Нажмите http://localhost:3000
на браузер, например Chrome, чтобы проверить, правильно ли работает приложение. Вы должны увидеть что-то похожее на это:
Когда вы попадете на домашнюю страницу браузера, вы также увидите некоторые журналы о том, сколько времени потребовалось для ответа на запрос в командной строке.
На данный момент я добавил его в git, если вы хотите просмотреть код, указанный в этом запросе на извлечение.
1.2 Отредактируйте индекс, чтобы увидеть изменения
Вы можете отредактировать страницу, чтобы сказать что-то другое, например Express on Docker
, и Let’s get started
или что-то в этом роде. Для этого нам нужно будет отредактировать 2 файла, /routes/index.js
и views/index.pug
, как показано ниже. Вы можете получить изменения в файле в этом запросе на извлечение:
Он отображается в браузере, как показано ниже:
1.3 Добавьте nodemon для отслеживания изменений и перезагрузки
Для лучшего взаимодействия с разработчиком лучше всего перезагружать сервер при изменении файла. Для достижения этой цели мы используем nodemon. Есть 2 способа использовать Nodemon. Первый способ-установить его в качестве модуля глобального узла, что приведет к глобальной nodemon
команде. Второй вариант — использовать его в качестве локальной зависимости разработчика для проекта. Мы будем использовать первый способ со следующей командой:Копировать
npm install -g nodemon; #if you don’t have nodemon installed
nodemon bin/www
После запуска индекса приложения (bin/www
в данном случае) с помощью nodemon он перезапустит сервер при каждом сохранении файла. Ниже приведен пример того, как это выглядит при перезапуске сервера при изменении кода:
На этом этапе у вас есть сгенерированный Node.js запущено экспресс-приложение. Его также можно запустить с помощью nodemon для перезапуска Node.js сервер на каждом сохраненном файле. Следующим этапом является использование Node.js на докере.
2. Используйте Node.js на Докере
Для использования Node.js в Докере мы начнем с a Dockerfile
. Согласно официальному сайту Докера:
Файл Dockerfile-это текстовый документ, содержащий все команды, которые пользователь может вызвать в командной строке для сборки изображения. С помощью сборки docker пользователи могут создавать автоматическую сборку, которая последовательно выполняет несколько инструкций командной строки.
Мы начнем с простого файла dockerfile и перейдем к многоступенчатому. Мы будем использовать многоступенчатый файл сборки, чтобы у нас была одна стадия разработки, а другая-для производства. На стадии разработки у нас будет Nodemon. Для производственного контейнера docker будет проведена некоторая оптимизация, одной из которых является отсутствие ненужного Nodemon.
2.1 Простой файл docker для локального Node.js разработка докеров
Ниже приведен простой файл настройки узла для экспресс-приложения:Копировать
FROM node:14-alpine
WORKDIR /src
COPY package.json package-lock.json /src/
RUN npm install --production
COPY . /src
EXPOSE 3000
CMD ["node", "bin/www"]
Файл dockerfile прост. Это:
- используя
node:14-alpine
в качестве отправной точки. Мы используем alpine, потому что это небольшой и безопасный базовый образ для контейнеров docker. - Сначала мы копируем файл package.json и файл блокировки
/src
в рабочий каталог, чтобы использовать кэширование сборки docker - Затем мы запускаем
npm install --production
, чтобы получить только необходимые зависимости приложений от npm - После этого наш код приложения копируется в
/src
- Следовательно, открывается порт и выполняется команда для запуска сервера
При правильном использовании кэширования докеров и набора сборок вы можете получать более быстрые сборки докеров. Чтобы создать вышеуказанный файл dockerfile в Node.js образ докера выполните следующие действия:Копировать
DOCKER_BUILDKIT=1 docker build -t nodejs-express-docker
Это займет некоторое время. После того, как это будет сделано, вы должны увидеть результат, как показано ниже:
Время для запуска образа docker и просмотра выходных данных для Node.js с Докером в браузере. Для этого выполните следующую команду:
docker run --rm --name nodejs_express -d -p 3000:3000 nodejs-express-docker
В приведенной выше команде:
--rm
используется для удаления контейнера при его остановке--name
используется для обозначения контейнера, в котором выполняется Node.js в docker он будет использоваться позже для просмотра журналов и остановки контейнера-d
используется для отсоединения процесса контейнера, отправляющего его в фоновом режиме-p 3000:3000
означает, что локальная почта 3000 сопоставлена с контейнерным портом 3000
Теперь, чтобы узнать, что контейнер запущен, выполните следующую команду:
docker ps
Вы должны увидеть что-то вроде ниже:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
930b3227688b nodejs-express-docker "docker-entrypoint.s…" 4 seconds ago Up 4 seconds 0.0.0.0:3000->3000/tcp nodejs_express
Вы можете просмотреть журналы из контейнера с помощью следующей команды:
docker logs -f nodejs_express
Это приведет к подключению командной строки (bash) к журналам контейнеров. Затем нажмите на URL http://localhost:3000
-адрес в браузере. Вы увидите несколько журналов. Нажмите Ctrl+C
, чтобы остановить просмотр журналов. Теперь вы можете остановить контейнер с помощью следующей команды:Копировать
docker stop nodejs_express
Ниже приведен краткий обзор запуска контейнера docker, просмотра журналов и его остановки:
Этот приведенный выше простой файл dockerfile также доступен в качестве запроса на извлечение для вашего удобства. На данном этапе мы можем приступить к созданию Node.js dockerfile еще лучше с многоступенчатой сборкой docker.
2.2 Многоступенчатый файл докера для поддержки докера Nodejs в производстве
Мы создадим 3 этапа из приведенного выше простого файла dockerfile. Этапы будут следующими:
- База: На этом этапе у докера будут общие черты с Node.js
- Производство: На этом этапе будут использоваться компоненты, полезные для производственной среды для Node.js на докере. Он также использует
npm ci
вместо установки npm. - Dev: На этом этапе будет nodemon, который полезен только для разработки Node.js на докере
Ниже приведен измененный файл dockerfile:Копировать
FROM node:14-alpine as base
WORKDIR /src
COPY package.json package-lock.json /src/
EXPOSE 3000
FROM base as production
ENV NODE_ENV=production
RUN npm ci
COPY . /src
CMD ["node", "bin/www"]
FROM base as dev
ENV NODE_ENV=development
RUN npm install -g nodemon && npm install
COPY . /src
CMD ["nodemon", "bin/www"]
Вы можете построить вышеописанное Node.js файл докера для запуска Node.js в докере с помощью следующей команды:Копировать
DOCKER_BUILDKIT=1 docker build --target=dev -t nodejs-express-docker-multi-stage
Добавлением здесь, в этой docker build
команде, по сравнению с приведенной выше, является включение --target=dev
. Это говорит докеру, что строить dev
сцену нельзя production
. Если вы хотите создать этот многоступенчатый файл настройки для Node.js при использовании docker --target=production
он создаст изображение docker, оптимизированное для работы.
Чтобы запустить Node.js образ докера и прикрепите к его журналам, вы можете запустить следующую команду:Копировать
docker run --rm --name nodejs_express_ms -d -p 3000:3000 -v "$(pwd)":/src nodejs-express-docker-multi-stage && docker logs -f nodejs_express_ms
Основное отличие здесь от приведенной выше команды запуска docker для Node.js с Докером так и есть -v "$(pwd)":/src
. Поскольку мы хотим, чтобы сервер перезапускался при каждом изменении файла, текущий каталог монтируется в рабочем каталоге контейнера docker. При этом при каждом изменении разъединение будет перезапускаться для Node.js на докере.
Многоступенчатый файл докера для докера с Node.js можно найти в этом запросе на извлечение. Ниже приведен краткий обзор команд для Node.js многоступенчатая сборка docker:
3. Node.js Докер стал лучше с помощью docker-compose
Как видно, нам пришлось выполнять длинные команды, как показано ниже.
docker run --rm --name nodejs_express_ms -d -p 3000:3000 -v "$(pwd)":/src nodejs-express-docker-multi-stage
Это было, мягко говоря, нелегко. Для остановки запущенного contianer также требовалась другая docker stop
команда. Решением этой проблемы является использование docker-compose с Node.js на докере. Docker compose можно эффективно использовать для объединения нескольких служб, таких как база данных с приложением Node.js контейнер докера.
С помощью docker-compose вы можете запустить приложение с помощью всего лишь одной команды, docker compose up
. Он создаст контейнеры, если они не созданы, и запустит их для вас. Далее мы посмотрим, как это сделать.
3.1 Создайте Node.js докер-создание с целью разработчика
Для начала, ниже приведен файл docker-compose.yml, который может запускать приложение в docker с помощью Node.js использование docker-создание.
version: '3.8'
services:
web:
build:
context: ./
target: dev
volumes:
- .:/src
command: npm start
ports:
- "3000:3000"
environment:
NODE_ENV: dev
В файле docker compose есть некоторые части, которые необходимо понять:
- Версия является последней по адресу
3.8
- В службах веб-служба
target:dev
отправляется так, чтобы мы создавали только для стадии разработки, а не для производства - Текущий каталог
.
смонтирован в контейнере docker/src
, поэтому изменения также будут отражены в контейнере. - Мы изменили
npm start
команду в докере с помощью Node.js для использованияnodemon
, как мы будем использовать docker compose только для разработки. - Мы передаем только одну переменную среды
NODE_ENV
, посколькуdev
другие переменные среды, например учетные данные базы данных, также могут быть переданы в качестве переменных среды.
Мы также будем использовать BUILDKIT
для создания контейнеров docker с помощью docker-compose. Чтобы использовать BUILKIT с docker-compose при создании контейнера docker, мы можем выполнить команду ниже:Копировать
COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build
Здесь вы видите результат сборки docker-compose для docker с Node.js со ВСТРОЕННЫМ набором в действии:
3.2 Запустите докер с помощью Node.js использование docker compose up
После того, как контейнеры будут построены, с ними можно будет легко работать docker-compose up
.
Node.js контейнеры docker построены, его можно запускать с docker-compose up
помощью, как показано ниже:
Изменения для добавления docker-compose содержатся в этом запросе на извлечение. Вот как ты можешь бежать Node.js на докере, который очень хорошо подходит для разработки, а также для установки контейнеров в производственную среду.
TLDR; Дайте мне быстрый обзор
Весь код находится в общедоступном репозитории github. Вы можете выполнить следующие команды, чтобы быстро приступить к работе:
- Учитывая, что вы правильно настроили git, клонируйте репозиторий с помощью:
git clone git@github.com:geshan/express-app.git
- Затем выполните
cd express-app
- После этого запуска
COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build
дождитесь завершения сборки. - Следовательно, выполните:
docker-compose up
, подождите некоторое время, чтобы увидетьnodemon starting...
на своей консоли. - После этого нажмите
http://localhost:3000
на браузер - Вы должны увидеть следующий вывод в своем браузере:
Наслаждайтесь! Теперь вы можете перепроектировать файл Dockerfile
и .docker-compose.yml
Если у вас есть какие-либо вопросы, найдите конкретную вещь, например, скажите target
в этом посте.
Соображения
Есть некоторые соображения, о которых вам следует знать:
- По моему опыту, контейнеры на производстве запускаются с помощью оркестратора, такого как Kubernetes. Я считаю, что Docker Swarm (и docker compose) в produciton к настоящему времени проиграли гонку.
- Лучше всего использовать кэширование сборки Docker и BUILDKIT для более быстрых сборок.
- Docker compose упрощает использование нескольких зависимостей от среды разработки. Для exmaple, если ваше приложение зависит от MySQL и Redis, его можно легко собрать в
docker-compose,yml
файл.
Вывод
Использование Node.js на Докере-это полезный опыт. Если вы хотите обновить Node.js, это так же просто, как изменить версию файла Docker, перестроить его и использовать. Node.js также отлично подходит для микросервисов.
Если вы хотите улучшить опыт разработчиков и удивительную масштабируемость в производстве с легкостью, начните использовать Node.js сегодня в докере.