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の観点から見たシングルページTaobao顧客構築の長所と短所の分析

タオバオは、現在では一般的に使用されているオンライン収益方法です。操作が簡単で、利益が直接得られます...

VMware がクラウド コンピューティング戦略と技術ロードマップを公開

VMworld Europe 2009 において、VMware (NYSE: VMW) の社長兼 C...

中国インターネット20年史:64K国際専用線が中国インターネット時代の幕開け

20年前の今日、1994年4月20日、中国は64K国際専用線を通じて国際インターネットへの完全なアク...

ftech: 月額 20 ドル、ベトナム VPS、1Gbps 帯域幅、無制限トラフィック、4G メモリ/2 コア/25g SSD、Windows/Linux

ftechはベトナム企業で、2009年に設立され、2009年から運営されています。主な事業は、仮想ホ...

Godaddy 3か月4.95ドルで登録可能(中国人向け)

Godaddy の 3 月の最新割引コードでは、com ドメイン名の登録価格は 4.95 米ドルです...

ウェブサイトとユーザーとの接続が失われたらどうなるでしょうか?

Baidu によるウェブサイトの重み付けの決定には複雑な論理的判断が伴いますが、本質的な出発点は依然...

リバースホスト - 12 USD/年/4 コア/512 MB RAM/60 GB ハードドライブ/1 TB 帯域幅

Reversehosts は、ブラック フライデーの前に、4 つのコアと 512 MB のメモリを備...

Baidu Zhidao、Tieba、Baike にリンクを投稿した場合も処罰されます。

友人のウェブサイトは、以前は BAIDU で特定のキーワードを検索すると 1 位にランクされていまし...

ワールドカップ食品ブランドマーケティング戦略

4年間の待機期間を経て、2018年ワールドカップが北京時間11月21日午前0時に、開催国カタールと南...

SEO実践者が知っておくべき8つの鉄則について語る

草の根のウェブマスターであろうと、企業であろうと。ウェブサイトを構築している場合、またはインターネッ...

クラウドコンピューティングの3大巨人が互いに競争しています。あなたの「運命の人」は誰ですか?

最も影響力のある 3 つのクラウド コンピューティング ベンダーについて話すとき、人々は間違いなく ...

モバイル向けに最適化されたウェブサイトに関する Google の推奨事項

近年のスマートフォンの普及により、モバイルデバイス経由でウェブサイトを閲覧するユーザーが増えており、...

IPSec VPNが正式にリリースされ、UCloudゲートウェイのセキュリティ戦略に新たな強力なツールが加わりました。

最近、国内大手のクラウド コンピューティング サービス プロバイダーである UCloud は、上海 ...

Sangfor Private Cloudが「2020年中国IT産業優秀ソリューション賞」を受賞

このほど、51CTOが主催する「中国企業『IT印象◆IT勢いを解放しデジタル時代を加速させる』年度選...

コンテンツは王様です。Web サイトのコンテンツ保護は、Web サイトの開発に役立ちます。

ウェブサイトにおけるコンテンツの役割は自明であり、良質な記事はさらに稀です。誰もが自分で高品質のオリ...