Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】How to dockerize a node.js application with a custom dockerfile

2025年09月25日に「Dev.to」が公開したITニュース「How to dockerize a node.js application with a custom dockerfile」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Node.jsアプリをDockerでコンテナ化する具体的な手順を解説。Dockerfileを作成し、アプリをDockerイメージとしてビルド・実行する方法を学ぶ。Dockerは環境の一貫性を保ち、アプリの共有やデプロイを容易にする。Docker Hubへの公開方法も紹介する。

ITニュース解説

システムエンジニアを目指す初心者にとって、開発したアプリケーションをどんな環境でも確実に動かせるようにすることは重要な課題だ。この課題を解決する強力なツールがDockerであり、アプリケーションを「コンテナ化」する技術がその中心にある。コンテナとは、アプリケーションと、それを実行するために必要なすべての要素(コード、ランタイム、システムツール、ライブラリ、設定など)を一つにまとめて、他のシステムから隔離された環境で実行できる技術だ。これにより、「私の環境では動くのに、あなたの環境では動かない」という問題を解消し、開発、テスト、本番環境まで、どこでも一貫した動作を保証できる。

今回は、GitHubのNode.jsリポジトリからスター数を取得し、それをウェブページに表示するシンプルなNode.jsアプリケーションを例に、Dockerを使ったコンテナ化の手順を詳しく見ていこう。このアプリケーションは、ウェブフレームワークのExpressを使ってサーバーを立ち上げ、データ取得にはAxiosというライブラリを使用する。

まず、アプリケーションのメタデータや依存ライブラリを定義するpackage.jsonファイルと、Expressでウェブサーバーを起動し、GitHub APIからスター数を取得してHTMLとしてブラウザに表示するメインのコードを記述したserver.jsファイルを作成する。これらのファイルが準備できたら、ローカル環境でnpm installで依存ライブラリをインストールし、node server.jsでサーバーを起動する。ブラウザでhttp://localhost:3000にアクセスして、アプリケーションが期待通りに動作することを確認することが、次のステップに進む前の重要な確認作業だ。

アプリケーションが正しく動作することを確認したら、いよいよコンテナ化の核となる「Dockerfile」の作成に移る。Dockerfileは、Dockerイメージを構築するための手順を記述した単なるテキストファイルだ。このファイルに書かれた命令一つ一つが、最終的なDockerイメージを構成する層(レイヤー)を追加していく。

今回作成するDockerfileの主な命令を解説する。 FROM node:22-alpineという命令は、軽量なLinuxディストリビューションであるAlpineをベースにしたNode.jsバージョン22の公式イメージを起点とすることを示す。これにより、Node.jsとnpmが利用可能な環境が準備される。 WORKDIR /usr/src/appは、コンテナ内部での作業ディレクトリを設定する。これ以降の命令は、このディレクトリ内で実行される。 COPY package.json ./RUN npm installは、まずローカルのpackage.jsonをコンテナ内にコピーし、その後npm installコマンドで依存ライブラリをインストールする。この順序は、package.jsonが変更されない限り、時間のかかる依存ライブラリのインストールステップをDockerがキャッシュできるようにするための最適化であり、ビルド時間の短縮に貢献する。 COPY . .で、残りのアプリケーションコード(server.jsなど)を作業ディレクトリにコピーする。 EXPOSE 3000は、このコンテナがポート3000でリクエストを待ち受けることをDockerに伝えるための宣言だ。これはあくまで情報であり、実際に外部からアクセスできるようにするには、コンテナを実行する際にホストマシンとコンテナ間のポートマッピング設定が必要となる。 CMD ["npm", "start"]は、コンテナが起動したときにデフォルトで実行されるコマンドを定義し、これによりNode.jsアプリケーションが起動する。

Dockerイメージをビルドする前に、.dockerignoreファイルを作成することも推奨される。このファイルは、Gitの.gitignoreファイルのように、Dockerイメージに含めたくないファイルやディレクトリを指定する。例えば、ローカルのnode_modulesディレクトリ、.gitディレクトリ、.envファイルなどは、イメージのサイズを不必要に大きくしたり、セキュリティ上のリスクとなったりするため、通常は含めないように設定する。特にnode_modulesはコンテナ内でnpm installで再構築するため、ローカルのものをコピーする必要はない。

これらの準備が整ったら、プロジェクトのルートディレクトリでdocker build -t stars_generator .コマンドを実行し、Dockerイメージをビルドする。-tオプションはイメージに名前(タグ)を付けるためのもので、後でこのイメージを参照しやすくする。末尾の.は、現在のディレクトリにあるDockerfileとソースコードを使ってビルドすることをDockerに指示する。このコマンドが成功すると、stars_generatorという名前の再利用可能なDockerイメージが作成される。

イメージがビルドされたら、docker run -p 3000:3000 stars_generatorコマンドでコンテナを起動する。-p 3000:3000は、ホストマシン(あなたのPC)のポート3000とコンテナ内部のポート3000を対応させるポートマッピング設定だ。これにより、ローカル環境からhttp://localhost:3000にアクセスすると、Dockerコンテナ内で実行されているNode.jsアプリケーションに接続できるようになる。ターミナルに「Server running on http://localhost:3000」と表示されれば、アプリケーションがコンテナ内で正常に動作している証拠だ。

なぜアプリケーションをDockerでコンテナ化するのかというと、その最大のメリットは「環境の一貫性」にある。Dockerは、アプリケーションとその実行に必要なすべての要素をパッケージ化するため、どんなOSや環境でもまったく同じように動作する。「私のマシンでは動いたのに、本番環境では動かない」といった問題は解消され、開発、テスト、本番環境間で一貫した動作が保証される。また、一度イメージをビルドすれば、Docker Hubのようなコンテナレジストリにプッシュすることで、チームメンバーやCI/CDパイプライン、クラウド環境などに「簡単に共有・デプロイ」できる。これにより、Node.jsやnpmを個別にインストールすることなく、誰でもすぐにアプリケーションを実行できる。さらに、コンテナはホストシステムから「安全に隔離」されているため、アプリケーションがシステム全体に影響を与えたり、他のアプリケーションと競合したりする心配がない。

作成したDockerイメージをDocker Hubにプッシュする方法も理解しておくと、実務でのイメージ共有のワークフローを把握できる。まずDocker Hubでアカウントを作成し、docker tag stars_generator <あなたのDocker Hubユーザー名>/stars_generatorというコマンドでイメージにタグを付ける。これは、イメージをDocker Hubのあなたのアカウントに紐付けるための名前付けだ。次に、docker loginでターミナルからDocker Hubにログイン認証を行う。認証が完了したら、docker push <あなたのDocker Hubユーザー名>/stars_generatorコマンドを実行すると、イメージがDocker Hubにアップロードされる。これにより、世界中の誰もがdocker pull <あなたのDocker Hubユーザー名>/stars_generatorコマンドであなたのイメージをダウンロードし、docker run -p 3000:3000 <あなたのDocker Hubユーザー名>/stars_generatorでアプリケーションを実行できるようになる。彼らはNode.jsのインストールやコードのクローンをすることなく、完全にポータブルで自己完結したあなたのアプリケーションを動かせるのだ。

アプリケーションのDocker化とDocker Hubへのプッシュをいつ行うべきかという問題については、開発フェーズやチームのワークフローによって異なる。一般的には、アプリケーションの主要な機能を構築し、ローカルで十分にテストを行ってからDocker化し、その後でDocker Hubのようなレジストリにプッシュするのが最も一般的で実用的だ。これにより、安定した動作が確認されたアプリケーションだけがコンテナ化され、レジストリもクリーンに保たれる。しかし、クラウドネイティブな開発環境や、開発初期からコンテナの一貫性を重視するチームでは、開発の早い段階からDocker化を行う場合もある。どちらの方法も一長一短があるが、初心者の場合は、まずはアプリケーションをしっかりと開発・テストし、その後でコンテナ化とプッシュを行うのが堅実なアプローチと言えるだろう。Dockerを学ぶことは、現代のシステムエンジニアにとって不可欠なスキルの一つであり、アプリケーション開発の可能性を大きく広げるだろう。

関連コンテンツ

関連IT用語

関連ITニュース