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

【ITニュース解説】How to Dockerize and Deploy a NestJS App on Render for Free

2025年09月14日に「Dev.to」が公開したITニュース「How to Dockerize and Deploy a NestJS App on Render for Free」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

NestJSアプリをDocker化し、Renderの無料枠へデプロイする方法を解説。Dockerfile作成、ローカルテストから、Renderへのデプロイ、CI/CDによる自動化、Cloudflare Workerで無料アプリを24時間稼働させる手順を初心者向けに示す。

ITニュース解説

この記事では、NestJSで開発したアプリケーションを、お金をかけずにインターネット上に公開する方法について詳しく解説する。具体的には、アプリケーションを「Docker」という技術でパッケージ化し、それを「Render」というクラウドサービスを使ってデプロイし、さらに無料枠の制約を回避して安定稼働させる方法までを順に説明していく。システムエンジニアを目指す人にとって、自身の作ったアプリケーションを公開する経験は非常に重要なので、ぜひ理解を深めてほしい。

まず、「Docker(ドッカー)」という技術について理解しよう。これは、アプリケーションとその実行に必要なすべてのもの(オペレーティングシステム、ライブラリ、設定ファイルなど)をまとめて「コンテナ」という独立した環境に閉じ込める技術だ。例えるなら、アプリケーションを特定の環境で完全に動作する「箱」に詰めるようなものだ。この箱に入れてしまえば、開発者のパソコンでも、テスト環境でも、そして実際に公開するサーバーでも、どこでもまったく同じようにアプリケーションが動作する。これにより、「私の環境では動いたのに、そっちでは動かない」といった環境の違いによるトラブルを防ぐことができるため、アプリケーション開発と運用において非常に重要な技術となっている。NestJSアプリをDocker化することで、このような環境依存の問題から解放され、安心してデプロイを進められる。

次に、Docker化の手順を見ていこう。まず、プロジェクトのルートディレクトリに「Dockerfile」というファイルを作成する。これは、Dockerイメージ(コンテナの元となる設計図)をどのように作るかを指示するレシピのようなものだ。このDockerfileには、どのNode.jsのバージョンを使うか、アプリケーションのファイルをどこにコピーするか、必要なライブラリをインストールする方法、そしてNestJSアプリケーションをビルドして起動する方法が記述される。例えば、まずは軽量なNode.jsのベースイメージを選び、作業ディレクトリを設定し、package.jsonなどの依存関係を定義するファイルをコピーして、パッケージ管理ツールであるpnpmで必要なモジュールをインストールする。その後、残りのソースコードをコピーし、NestJSプロジェクトをビルドし、アプリケーションが外部からのアクセスを受け付けるポート(通常は3000番)を公開し、最後にアプリケーションを本番環境モードで起動するコマンドを指定する。 また、同時に「.dockerignore」というファイルも作成することが重要だ。これは、Dockerイメージを作成する際に、どのファイルをコンテナに含めないかを指定するリストだ。例えば、開発中に生成される一時ファイルであるnode_modulesdistディレクトリ、Gitの管理ファイルである.git、そしてDockerfileや.dockerignore自体、環境変数ファイルである.envなどは、最終的なDockerイメージには不要であり、含めないことでイメージのサイズを小さく保ち、ビルド時間を短縮できる。 これらのファイルを作成したら、実際にローカル環境でDockerイメージをビルドし、コンテナとして実行して、アプリケーションが正しく動作するか確認することが推奨される。docker buildコマンドでイメージを作成し、docker runコマンドでコンテナを起動し、Webブラウザでアプリケーションにアクセスできれば、Docker化は成功だ。

アプリケーションのDocker化が完了したら、いよいよ「Render(レンダー)」というクラウドサービスにデプロイする。Renderは、Webサービスなどを簡単にデプロイできるプラットフォームで、無料枠も提供されているため、初めてのデプロイには非常に適している。デプロイ方法には主に二つの選択肢がある。

一つ目の方法は、最もシンプルな「RenderにDockerイメージのビルドを任せる」方法だ。この方法では、Docker化されたNestJSアプリのコードをGitHubやGitLabなどのバージョン管理サービスにプッシュする。その後、Renderのダッシュボードから新しいWebサービスを作成し、該当するリポジトリを接続するだけでよい。Renderは自動的にリポジトリ内のDockerfileを検出し、その指示に従ってDockerイメージをビルドし、アプリケーションをデプロイしてくれる。この方法は、手軽にデプロイできるため、開発初期段階や簡単なプロジェクトに適している。

二つ目の方法は、「事前ビルドされたDockerイメージをRenderが利用する」という、より高度な方法だ。この方法では、Dockerイメージをローカルでビルドし、「Docker Hub(ドッカーハブ)」というDockerイメージを共有するためのサービスにプッシュする。その後、RenderにはDocker Hubにプッシュされたイメージを利用するように指示する。この方法の最大のメリットは、アプリケーションのコードが更新されるたびに自動的にデプロイが行われる「CI/CD(継続的インテグレーション/継続的デリバリー)」という仕組みを構築できる点にある。 具体的には、まずローカルでDockerイメージをビルドし、docker tagコマンドで自分のDocker Hubアカウントとイメージ名を付けてタグ付けする。そして、docker pushコマンドでDocker Hubにイメージをアップロードする。Render側では、既存のDockerイメージをデプロイする設定を選び、Docker HubのイメージのURLを指定する。 さらに、GitHubの「GitHub Actions(ギットハブアクションズ)」という機能を使って、CI/CDを自動化する。GitHub Actionsは、コードのプッシュなどの特定のイベントをトリガーに、自動で一連の処理を実行できる仕組みだ。プロジェクトの.github/workflowsディレクトリにYAML形式のワークフローファイルを作成し、mainブランチへのプッシュをトリガーに設定する。このワークフローでは、まずGitHubリポジトリのコードをチェックアウトし、設定したGitHubの「Secrets(シークレット)」を使ってDocker Hubにログインする。Secretsは、パスワードやAPIキーなどの機密情報を安全に管理するための機能だ。その後、DockerイメージをビルドしてDocker Hubにプッシュし、最後にRenderのデプロイフックURLという特殊なURLを呼び出すことで、Renderに新しいイメージを使ってデプロイを促す。これにより、コードをGitHubにプッシュするだけで、ビルド、Docker Hubへのプッシュ、Renderへのデプロイまでの一連のプロセスが完全に自動化される。

最後に、Renderの無料枠を利用する際の注意点と、その回避策について説明する。Renderの無料プランでは、サービスが15分間アクティビティがないと自動的にスリープ状態になる。これにより、次にアクセスがあった際にアプリケーションの起動に時間がかかり、「コールドスタート」と呼ばれる遅延が発生してしまう。これを防ぎ、アプリを常にアクティブな状態に保つための方法として、「Cloudflare Workers(クラウドフレアワーカーズ)」というサービスを利用する。 Cloudflare Workersは、非常に軽量なサーバーレスアプリケーションをデプロイできるプラットフォームで、こちらも無料枠が提供されている。WranglerというCLIツールを使ってWorkerを生成し、設定ファイルwrangler.tomlで定期実行(cronジョブ)のスケジュールを設定する。例えば、「*/15 * * * *」という設定は、15分ごとにWorkerが実行されることを意味する。Workerのコード(通常はTypeScriptで記述)には、デプロイしたNestJSアプリのURLを定期的に(例えば15分ごとに)fetch(Webリクエストを送信する関数)で呼び出す処理を記述する。これにより、Cloudflare WorkerがNestJSアプリを定期的にピングし続けるため、Renderの無料サービスがスリープ状態になるのを防ぎ、常に素早い応答が可能になる。

このように、Docker、Render、GitHub Actions、Cloudflare Workersといった複数の技術を組み合わせることで、NestJSアプリケーションを費用をかけずに開発、デプロイ、そして安定して運用することが可能になる。システムエンジニアを目指す上で、これらのクラウドネイティブな技術を実際に体験し、理解することは非常に貴重な経験となるだろう。

関連コンテンツ

関連IT用語