Docker контейнер для проекта на NodeJS


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



Убеждаемся в том что на сервере установлен Docker и сервис запущен.

Запрашиваем его статус:

Docker NodeJS


Docker NodeJS приложения


Создаем Dockerfile, в котром будет задаваться последовательность команд. Dockerfile позволит автоматизировать процесс и не выполнять все команды поочередно в консоли.

mcedit Dockerfile

FROM node:6
RUN mkdir -p /var/project
COPY /home/myrepo/ /var/project
WORKDIR /var/project
RUN npm install --production
ENV PORT 3000
EXPOSE $PORT
CMD ["npm", "start"]


За основу файла берется образ node с dockerhub, это базовый образ, в файле он определяется директивой FROM.



Под проект подготавливаем каталог. Создаем его (RUN mkdir -p в Dockerfile, затем копируем содержимое из директории /home/myrepo/. И назначаем каталог рабочим указывая его как WORKDIR.



После этого устанавливаем зависимости npm install --production (они как для любого проекта на NodeJS заданы в файле package.json в WORKDIR)



Определяем порт, пробрасываем его вовне контейнера и запускаем приложение через npm start


Это всё что требуется. Собираем контейнер задавая имя my-node

docker build -t my-node .



Точка в конце говорит о том, что использовать нужно Dockerfile в текущем каталоге



Затем запускаем обращаясь к контейнеру по имени

docker run my-node

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

Например http://123.123.123.123:3000



Запущенный на порту 3000 сервис можно увидеть в выводе netstat:

nodejs 3000 port


Если приложение должно работать в Production и быть доступно пользователям — также требуется создать контейнер с каким-либо веб-сервером. Обычно это Nginx. И перенаправлять запросы с 80 и 443 портов на порт 3000 на котором запускается NodeJS.



Сборку контейнера Nginx тоже лучше выполнять через Dockerfile, но можно собирать контейнер и в консоли (пример).

Также Nginx с настройками для проксирования можно запустить в хост системе не используя для этого Docker.



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

Сказать спасибо