какой смысл использовать pm2 и docker вместе?

Мы успешно используем pm2 для запуска приложений на наших серверах. В настоящее время мы переходим в докер, и мы увидели http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/

Но какой смысл на самом деле использовать оба вместе? Docker не предоставляет все, что делает pm2?

Ответ 1

Обычно нет смысла использовать pm2 внутри докера.

Как PM2, так и Docker являются менеджерами процессов, и они оба могут выполнять пересылку журналов, перезапускать сбойные рабочие и многое другое. Если вы запустите pm2 внутри докера, вы сможете скрыть потенциальные проблемы с вашим сервисом, по крайней мере, следующие:

1) Если вы запустите один процесс для каждого контейнера с pm2, вы не получите много, кроме увеличения потребления памяти. Перезапуск может быть выполнен с помощью чистого докера с политикой перезапуска. Другие докер-ориентированные среды (например, ECS или Kubernetes) также могут это делать.

2) Если вы запустите несколько процессов, вы усложните мониторинг. Метрики ЦП/Память больше не доступны напрямую для вашей окружающей среды.

3) Запросы на проверку работоспособности для одного процесса PM2 будут распределены по работникам, что может скрыть нездоровые цели

4) Сбои рабочих скрыты pm2, вы вряд ли когда-либо узнаете о них из вашей системы мониторинга (например, CloudWatch)

5) Балансировка нагрузки становится более сложной, поскольку у вас фактически будет несколько уровней балансировки нагрузки.

Кроме того, запуск нескольких процессов внутри контейнера Docker противоречит философии Docker по сохранению одного процесса на контейнер.

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

Ответ 2

обновление:

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

Итак, теперь у нас есть pm2-runtime, который запускает процесс докера на переднем плане, ваше приложение будет работать на переднем плане с pm2, и вы можете ожидать того же результата, что и без pm2.

Так что с pm2-run time

  • Вы можете запустить приложение с несколькими узлами в контейнере Docker
  • Теперь вы можете запустить приложение на переднем плане
  • Вы можете интегрировать с ключевыми показателями
  • Вы производите пользовательские метрики
  • такое же поведение контейнера, как и у pm2, но с pm2 обладает некоторыми этими преимуществами.
  • Теперь вы можете управлять поведением перезапуска (если сбой процесса, pm2 выполнит автоматический перезапуск, если он отключен, контейнер будет остановлен)
  • В среде разработки, такой как монтирование, вам не нужно перезапускать контейнер, а просто перезапустить процессы pm2 pm2 restart all, что сэкономит время разработки.
FROM node:alpine
RUN npm install pm2 -g
CMD ["pm2-runtime", "app.js"]

или если вы хотите запустить приложение с несколькими узлами в контейнере, вы можете обработать файл .yml

FROM node:alpine
RUN npm install pm2 -g
CMD ["pm2-runtime", "process.yml"]

файл process.yml Вы также можете создать файл экосистемы в формате YAML. Пример:

Это позволит контейнеру выполнять несколько обработанных узлов.

apps:
  - script   : ./api.js
    name     : 'api-app'
    instances: 4
    exec_mode: cluster
  - script : ./worker.js
    name   : 'worker'
    watch  : true
    env    :
      NODE_ENV: development
    env_production:
      NODE_ENV: production

Если вы хотите работать с Keymetrics.

Keymetrics.io - сервис мониторинга, построенный на основе PM2, который позволяет легко контролировать и управлять приложениями (журналы, перезапуск, исключения мониторинг...). Как только вы создали Bucket on Keymetrics, вы получите открытый и секретный ключ.

enter image description here

FROM node:alpine
RUN npm install pm2 -g
CMD ["pm2-runtime", "--public", "XXX", "--secret", "YYY", "process.yml"]

Отключить автоматический перезапуск:

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

FROM node:alpine
RUN npm install pm2 -g
CMD ["pm2-runtime","app.js","--no-autorestart"]

Без PM2 времени выполнения

Как правило, только один процесс на контейнер. Помня об этом, вы запускаете свой процесс внутри контейнера, используя node start server.js, как вы это делали без докера. Что произойдет здесь, если сбой сервера nodejs? ваш контейнер будет убит в этом случае. какой из них следует избегать.

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

Так что в конечном итоге для этого есть pm2. Вот как вы можете использовать pm2 и supervisord вместе, чтобы достичь этого.

Если вы также ищете пример, вот файл dockerfile и требуемый файл конфигурации. Используя самое легкое альпийское изображение размером 2 Мб.

FROM alpine:3.7
COPY supervisord.conf /etc/supervisord.conf
#installing nodejs and supervisord
RUN apk add  --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.7/main/ \
    --repository http://dl-cdn.alpinelinux.org/alpine/v3.7/community/ \  
   sudo supervisor nodejs>=8 
RUN npm i pm2  -g
COPY pm2.conf  /etc/supervisord.d/pm2.conf

supervisord.conf

[unix_http_server]
file = /tmp/supervisor.sock
chmod = 0777
chown= nobody:nogroup

[supervisord]
logfile = /tmp/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = /tmp/supervisord.pid
nodaemon = true
umask = 022
identifier = supervisor

[supervisorctl]
serverurl = unix:///tmp/supervisor.sock

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[include]
files = /etc/supervisord.d/*.conf

pm2.conf

    [supervisord]
    nodaemon=true

    [program:pm2]
    command:pm2 start pm2_processes.yml --no-daemon
    startretries:5