Stack Overflowの2022年の 最も人気のあるWebフレームワークとテクノロジーのリストのトップであるNode.jsは、重要なMERNスタックコンポーネントとして成長を続けています。 また、Nodeアプリケーションは世界をリードするプログラミング言語であるJavaScriptで記述されているため、多くの開発者がそれを使用して快適に感じるでしょう。 Node.jsの人気といくつかの一般的な開発上の課題を解決するために、 Node Docker公式イメージ(DOI) を導入しました。
Node.js Foundationは、Nodeを「オープンソースのクロスプラットフォームのJavaScriptランタイム環境」 と説明しています 。 開発者はこれを使用して、パフォーマンスが高くスケーラブルなサーバーおよびネットワークアプリケーションを作成します。 Nodeの利点にもかかわらず、クロスプラットフォームサービスの構築と展開は、従来のワークフローでは困難な場合があります。
逆に、Node Docker公式イメージは、追加の構成を可能にしながら、開発プロセスを高速化および簡素化します。 コンテナ化されたNodeアプリケーションを数分でデプロイできます。 このガイド全体を通して、Nodeの公式イメージ、その使用方法、およびいくつかの貴重なベストプラクティスについて説明します。
このチュートリアルの内容:
ノードドッカーの公式イメージとは何ですか?
Node Docker 公式イメージには、アプリケーションが正しく動作するために必要なすべてのソース コード、コア依存関係、ツール、およびライブラリが含まれています。
このイメージは amd64
、s390x
arm32v6
arm32v7
arm64v8
ppc641le
などの複数の CPU アーキテクチャをサポートしています。任意のプロジェクトの複数のタグ(または画像バージョン)から選択することもできます。 次のような node:19.0.0-slim
固定バージョンを選択すると、安定した合理化されたバージョンのNode.jsにロックされます。
ノード.jsユースケース
ノード.jsを使用すると、開発者はサーバー側のコードを JavaScript で記述できます。 次に、ランタイム環境は、このJavaScriptをハードウェアに適したマシンコードに変換します。 その結果、CPUはこれらの低レベルの命令を処理できます。
Nodeは、イベント駆動型(ユーザーアクションによる)、ノンブロッキングであり、軽量でありながら同時に多数の操作を処理することで知られています。 その結果、ノード DOI を使用して以下を登録することができます。
- Web サーバー アプリケーション
- ネットワークアプリケーション
ノードはHTTPリクエストとソケット接続をサポートしているため、ここでうまく機能します。 非同期 I/O ライブラリを使用すると、ノード コンテナーは、アプリケーションをサポートするさまざまなシステム ファイルの読み取りと書き込みを行うことができます。
Node DOIを使用して、ストリーミングアプリ、シングルページアプリケーション、チャットアプリ、やることリストアプリ、マイクロサービスを構築できます。 または、 コミュニティオールハンズのKathleen Juell のような場合は、Node.jsを使用して静的コンテンツを提供できます。 コンテナ化されたノードは、多数のクライアントサーバー要求によって指示されるあらゆるシナリオで輝きます。
Docker のキャプテンである Bret Fisher 氏も.js DockerCon 2022 で Dockerized Node についての考え を述べました。 彼は、最適化に飛び込みながら、Node.jsプロジェクトを管理するためのベストプラクティスについて説明しました。
最後に、 GitHub Awesome Compose ライブラリ内にいくつかの Node サンプル アプリケーションも保持しています。 さまざまなデータベースでNodeを使用する方法や、NGINXプロキシを組み込む方法を学ぶこともできます。
Docker 公式イメージについて
Node Docker 公式イメージは、Docker Hub 上の多くのコア コンテナー イメージの 1 つとしてキュレーションされました。 Node.js コミュニティは、Docker コミュニティのメンバーと共にこのイメージを維持しています。
他の Docker公式イメージと同様に、Node DOIはNodeとJavaScriptの開発者に共通の出発点を提供します。 また、Nodeのベストプラクティスの進化するリストを維持しながら、重要なセキュリティアップデートを定期的にプッシュします。 これにより、Docker 公式イメージと Docker Hub の代替イメージが区別されます。
ドッカーでノードを実行する方法
開始する前に、 最新の Docker デスクトップ リリースをダウンロードしてインストール します。 Docker Desktop には、Docker CLI、Docker Compose、および追加のコア開発ツールが含まれています。 Docker ダッシュボード (Docker Desktop の UI コンポーネント) は、イメージとコンテナーの管理に役立ちます。
これで、ノードをドッカライズする準備が整いました。
クイックプルコマンドを入力する
ノードDOIをプルするのが最も簡単な方法です。 ターミナルに入力 docker pull node
して、Docker Hub からデフォルトの latest
ノード バージョンを取得します。 このタグは、テストやローカル開発に簡単に使用できます。 ただし、固定されたバージョンの方が運用環境での使用には安全です。 プル プロセスのしくみを次に示します。
完了すると、CLIにステータスメッセージが表示されます。 Dockerデスクトップ内でこれを再確認することもできます。 左側のサイドバーの[画像]タブをクリックして、リストされている 画像 をスキャンします。 Docker デスクトップに画像 node
が表示されます。
あなたの node:latest
イメージは942.33MBです。 を使用して Node イメージの内容 docker sbom node
を調べると、現在 623 個のパッケージが含まれていることがわかります。 Node イメージには、Node とさまざまなアプリケーションをサポートする多数の依存関係とモジュールが含まれています。
ただし、最終的なノードイメージははるかにスリムになる可能性があります。 最適化については、Dockerfiles について説明しながら取り組みます。 結局のところ、Node DOIには、4つの主要なNodeバージョンにまたがる24のサポートされているタグがあります。 それぞれが画像サイズに独自の影響を与えます。
ノードが機能していることを確認する
新しいイメージをコンテナーとして実行しますか? リストされた node
画像にカーソルを合わせて、青い[実行]ボタンをクリックします。 この状態では、ノードコンテナは最小限のログエントリを生成し、リクエストが送信された場合に備えて継続的に実行されます。
先に進む前に、Dockerデスクトップの四角い「停止」ボタンをクリックするか、CLIを入力して docker stop YourContainerName
、このコンテナを終了します。
ドッカーファイルからノードイメージを作成する
から Dockerfile
ビルドすることで、イメージの構成、構成、およびアプリケーション全体を最終的に制御できます。 ただし、Nodeが正しく機能するために必要なものはほとんどありません。 ここにあなたを立ち上げて実行するための最低限のものがあります Dockerfile
(固定されたDebianベースのイメージバージョンを使用):
FROM node:19-bullseye
Docker は、選択したノード バージョンからイメージをビルドします。
このイメージは多数のユース ケースをサポートしているため、最も node:19-bullseye
安全に使用できます。 このバージョンも安定しており、タグで latest
発生することがある新しい破壊的変更を取り込むのを防ぎます。
から Dockerfile
イメージをビルドするには、 docker build -t my-nodejs-app .
命令。 その後、を入力して docker run -it --rm --name my-running-app my-nodejs-app
新しいイメージを実行できます。
ノードイメージを最適化する
Nodeの完全バージョンには、多くの場合、アプリケーションを圧迫する追加のパッケージが含まれています。 これにより、最適化の余地が十分にあります。
たとえば、 不要な開発依存関係を削除する と、イメージの肥大化が減少します。 これを行うには、 RUN
前のファイルに命令を追加します。
FROM node:19-bullseye
RUN npm prune --production
このアプローチはかなりきめ細かいです。 また、自分が何をしていて、プロジェクトに何が必要でないかを正確に知っていることにも依存しています。 または、スリムイメージビルドに切り替えると、最も迅速な結果が得られます。 同様の警告に遭遇しますが、個々の Dockerfile
指示を書くのに費やす時間は少なくなります。 最も簡単な方法は、対応するものに置き換える node:19-bullseye
node:19-bullseye-slim
ことです。これだけで画像サイズが75%縮小されます。
プル node:19-alpine
してディスク容量を節約することもできます。 ただし、このタグに含まれる依存関係はさらに少なく、Node.js Foundation では公式にはサポートされていません。 開発中はこれを念頭に置いてください。
最後に、 マルチステージビルドは 画像サイズの縮小につながります。 これらを使用すると、肥大化に対処するためにビルドステージ間で必要なものだけをコピーできます。
ドッカー作成の使用
開始スクリプトと既存の package.json
ファイルがあり、(おそらく)他のサービスと一緒にNodeを操作したいとします。 Docker Composeを使用してノードコンテナをスピンアップすることは、このような状況で非常に便利です。
サンプル docker-compose.yml
ファイルを次に示します。
services:
node:
image: "node:19-bullseye"
user: "node"
working_dir: /home/node/app
environment:
- NODE_ENV=production
volumes:
- ./:/home/node/app
ports:
- "8888:8888"
command: "npm start"
以前に Dockerfile
指定しなかったパラメーターがいくつか表示されます。 たとえば、このパラメーターを使用すると、 user
特権のないユーザーとしてコンテナーを実行できます。 これは、最小特権の原則に従います。
ノードコンテナをすぐに開始するには、コマンドを入力する docker compose up -d
だけです。 以前と同様に、ノードがDockerデスクトップ内で実行されていることを確認できます。 このコマンドは、 docker container ls --all
CLI 内のすべての既存のコンテナも表示します。
単純なノードスクリプトの実行
プロジェクトには必ずしも Dockerfile
. このような場合は、次のコマンドを使用してノードDOIを直接活用できます。
docker run -it --rm --name my-running-script -v "$PWD":/usr/src/app -w /usr/src/app node:19-bullseye node your-daemon-or-script.js
この単純なアプローチは、単一ファイルのプロジェクトに最適です。
ドッカーノードのベストプラクティス
Dockerとノードの公式イメージを最大限に活用することが重要です。 非root node
ユーザーとして実行する利点について簡単に説明しましたが、Nodeを使用して開発するための役立つヒントをいくつか紹介します。
- シークレットやその他のランタイム構成をアプリケーションに
NODE_ENV
production
簡単に渡すには、 を に設定します。-e “NODE_ENV=production”
- インストールされているグローバル・ノード依存関係を非 root ユーザー・ディレクトリーに配置します。
- イメージタグを使用する場合は
alpine
、デフォルトでは含まれていないため、手動でインストールするcurl
ことを忘れないでください。 - ノードプロセスをinitシステムでフラグで
--init
ラップして、PID1として正常に実行できるようにします。 - 同じホストで実行されるコンテナーのメモリ制限を設定します。
- コマンドを
package.json
start
、 内Dockerfile
に直接含めて、アクティブなコンテナー プロセスを減らし、Node が終了シグナルを適切に受信できるようにします。
これは完全なリストではありません。 詳細については、 ベストプラクティスのドキュメントをご覧ください。
今すぐ Node を使い始めましょう
これまで見てきたように、Node Docker公式イメージからノードコンテナをスピンアップするのは迅速であり、ワークフローに応じていくつかの手順で済みます。 プラットフォーム固有のビルドについて心配したり、複雑な開発プロセスに行き詰まったりする必要はもうありません。
また、Nodeビルドのパフォーマンスを向上させるための多くの方法についても説明しました。 コンテナ化のヒントに関する記事 で、最適化とセキュリティの詳細をご覧ください。
始める準備はできましたか? Docker Hub でスイング し、ノード イメージをプルして実験を開始します。 すぐに、サーバーとネットワークアプリケーションが稼働します。 詳細については、 GitHub read.me ページもご覧ください。