DUICUO

Dockerを使用してNodeアプリケーションを効率的にデプロイする方法

[[339724]]

「Nodeアプリケーションを本番環境にデプロイするにはどうすればよいですか?」[1]

合理的かつ効率的な導入ソリューションは、迅速なアップグレード、スムーズな切り替え、負荷分散、アプリケーションの分離などの導入機能を実現できるだけでなく、成熟した安定した監視システムも備えています。

Kubernetes は Node アプリケーションをサーバー アプリケーションのブラック ボックスとして扱います。これは上記の条件に完全に一致しており、Kubernetes 上に Node をデプロイするチームがますます増えています。

しかしその前に、この章のトピックである Docker コンテナ上で Node アプリケーションを実行する必要があります。

シンプルなNodeアプリケーション

インデックス.js

Node WebアプリのHello, Worldバージョン

  1. const http = require( 'http' )
  2.  
  3. const app = async (req, res) => {
  4. res. end ( 'hello, world' )
  5. }
  6.  
  7. http.createServer(app).listen(3000, () => console.log(3000))

「package.json」

アプリケーションを起動するには npm start を設定します。

  1. 「スクリプト」 : {
  2. 「開始」 : 「ノード index.js」  
  3. },

しかし、これは最も単純なNodeアプリケーションに過ぎません。実際の環境では、様々なデータ保存やスケジュールされたタスク操作がありますが、ここでは割愛します。これで十分です。

もう少し複雑なNodeアプリケーションについては、Shanyueのプロジェクトwhoami[5](最小限のサーバーレスおよびdockerizeの例)を参照してください。

NODE_ENV=本番環境

本番環境では、devDependecies 内の依存関係をインストールする必要はありません。環境変数 NODE_ENV が production に設定されている場合、devDep はスキップされます。

  1. # 環境変数を設定して本番環境の依存関係のみをインストールする
  2. $NODE_ENV=本番環境 npm ci
  3.  
  4. # フラグを明示的に指定して、本番環境の依存関係のみをインストールします。
  5. $ npm ci --production  

一方、一部のサードパーティ製モジュールは、NODE_ENV環境変数に基づいて予期しない設定を行う可能性があります。そのため、本番環境ではこの環境変数の設定には注意が必要です。

Nodeアプリケーションのシンプルなデプロイメント

典型的なサーバー側 Node アプリケーションは次のように実行されます。

  1. npmインストール
  2. `npm run config` は、データベースやキャッシュのユーザー名とパスワードなどの設定ファイルを設定サービス(Consul/Vault)から取得します。この時点で、ビルドサーバーにサービス権限を設定する必要があります。
  3. `npm run migrate` はデータベース移行スクリプトを実行し、データベーステーブルの列と行を変更します。この時点で、サーバーの構築にはデータベースへのアクセス権限が必要です。
  4. `npm start` は Node サービスを開始します。

実行手順を Dockerfile に変換します。

  1. # 小さな画像ファイル(約5MB)を選択してください
  2. ノード:12-alpineから
  3.  
  4. # 環境変数を本番環境に設定する
  5. ENV NODE_ENV プロダクション
  6.  
  7. ワークディレクトリ /コード
  8.  
  9. # イメージレイヤーに基づくキャッシュをより有効に活用する
  10. package.json と package-lock.json /codeを追加します。
  11. npm ci を実行する
  12.  
  13. 追加./コード
  14.  
  15. # サービスとデータベースの移行を構成する
  16. npm run config --if-present と npm run migrate --if-present を実行します。  
  17.  
  18. エクスポーズ3000
  19. CMD npm スタート

ほとんどのNodeアプリケーションではこれで十分です。パフォーマンスを向上させたい場合は、マルチステージビルドプロセスに進むことができます。

node-gypとネイティブアドオン

Node には、Python、make、g++ に依存する node-gyp 経由でコンパイルされるネイティブ アドオンがいくつかある場合があります。

  1. $ apk --no-cache python を追加 g++ を作る 

コンパイルプロセスを伴うイメージビルドでは、ソースファイルとビルドツールの両方がスペースを無駄にします。イメージのマルチステージビルドはスペースを効率的に活用できます。このルールは、GoアプリとFEアプリのビルドにも当てはまります。

  1. Goアプリケーションを複数段階で構築する[6]
  2. 多段階フロントエンドアプリケーション構築[7]

Node アプリケーション イメージを構築する場合、イメージの最初のレイヤーを使用して node_modules が構築されます。

  1. # 小さな画像ファイル(約5MB)を選択してください
  2. node:12-alpineからビルダーとして
  3.  
  4. # 環境変数を本番環境に設定する
  5. ENV NODE_ENV プロダクション
  6.  
  7. # イメージレイヤーに基づくキャッシュをより有効に活用する
  8. package.json と package-lock.jsonを追加します
  9. npm ci を実行する
  10.  
  11. # 多段階建設の第2段階
  12. # 多段階建設の第2段階
  13. # 多段階建設の第2段階
  14. ノード:12-alpineから
  15.  
  16. ワークディレクトリ /コード
  17. ENV NODE_ENV プロダクション
  18.  
  19. 追加。 。
  20. コピー--from=builder node_modules node_modules  
  21. # サービスとデータベースの移行を構成する
  22. npm run config --if-present と npm run migrate --if-present を実行します。  
  23.  
  24. エクスポーズ3000
  25. CMD npm スタート

関連記事

  • N-APIとNode.js用Cアドオンの書き方[8]
  • 開発と本番環境でのNode.js向けDockerの使用[9]

参照

[1] Nodeアプリケーションを本番環境にデプロイするにはどうすればいいですか?

https://github.com/shfshanyue/Daily-Question/issues/420

[2] Dockerでフロントエンドをデプロイする方法:

https://shanyue.tech/frontend-engineering/docker.html

[3] PreviewとProductionのフロントエンド展開:

https://shanyue.tech/frontend-engineering/feature-deploy.html

[4] フロントエンドデプロイメントの開発プロセス:

https://shanyue.tech/フロントエンドエンジニアリング/deploy.html

[5]whoami:

https://github.com/shfshanyue/whoami

[6] Goアプリケーションを複数の段階で構築する:

https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds

[7] 多段階フロントエンドアプリケーション構築:

https://shanyue.tech/frontend-engineering/docker.html#%E5%A4%9A%E9%98%B6%E6%AE%B5%E6%9E%84%E5%BB%BA

[8]N-APIとNode.js用のCアドオンの書き方:

https://hackernoon.com/n-api-and-getting-started-with-writing-c-addons-for-node-js-cf061b3eae75

[9]開発と本番環境でのDocker for Node.jsの使用:

https://dev.to/alex_barashkov/using-docker-for-nodejs-in-development-and-production-3cgp

この記事は、WeChat公式アカウント「フルスタック成長への道」から転載したものです。以下のQRコードからアクセスできます。転載の許可については、「フルスタック成長への道」公式アカウントまでお問い合わせください。