Docker連携

Docker連携

コンテナを使用していますか?私たちがサポートします。本番環境でNode.jsを最大限に活用するための完璧なコンパニオンであるpm2-runtimeを今すぐ使い始めましょう。

pm2-runtimeの目標は、アプリケーションを適切なNode.js本番環境にラップすることです。コンテナ内でNode.jsアプリケーションを実行する際の主要な問題を解決します。例えば、

  • 高いアプリケーション信頼性のためのセカンドプロセスフォールバック
  • プロセスフロー制御
  • アプリケーションを常に正常で高性能に保つための自動アプリケーション監視
  • 自動ソースマップ検出と解決のサポート

さらに、コンテナとアプリケーションの間にPM2をレイヤーとして使用することで、アプリケーション宣言ファイルカスタマイズ可能なログシステム、および本番環境でNode.jsアプリケーションを管理するためのその他の優れた機能など、PM2の強力な機能がもたらされます。

コンテナ内でPM2を使用する

Dockerfileに次の行を追加してPM2をインストールします

RUN npm install pm2 -g

次に、node バイナリを pm2-runtime に置き換えます

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

次のように変更します

CMD ["pm2-runtime", "app.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 clusterとnuxtjsを一緒に使用する

クラスタモードでpm2を実行すると、nuxtjsがrootDirを解析する方法により、ecosystem.config.jsがcwdパスに追加されます。これを修正するには、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は1600ミリ秒待ってから、最終的なSIGKILLシグナルを送信します。アプリケーション設定ファイル内でkill_timeoutオプションを設定することで、この遅延を変更できます。

アプリケーションの状態管理の詳細については、こちらをご覧ください

開発環境

開発、テスト、本番環境間で一貫した環境を維持するために、開発者にコンテナ内でプログラミングするように指示することがあります。

pm2-runtimepm2-devに置き換えると、監視と再起動機能が有効になります。これは、ホストファイルがVOLUMEとしてコンテナに公開されている場合、開発コンテナでは非常に興味深いものです。

PM2.ioの使用

Keymetrics.ioは、PM2上に構築された監視サービスであり、アプリケーションの監視と管理(ログ、再起動、例外監視など)を容易にします。Keymetricsでバケットを作成すると、公開鍵と秘密鍵が取得されます。

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 runコマンドを介して

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
このページに貢献する