programing

pm2와 도커를 함께 사용하는 이유는 무엇입니까?

padding 2023. 9. 5. 19:45
반응형

pm2와 도커를 함께 사용하는 이유는 무엇입니까?

우리는 서버에서 앱을 실행하기 위해 pm2를 꽤 성공적으로 사용하고 있습니다.우리는 현재 도커로 이동 중이며 http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/ 을 보았습니다.

하지만 실제로 두 가지를 함께 사용하는 이유는 무엇입니까?도커는 pm2가 제공하는 모든 것을 제공하지 않습니까?

일반적으로 도커 내부에서 pm2를 사용하는 것은 의미가 없습니다.

PM2와 Docker는 모두 프로세스 관리자이며 로그 포워딩, 충돌한 작업자 재시작 및 기타 많은 작업을 수행할 수 있습니다.도커 컨테이너 내부에서 pm2를 실행하면 서비스와 관련된 잠재적인 문제를 숨길 수 있습니다. 최소한 다음과 같습니다.

pm2를 사용하여 컨테이너당 단일 프로세스를 실행하면 메모리 소비가 증가하는 것 외에는 많은 것을 얻을 수 없습니다.재시작 정책이 있는 순수 도커로 재시작을 수행할 수 있습니다.다른 도커 기반 환경(예: ECS 또는 Kubernetes)에서도 이 작업을 수행할 수 있습니다.

여러 프로세스를 실행하면 모니터링이 더 어려워집니다.CPU/메모리 메트릭은 더 이상 인클로저 환경에서 직접 사용할 수 없습니다.

단일 PM2 프로세스에 대한 상태 점검 요청이 작업자에게 분산되어 비정상적인 대상을 숨길 가능성이 높습니다.

작업자 충돌은 pm2에 의해 숨겨집니다.모니터링 시스템(CloudWatch 등)에서는 이러한 시스템에 대해 거의 알 수 없습니다.

로드 밸런싱은 사실상 여러 수준의 로드 밸런싱을 수행하게 되므로 더욱 복잡해집니다.

또한 도커 컨테이너 내부에서 여러 프로세스를 실행하는 것은 컨테이너당 하나의 프로세스를 유지하는 도커의 철학에 위배됩니다.

제가 생각할 수 있는 한 가지 시나리오는 도커 환경에 대한 제어가 매우 제한적인 경우입니다.이 경우 pm2를 실행하는 것이 작업자 스케줄링을 제어할 수 있는 유일한 옵션일 수 있습니다.

업데이트:

도커 내부에서 pm2를 사용하는 것에 찬성하지 않을 수도 있지만 때때로 애플리케이션 요구 사항이 다르며 하나의 도커 컨테이너에서 두 개의 nodejs 애플리케이션을 실행해야 할 수도 있습니다. 따라서 동일한 컨테이너에서 프런트엔드 및 백엔드 애플리케이션을 실행하려면 pm2의 경우 다른 해결 방법이 잘 작동합니다.

이제 포그라운드에서 도커 프로세스를 실행하는 pm2-runtime이 있습니다. 애플리케이션은 pm2로 포그라운드를 실행하고 pm2 없이 실행하는 것과 동일한 결과를 기대할 수 있습니다.

그래서 pm2-run time으로.

  • Docker 컨테이너에서 여러 노드 응용 프로그램을 실행할 수 있습니다.
  • 지금 응용 프로그램을 실행할 수 있습니다.
  • 주요 메트릭과 통합할 수 있습니다.
  • 사용자 지정 메트릭을 생성합니다.
  • 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 형식의 에코시스템 파일을 만들 수도 있습니다.예:

이렇게 하면 컨테이너가 여러 nodejs를 처리하여 실행할 수 있습니다.

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 위에 구축된 모니터링 서비스로, 애플리케이션을 쉽게 모니터링하고 관리할 수 있습니다(실행, 재시작, 예외 모니터링 등).키 메트릭에 버킷을 생성하면 공용 키와 비밀 키를 얻을 수 있습니다.

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 서버가 다운될 때마다 컨테이너가 중지됩니다. 이는 기본 프로세스가 중단되고 해당 프로세스가 컨테이너의 기본 프로세스로 포그라운드에 있어야 하기 때문입니다.

그래서 궁극적으로 그것을 위한 pm2가 있습니다.이것이 당신이 pm2와 supervisor를 함께 사용할 수 있는 방법입니다.

예를 찾는 경우 도커 파일 및 필수 구성 파일이 여기 있습니다.2MB의 가장 가벼운 알파인 이미지를 사용합니다.

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

supervisor.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

로드 밸런서 없이 단일 인스턴스에서 AWS Elastic Beanstalk를 실행할 때 유용할 수 있습니다.

로드 밸런서를 사용하지 않고 EB를 사용하는 경우 도커 컨테이너에 치명적인 오류가 있으면 EB가 종료되고 EB가 재시작되지 않고 이 항목에 대한질문에서 설명한 바와 같이 손상된 앱이 남아 있습니다.컨테이너에서 pm2를 실행하면 이를 방지하고 컨테이너가 자동으로 재시작됩니다.

이제 질문은 "도커 없이 pm2를 사용할 수 없을까요?"가 됩니다.정답은 '예'이지만 도커가 제공하는 추상화의 이점을 누릴 수 있으므로 도커와 pm2를 모두 사용하는 것이 타당할 수 있습니다.

언급URL : https://stackoverflow.com/questions/51191378/what-is-the-point-of-using-pm2-and-docker-together

반응형