Docker で Node Server を効率的にデプロイする方法

Docker で Node Server を効率的にデプロイする方法

[[419575]]

みなさんこんにちは。Shanyueです。

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

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

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

"目次"

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

2. NODE_ENV = 本番環境

3. ノードサービスイメージ

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

5. 関連記事

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

土が集まって砂が作られ、羽が集まってコートが作られます。まずは、Node Server の Hello World バージョンから始めましょう。

  1. 定数 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))

Node Server を起動する場合、実稼働環境では前提条件が多数あり、単純な node index.js だけではサービスを開始できません。

このとき、package.json に抽象レイヤーが追加され、npm start を通じてサービスが起動されるため、Docker イメージ内での起動コマンドの設定が容易になります。

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

しかし、これは最も単純な Node アプリケーションにすぎません。実際の環境では、データの保存やタスクのスケジュール設定など、さまざまなことが行われていますが、それは今は置いておきます。今のところこれで十分です。

2. NODE_ENV = 本番環境

実稼働環境では、ビルド プロセスがない場合、devDependencies に依存関係をインストールする必要はありません。 NODE_ENV 環境変数を production に設定すると、devDependencies のインストールがスキップされます。

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

一方、「一部のサードパーティ ライブラリは、NODE_ENV 環境変数に基づいて予期しない構成を作成します。」したがって、本番環境ではこの環境変数の構成に注意してください。

3. ノードサービスイメージ

典型的なサーバー指向の Node サービスは次のように実行されます。

  • npmインストール
  • npm run config は、データベースやキャッシュ アカウントのパスワードなどの構成を構成サービス (consul/vault) から取得します。この時点で、ビルドサーバーには構成サービス権限が必要です
  • npm run migrate、データベース移行スクリプトは、データベーステーブルの列行変更操作を実行します。この時点で、ビルドサーバーにはデータベースアクセス権が必要です。
  • npm start、Node サービスを起動します

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

  1. # 小さい画像を選択してください(約5MB)
  2. ノード:12-alpineから
  3.  
  4. # 環境変数は本番環境に設定されます。この環境変数が設定されている場合、devDependencies 内の依存関係はダウンロードされません。
  5. # devDependenciesをダウンロードする必要がある場合は、このコマンドをRUN npm ciの後に移動します
  6. ENV NODE_ENV プロダクション
  7.  
  8. WORKDIR /コード
  9.  
  10. # まず、イメージレイヤーに基づいてキャッシュをより有効活用するために package.json を追加します
  11. # package.jsonが変更されていない場合、node_modulesは再利用されるため、キャッシュを使用できます。
  12. package.json package-lock.json /codeを追加します
  13.  
  14. # npm ciとyarnを検討する
  15. npm i を実行する
  16.  
  17. #画像をコードに挿入する
  18. ./コードを追加
  19.  
  20. #サービスとデータベースの移行を構成する
  21. npm run config --if-present と npm run migrate --if-present を実行します。  
  22.  
  23. エクスポーズ3000
  24.  
  25. # ノードサーバーを起動する
  26. CMD npm スタート

これはほとんどの Node アプリケーションには十分です。マルチステージビルドの最適化を継続していきます。

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

Node の一部の依存関係はネイティブ アドオンとして存在し、node-gyp を介してコンパイルされ、python、make、g++ に依存します。

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

コンパイル プロセスによるイメージ構築では、ソース ファイルとビルド ツールの両方がスペースの無駄を引き起こします。

画像の「多段階構成」により、スペースを効率的に活用できます。 Go 言語やフロントエンド関連の構築もこのルールに従います。

  • Goアプリケーションの多段階構築
  • フロントエンドアプリケーションの多段階構築

Node アプリケーション イメージをビルドする場合、第 1 層のイメージはさまざまなビルド ツールを使用して node_modules を構築し、第 2 層のイメージは第 1 層のイメージによって構築された node_modules を使用します。

  1. # 小さい画像を選択してください(約5MB)
  2. node:12-alpineからビルダーとして
  3.  
  4. # 環境変数は本番環境に設定されます
  5. ENV NODE_ENV プロダクション
  6.  
  7. # 特別な依存ライブラリのコンパイル環境を準備する
  8. apk --no-cache add python make g++ を実行します。  
  9.  
  10. # イメージレイヤーに基づくキャッシュのより良い利用
  11. package.json と package-lock.jsonを追加します
  12. npm i を実行する
  13.  
  14. # マルチステージビルドの第2ステージ
  15. # マルチステージビルドの第2ステージ
  16. # マルチステージビルドの第2ステージ
  17. ノード:12-alpineから
  18.  
  19. WORKDIR /コード
  20. ENV NODE_ENV プロダクション
  21.  
  22. 追加。 。
  23. コピー--from=builder node_modules node_modules  
  24. #サービスとデータベースの移行を構成する
  25. npm run config --if-present と npm run migrate --if-present を実行します。  
  26.  
  27. エクスポーズ3000
  28. CMD npm スタート

5. 関連記事

  • N-API と Node.js 用 C アドオンの作成の開始
  • 開発と本番環境での Node.js 用 Docker の使用

<<:  クラウド データベースの選択に必読: 要件を整理するにはどうすればよいでしょうか?

>>:  ビッグデータ分散調整アーティファクト: 飼育係の選出

推薦する

土を積むことから梁を彫ることへ: SEO の焦点の転換について

ウェブサイトを構築することは美しい建物を建てることに似ています。 9階建ての塔は土を積み上げることか...

メールマーケティングをうまく行うには、「段階的な進歩」に注意を払う必要があります

電子メール マーケティングをうまく行うにはどうすればよいでしょうか。これは多くの企業が知りたいことで...

「統合してオープン、組み合わせて革新」---Tencent Cloudによる統合コミュニケーションの探求

[51CTO.comより引用] 2018年、企業のデジタル変革が大規模に出現し、「デジタル経済」の時...

分散ロックの複数の実装

現在、ほぼすべての大規模な Web サイトとアプリケーションは分散形式で展開されています。分散シナリ...

Seoer: あなたはまだ時代遅れの考えに支配されていますか?

中国では、SEO がかなり長い間発展してきました。海外から中国に導入されてから現在に至るまで、さまざ...

ウェブサイトのコンバージョン率について話すときは、まずキーワードの商業的価値について話す必要があります。

ウェブサイトのトラフィックは良いが、コンバージョン率が低すぎるという友人によく出会います。そのたびに...

Amazon FreeRTOS の紹介

Amazon FreeRTOS (a:FreeRTOS) は、小型で低電力のエッジデバイスのプログラ...

VMware が世界のデジタル インフラストラクチャに本質的なセキュリティを提供

VMware (NYSE: VMW) は、VMworld 2020 において、世界のデジタル インフ...

k8s に最適な PaaS ソリューションを見つけるにはどうすればよいでしょうか?

[[325295]]近年、Kubernetes は多くの人々の注目を集めるようになりました。現実には...

無制限トラフィック VPS: limewave、米国 VPS (シアトル)、最小構成 $20/月、4 RAM/2 コア/50GSSD/100M 帯域幅

Limewave は独自のネットワーク AS36369 と IP を持っています。現在はインターネッ...

シンプルさから最適化効果を探り、企業のウェブサイトを最適化する方法

実際、企業ウェブサイトの SEO に関しては、最適化の分野では比較的簡単な問題です。百度自体が企業ウ...

クラウドコンピューティングの相互接続の未来とは?

ビジネスを運営するアプリケーションにおけるセキュリティ侵害やパフォーマンス関連の問題は、間違いなく収...

GenAI はクラウド コンピューティングの ROI を向上できますか?

既存の企業は、クラウド コンピューティングの導入を検討する際にジレンマに直面します。メリットは魅力的...