Docker 整合

Docker 整合

使用容器?我們支持您。立即開始使用 pm2-runtime,這是充分利用 Node.js 生產環境的完美搭檔。

pm2-runtime 的目標是將您的應用程式包裝到適當的 Node.js 生產環境中。它解決了在容器內執行 Node.js 應用程式時的主要問題,例如

  • 高應用程式可靠性的第二個程序備援
  • 程序流程控制
  • 自動應用程式監控,以保持其始終正常且效能良好
  • 自動原始碼對應發現和解析支援

此外,將 PM2 用作容器和應用程式之間的層,可帶來 PM2 強大的功能,例如 應用程式宣告檔可自訂的記錄檔系統 和其他強大的功能,用於在生產環境中管理您的 Node.js 應用程式。

在容器內使用 PM2

在您的 Dockerfile 中新增這行來安裝 PM2

RUN npm install pm2 -g

然後將 node 二進位檔替換為 pm2-runtime

CMD ["node", "app.js"]

CMD ["pm2-runtime", "app.js"]

您現在已全部設定完畢!您的 Node.js 應用程式現在已包裝到適當的 Node.js 生產環境中。

啟動組態檔

您可以將原始 Node.js 應用程式宣告到組態檔(或程序檔)中,並設定一些組態變數,例如啟用叢集模式,而不是使用 PM2 執行原始 Node.js 應用程式。

讓我們建立一個 ecosystem.config.js 檔,其中包含此內容

module.exports = [{
  script: 'app.js',
  name: 'app',
  exec_mode: 'cluster',
  instances: 2
}, {
  script: 'worker.js',
  name: 'worker'
}]

所有可用的選項 在此列出

然後您可以用此取代 CMD 指令

CMD ["pm2-runtime", "process.yml"]

若要將每個程序分割到自己的 Docker 中,可以使用 –only [app-name] 選項

CMD ["pm2-runtime", "process.yml", "--only", "APP"]

將 exec_mode 集群與 nuxtjs 一起使用

在叢集模式下執行 pm2 時,ecosystem.config.js 會附加到您的 cwd 路徑,這是因為 nuxtjs 分析其 rootDir 的方式,若要修正此問題,您必須在 args 區段中指定設定檔路徑

module.exports = {
  apps: [
    {
      name: 'my-nuxtjs-app',
      exec_mode: 'cluster',
      instances: 2,
      cwd: '/var/www',
      script: './node_modules/nuxt-start/bin/nuxt-start.js',
      args: '-c /var/www/nuxt.config.js'
    }
  ]
}

記錄格式選項

如果您想變更記錄輸出格式,您可以選擇下列其中一個選項

  • –json:將以 JSON 格式 (logstash) 輸出記錄
  • –format:將以 = 樣式格式輸出記錄
  • –raw:將按原樣輸出記錄

若要使用其中一個旗標,您只需要將它們傳遞給 pm2-runtime

CMD ["pm2-runtime", "--json", "process.yml"]

啟用優雅關閉

當容器收到關閉訊號時,PM2 會將此訊號轉發到您的應用程式,允許關閉所有資料庫連線,等待所有查詢已處理完畢或在成功優雅關閉之前已完成任何其他最終處理。

擷取關閉訊號非常簡單。您需要在 Node.js 應用程式中新增一個偵聽器,並在停止應用程式之前執行任何必要的動作

process.on('SIGINT', function() {
   db.stop(function(err) {
     process.exit(err ? 1 : 0);
   });
});

預設情況下,PM2 會在傳送最後一個 SIGKILL 訊號之前等待 1600 毫秒。您可以透過在應用程式設定檔中設定 kill_timeout 選項來修改此延遲。

在此處閱讀更多關於應用程式狀態管理的資訊 here

開發環境

您可能希望告訴開發人員在容器內進行程式設計,以在開發、測試和製作之間保持一致的環境。

pm2-runtime 替換為 pm2-dev 將啟用監控和重新啟動功能。當主機檔案以 VOLUME 的形式公開給容器時,這在開發容器中非常有趣。

使用 PM2.io

Keymetrics.io 是一個建置在 PM2 之上的監控服務,可輕鬆監控和管理應用程式 (記錄、重新啟動、例外狀況監控等)。在 Keymetrics 上建立一個 Bucket 之後,您將取得一個公開金鑰和一個私密金鑰。

若要使用 pm2-runtime 啟用 Keymetrics 監控,您可以使用 CLI 選項 –public XXX–secret YYY,或傳遞環境變數 KEYMETRICS_PUBLICKEYMETRICS_SECRET

透過 Dockerfile 使用 CLI 選項的範例

CMD ["pm2-runtime", "--public", "XXX", "--secret", "YYY", "process.yml"]

或透過環境變數

ENV PM2_PUBLIC_KEY=XXX
ENV PM2_SECRET_KEY=YYY

或透過 Docker 執行指令

docker run --net host -e "PM2_PUBLIC_KEY=XXX" -e "PM2_SECRET_KEY=XXX" <...>

pm2-runtime 助手

以下是 pm2-runtime 助手

>>> pm2-runtime -h

  Usage: pm2-runtime app.js

  pm2-runtime is a drop-in replacement node.js binary with some interesting production features

  Options:

    -V, --version              output the version number
    -i --instances <number>    launch [number] of processes automatically load-balanced. Increase overall performances and performance stability.
    --secret [key]             [MONITORING] keymetrics secret key
    --public [key]             [MONITORING] keymetrics public key
    --machine-name [name]      [MONITORING] keymetrics machine name
    --raw                      raw log output
    --json                     output logs in json format
    --format                   output logs formatted like key=val
    --delay <seconds>          delay start of configuration file by <seconds>
    --web [port]               launch process web api on [port] (default to 9615)
    --only <application-name>  only act on one application of configuration
    --no-auto-exit             do not exit if all processes are errored/stopped or 0 apps launched
    --env [name]               inject env_[name] env variables in process config file
    --watch                    watch and restart application on file change
    --error <path>             error log file destination (default disabled)
    --output <path>            output log file destination (default disabled)
    -h, --help                 output usage information


  Commands:

    *
    start <app.js|json_file>  start an application or json ecosystem file
為此頁面做出貢獻