Contents
NestJSマイクロサービスとDockerの概要
NestJSマイクロサービスをDockerでデプロイすることで、開発環境と本番環境の一貫性を確保できます。また、コンテナ技術により依存関係の管理やスケーリングが容易になります。この記事では、具体的な手順をステップバイステップで解説します。
|
1 2 3 4 5 6 |
| 項目 | 伝統的デプロイ | Dockerデプロイ | |------|----------------|----------------| | **環境一貫性** | 低 | 高 | | **スケーリング** | 手動設定が必要 | 自動化可能 | | **依存管理** | 環境ごとに差異あり | コンテナ内に閉じ込められる | |
NestJSプロジェクト構成の基本
NestJSプロジェクトは、src/ディレクトリ配下でサービスとモジュールを階層化して構築されます。マイクロサービス同士の通信には、environment.tsや.envファイルを活用するのが一般的です。
標準的なファイル構造
NestJSプロジェクトの典型的な構成は以下の通りです:
src/:ソースコードmain.ts:アプリケーションのエントリポイントapp.module.ts:ルートモジュールservices/:ビジネスロジックcontrollers/:HTTPハンドラtest/:テストケース.env:環境変数設定ファイル
マイクロサービスの階層設計
マイクロサービスは、各機能ごとに独立したプロジェクト構成を推奨します。例として、以下のような構造が考えられます:
|
1 2 3 4 5 6 7 8 9 10 11 |
projects/ ├── auth-service/ │ ├── src/ │ ├── Dockerfile │ └── .env ├── user-service/ │ ├── src/ │ ├── Dockerfile │ └── .env └── docker-compose.yml |
Dockerfileとdocker-compose.ymlの作成
Dockerfileは、アプリケーションをビルドするための手順書です。docker-compose.ymlでは複数コンテナを管理します。
Dockerfileの基本構文
以下のテンプレートはNestJSプロジェクト用に最適化されています:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 使用するベースイメージ (軽量なalpine版を使用) FROM node:18-alpine # コンテナ内で作業するディレクトリを指定(/app) WORKDIR /app # パッケージ管理用のファイルをコピーし、依存関係をインストール COPY package*.json ./ RUN npm install --production # ソースコードとビルドスクリプトをコピー COPY . . # アプリケーションを構築(distフォルダにビルド結果が生成される) RUN npm run build # コンテナ起動時に実行するコマンド CMD ["node", "dist/main.js"] |
マルチステージビルドの活用
開発環境と本番環境を分離するには、マルチステージビルドが有効です。以下はその例:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 【第1段階】開発用イメージ(依存関係をインストール) FROM node:18-alpine AS builder WORKDIR /app COPY . . RUN npm install && npm run build # 【第2段階】本番用イメージ(最小限のサイズで動作) FROM node:18-alpine WORKDIR /app # 第一段階からdistフォルダをコピーして、不要な依存関係を排除 COPY --from=builder /app/dist ./dist CMD ["node", "dist/main.js"] |
コンテナ間依存関係定義
docker-compose.ymlでサービス間の依存関係を定義します。以下は簡単な例:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
version: '3.8' services: auth-service: build: ./auth-service ports: - "3001:3001" environment: - PORT=3001 networks: - microservices-network user-service: build: ./user-service ports: - "3002:3002" depends_on: - auth-service networks: - microservices-network networks: microservices-network: driver: bridge |
マイクロサービス間通信設定
マイクロサービス同士の通信には、環境変数を介したサービス発見とgRPC/TCPベースの設定が一般的です。
環境変数によるサービス発見
各サービスは、.envファイルで他のサービスのホストやポートを指定します。例:
|
1 2 3 4 |
# auth-service/.env USER_SERVICE_HOST=user-service USER_SERVICE_PORT=3002 |
gRPC/TCPベースの通信構成
gRPC通信の場合は、以下のようにdocker-compose.ymlでネットワークを定義します:
|
1 2 3 4 5 6 7 8 9 |
networks: microservices-network: driver: bridge services: auth-service: networks: - microservices-network |
Dockerイメージのビルド手順
ローカルでのビルドからDocker Hubへのプッシュまで、以下のように進めます。
ローカルでのビルドプロセス
各サービスごとにdocker buildを実行します:
|
1 2 3 |
# auth-serviceディレクトリで実行 docker build -t auth-service:latest . |
複数サービスを同時にビルドするには、--parallelオプションを使用できます。
Docker Hubへのプッシュ手順
ローカルで作成したイメージをDocker Hubに公開するには、以下のようにします:
|
1 2 3 4 5 6 |
# ログイン docker login # プッシュ docker push your-dockerhub-username/auth-service:latest |
コンテナ起動時のトラブルシューティング
ポート衝突やログ確認など、デバッグに役立つコマンドを紹介します。
ポート衝突の確認方法
docker-compose upでエラーが発生する場合、以下を実行してポート使用状況を確認します:
|
1 2 3 4 5 6 |
# Unix系OS(Linux/macOS)での確認 lsof -i :3001 # Windows環境の場合(代替コマンド) netstat -ano | findstr :3001 |
ログのリアルタイム監視
コンテナのログをリアルタイム表示するには次のコマンドを使用してください:
|
1 2 |
docker-compose logs -f |
依存関係の解決手順
サービス起動時に依存関係が未満足な場合は、--buildオプションで再ビルドします:
|
1 2 |
docker-compose up --build |
まとめ
本記事では、NestJSマイクロサービスをDockerでデプロイする具体的な手順をステップバイステップで解説しました。重要なポイントは以下の通りです:
- プロジェクト構成の基本:階層設計とファイル配置が重要
- Dockerfile・docker-compose.yml:テンプレートとマルチステージビルドの活用
- 通信設定:環境変数でサービス発見、gRPC/TCPのネットワーク設定
- イメージビルド:ローカルでのビルドとDocker Hubへのプッシュ
- トラブルシューティング:ポート衝突やログ確認がデバッグに不可欠
記事内のサンプルコードをベースに環境構築を試してみましょう。