В Docker NodeJS приложения разворачиваются одной командой из Dockerfile. Все, что требуется — файлы проекта и установленный на сервере Docker. Разберем Dockerfile для такого приложения.
Убеждаемся в том что на сервере установлен Docker и сервис запущен.
Запрашиваем его статус:
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:
Если приложение должно работать в Production и быть доступно пользователям — также требуется создать контейнер с каким-либо веб-сервером. Обычно это Nginx. И перенаправлять запросы с 80 и 443 портов на порт 3000 на котором запускается NodeJS.
Сборку контейнера Nginx тоже лучше выполнять через Dockerfile, но можно собирать контейнер и в консоли (пример).
Также Nginx с настройками для проксирования можно запустить в хост системе не используя для этого Docker.
Принципы управления Docker контейнерами разобраны в отдельной статье.