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 の使用

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

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

推薦する

有料検索広告におけるモバイルデバイスとPCの違いを分析

過去 1 年間、モバイル デバイスとインターネットの発展は最も予想外のものであり、それが牽引した周辺...

hostodo-新しいサーバー/アジア最適化/$3/2gメモリ/120gハードドライブ/4Tトラフィック/Gポート/QN/ロサンゼルス

hostodo のボスから、新しいサーバーがインストールされたというメールが届きました。このサーバー...

最適化計画を成功させるために必要な7つの要素を分析する

最適化担当者にとって、自社サイトを最適化する場合でも、サイトの最適化を依頼する場合でも、開始する前に...

ファーウェイクラウドは中国のクラウドコンピューティングのジレンマと希望を示している

[[396599]] Huawei Cloudは中国のクラウドコンピューティング市場における最大の変...

ウェブサイト最適化競合分析

新しく引き継いだウェブサイトでも、競合他社の調査でも、SEO データ分析は不可欠です。ウェブサイト分...

friendhosting: 中国ユーザー向けに50%オフ、わずか1.57ドル、VPSは7つのデータセンターを選択可能、「Alipay」が利用可能

先月、ウェブマスターがフレンドホスティングを紹介しました。同社がアジア、特に中国でのユーザー拡大を非...

フォーラムの外部リンク構築における3つの誤解

フォーラムは SEO プロモーションに欠かせないリソースです。従来の運用方法は、純粋なシグネチャ外部...

Googleの.searchやその他のトップレベルドメインの申請は業界団体から反対された

北京時間3月20日朝のニュースによると、大手インターネット企業による新しいトップレベルドメイン名の競...

マルチクラウド戦略で避けるべき4つの落とし穴

企業が競合するクラウド コンピューティング コンポーネントを統合しようとすると何が起こるでしょうか?...

ウェブサイトのコンテンツをうまく作るには、10のポイントから始める必要があります

ウェブサイトの重さはウェブサイトのコンテンツに直接左右されることを認めなければなりません。ウェブサイ...

5 分で gRPC を学びましょう。学びましたか?

導入長い間 Java を使ってきた開発者のほとんどは、gRPC に触れることはほとんどないと思います...

クラウド データの侵害と複雑性の増大: セキュリティの課題にどう対処するか?

451 Research の最近のクラウド セキュリティ レポートによると、クラウドの導入率、特にマ...

違法にデータを収集したアプリ100個が是正のため棚から撤去された

100個のアプリが違法にデータを収集しているが、一体何が問題なのか?最近、国家サイバーセキュリティ通...

arkecxクラウドサーバーはどうですか? インドのチェンナイデータセンターのクラウドサーバーの簡単なレビュー

arkecx はインドに 2 つのデータセンターを持ち、デフォルトの最小帯域幅 1Gbps でインド...

百度共有リターントラフィックは、将来的にウェブサイトの重みを判断するための最も重要なデータとなるだろう

Baidu Share はデータを照会できるようになりました。これは、Baidu Share を使用...