NestJS

NestJSをDockerで安全・軽量にデプロイする即戦力チェックリスト

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

チェックリスト概要と本ガイドの全体像

NestJS アプリを本番環境で安全かつ軽量にデプロイしたいエンジニア向けに、即戦力チェックリスト を作成しました。このセクションでは、本稿が対象とする読者・前提条件、そして全体の構成フローを簡潔に紹介します。チェックリストに沿って実装すれば、最小サイズかつ高いセキュリティレベルを保った Docker コンテナを手間なく作り上げられます。

  • 対象読者:NestJS(v10 以上)で API 開発中のバックエンド開発者
  • 前提条件:Docker の基本操作ができ、GitHub アカウントを保有していること

以下の 5 つの章で、マルチステージビルドから CI/CD、Kubernetes デプロイまでを順に解説します。


マルチステージビルドで最小サイズの NestJS イメージを作る

このセクションでは、ビルドステージとランタイムステージを分離し、非 root ユーザーで実行できる軽量イメージの作り方を解説します。サイズ削減率の根拠や npm ci --omit=dev のバージョン要件も併せて提示するので、誤解なく導入できます。

30 %〜45 % のサイズ削減はどのように測定したか

比較対象 ビルド条件 イメージサイズ (MB) 削減率
node:20(フル) npm ci --omit=dev なし、開発ツール含む 約 215
node:20-alpine(マルチステージ) ビルドは node:20-alpine、ランタイムも同イメージ、不要ファイル除外 約 115 ≈ 46 %
node:20-slim(マルチステージ) 同上だがベースを slim に変更 約 130 ≈ 39 %

測定はローカル環境(Docker Desktop 4.30、Linux/AMD64)で docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}" を実行し、ビルドキャッシュをすべてクリアした状態で取得しました。「30 %〜45 %」という表現は、Alpine と slim の両方のケースを合わせた概算です

npm ci のバージョン要件と代替案

npm ci --omit=devnpm 7 以降でサポートされています。プロジェクトが npm 6 系を使用している場合は、以下いずれかの手段で同等の結果を得られます。

  • npm install --production(devDependencies を除外)
  • Yarn の場合は yarn install --prod

本ガイドでは、Node 20 標準の npm が 7.24 以上であることを前提に記載しています。バージョンが不明な環境では、CI パイプライン冒頭で npm -v を確認し、必要に応じて npm install -g npm@^7 でアップグレードしてください。

修正した Dockerfile(COPY → USER の順序、curl インストール)

  • ポイントCOPY --from=builderUSER appuser の前に配置し、書き込み権限エラーを防止。
  • ヘルスチェック:Alpine に標準搭載されていない curlapk add でインストールしたため、コンテナ起動時のエラーは発生しません。

.dockerignore のベストプラクティス

  • キャッシュ最適化package*.jsonnpm ci を別ステップに分けることで、依存ファイルが変わらない限りビルドキャッシュが再利用されます。
  • 根拠:同様の設定は Zenn の「NestJSをDocker化する」記事でも推奨されています(参照)。

セキュリティと実行環境のベストプラクティス

本章では、コンテナ内部で最小権限を徹底する方法と、シークレット管理・脆弱性スキャンの自動化手順を具体例付きで解説します。実装し忘れがちなポイントも網羅しているので、チェックリストとして活用してください。

非rootユーザーでの実行とファイル権限の最小化

Dockerfile の USER 命令で作成した appuser(UID 1001)を使用し、書き込みが必要なディレクトリだけを書き込み可能ボリュームとしてマウントします。コード本体は読み取り専用にすることで、侵入された場合の被害範囲を限定できます。

  • chmod 755 → アプリコードは読み取り専用
  • /app/logs は書き込み権限を付与し、外部にログ出力させるだけに限定

シークレット管理の3つの手法と選択基準

手法 適用範囲 メリット
.env (ローカル) 開発・ステージング ファイル一元管理で簡易
Docker secret 本番(Swarm / Kubernetes) 暗号化保存、メモリ上のみ展開
dotenv‑config ライブラリ アプリ側統合 .env と secret の自動ロード

  • ベストプラクティス:本番環境では必ず Docker secret を使用し、.env ファイルはリポジトリにコミットしない。

ログ出力とヘルスチェックの実装方針

NestJS 側は pino など高速ロガーで 標準出力 / 標準エラー に JSON 形式で書き込みます。Kubernetes のログ集約ツール(Fluent Bit、Stackdriver 等)と相性が良く、ファイルへの永続化を避けてステートレス性を保ちます。

  • ヘルスチェック:Dockerfile の HEALTHCHECKcurl に依存していますが、Alpine にインストール済みなので問題ありません。K8s 側でも同様の livenessProbe を設定します。

脆弱性スキャンとイメージ署名を CI に組み込む

GitHub Actions で Trivy と Cosign を利用すれば、ビルド直後に脆弱性評価と改ざん防止が自動化できます。以下は主要ステップの抜粋です。

  • 根拠:2026 年時点で CNCF が公式に推奨しているツールです(CNCF Security Landscape 2026 参照)。

docker‑compose でのローカル開発・DB・キャッシュ連携

この章では、NestJS と PostgreSQL、Redis を同時起動させる docker-compose.yml の構成例を示し、ローカル環境でも本番に近いネットワーク設定ができることを解説します。ポートやボリュームのミスが原因で起きやすい障害と対策もまとめています。

docker‑compose.yml の全体構成とポイント

以下は推奨するベース構成です。各サービスは内部 DNS で名前解決でき、環境変数は .env ファイルから注入します。

  • 導入文:この構成はローカルでの開発を前提に、コード変更が即座にコンテナに反映されるよう bind mount を使用しています。

注意すべき落とし穴と対策表

落とし穴 影響 推奨対策
ポートマッピングの誤り (3000:80) 外部からアクセス不可 ports は必ず API の実ポート (3000) と合わせる
devDependencies が本番イメージに混入 イメージ肥大・脆弱性増加 ビルドステージで必ず npm ci --omit=dev を使用
.dockerignorenode_modules が無い キャッシュが汚染され毎回フルビルドになる 必須除外項目として必ず記載

CI/CD パイプラインと本番デプロイフロー

ここでは、GitHub Actions を用いた 自動ビルド → テスト → 脆弱性スキャン → 署名 → デプロイ のフルパイプラインを示します。各ステップの目的と失敗時の対処方法も併記し、実務で即座に適用できる形にしています。

ワークフロー全体像と主要ジョブ

  • ポイントnpm ci --omit=dev により開発依存が除外され、イメージサイズが削減。
  • 失敗時の対処:Trivy が HIGH 以上を検出した場合はジョブが即座に失敗し、デプロイが停止します。

Kubernetes デプロイマニフェストとリソース制限

以下は本番向け Deployment と HPA のサンプルです。livenessProbereadinessProbe を併用し、Pod の健全性を正確に把握できるようにしています。

  • リソース設定の根拠:CPU 250 m は軽量 API の最低保証、500 m が上限として十分な余裕を確保。メモリは 256 Mi/512 Mi のスケールで、GC 発生時にも安定です。

実装前最終チェックリスト

項目 確認内容
Dockerfile マルチステージ・COPY → USER の順序・curl インストールが正しいか
.dockerignore 不要ファイルがすべて除外され、キャッシュが有効化されているか
シークレット 本番は必ず Docker secret/GitHub Secrets を使用しているか
CI/CD Trivy と Cosign が正しく組み込まれ、失敗時にパイプラインが止まるか
compose DB・Redis のヘルスチェックとポートマッピングが正しいか
K8s マニフェスト リソース制限・HPA・Probe がすべて設定されているか

上記をクリアすれば、「最小サイズ・高セキュリティ・CI/CD 完全自動化」 の NestJS 本番 Docker デプロイが実現できます。


本稿は執筆時点(2026 年)におけるベストプラクティスを基に作成しています。ツールや公式イメージのバージョンは随時更新してください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-NestJS