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

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

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

推薦する

人民戦争と「巣の中の卵」 - Sassu のブログからウェブサイトのコンテンツ構築について見る

どのようなウェブサイトであっても、高品質なウェブサイトコンテンツ(独自サービス)システムを定期的に作...

コミュニティ解体|新規ユーザー獲得からユーザー転換までのプロセスをゲームグループ視点で見る

コミュニティとは何ですか?コミュニティをどのように定義しますか?コミュニティを形成するにはどうすれば...

テンセント、2017年第3四半期の業績を発表

中国におけるインターネット付加価値サービスの大手プロバイダーであるTencent Holdings ...

ウェブサイトのユーザーを育成し、維持する方法について簡単に説明します。

長い間何も書いていませんでした。怠惰は誰にでも共通する問題であり、もちろん私も例外ではありません。最...

ftpit - $35/年/3 コア/1g メモリ/100g ハード ドライブ/2T トラフィック/G ポート

FTPIT は、年間支払いの大容量メモリ VPS を 4 つリリースしました。違いは SSD と機械...

Googleは、ドメイン名のマッチングに頼って上位に表示される低品質のウェブサイトを取り締まるため、アルゴリズムを調整した。

海外メディアの報道によると、質の低いウェブサイトがGoogle検索で上位に表示される方法の一つは、一...

OpenStack仮想マシンにデータボリュームをマウントするプロセスの分析

1 OpenStackについてこれは、パブリック クラウドとプライベート クラウドの展開と管理を実装...

Googleによる不自然なリンクの特徴と対処について

Googleにおける不自然なリンクの特徴と扱いについて背景過去数か月間、Google は不自然なリン...

パパイヤモバイル、ビッグデータマーケティングでGEM市場に参入、国内企業の海外進出を支援

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス中天国富証券株式会社と北...

インタビュアー:カフカをご存知ですか? Kafka ログセグメントの読み取りと書き込みの方法について説明します。

[[332223]]私がこの記事を書いた理由は、以前のインタビューでインタビュアーからこの質問をされ...

ハイアール冷蔵庫破壊事件からイベントマーケティングについて簡単に考察

企業にとって、誠実さと品質は消費者が最も気にかけるものです。企業が誠実さと責任を持って行動すれば、そ...

Linux システムの仮想メモリはまさに落とし穴です。

仮想メモリがオペレーティング システムにおける最も重要な概念の 1 つであることは間違いありません。...

ホームページを数秒で収集し、18日以内に内部ページの日記を収集します

まず、具体的な動作例としてステンレスベルトのケースを取り上げます。まず、ユーザー分析ウェブサイトを作...

中国と米国間の最速のネットワーク回線である、信頼できるcn2 gia vpsマーチャントをいくつか推奨します

ウェブマスターは、cn2 gia ネットワークを提供する複数の VPS 販売業者を慎重に選択して推奨...

個人による SEO は業界から消えていきます。今後 SEO に必要なのはチームです。

私はウェブサイト最適化の分野で約3年間働いています。インターネットが好きだったので、友人の指導のもと...