Contents
NestJS microservices Docker デプロイ手順の概要
NestJS microservices Docker デプロイ手順というキーワードで検索する読者は、マイクロサービスアーキテクチャにおけるDockerとの統合に悩まされています。この記事では、具体的なステップバイステップガイドとベストプラクティスを解説し、実践的なデプロイ方法をご提供します。
NestJSプロジェクト用Dockerfileの作成手順
NestJSマイクロサービスをDockerで動かすためには、適切なDockerfileを作成する必要があります。特にマルチステージビルドやNode.jsイメージの選定が重要です。
マルチステージビルドの活用方法
マルチステージビルドは、ビルド環境と実行環境を分離し、最終的なDockerイメージのサイズを小さくする手法です。以下にテンプレート例を示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# ビルド段階(Node.js環境でアプリを構築) FROM node:20 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # 実行段階(最小限のOSでアプリを実行) FROM node:20-slim WORKDIR /app COPY --from=builder /app/dist ./dist COPY package*.json ./ RUN npm install --production CMD ["node", "dist/main.js"] |
マルチステージビルドの利点
- ビルドに必要な依存関係や開発ツールを不要な段階で含まない
- 最終イメージサイズが20%〜50%小さくなるケースが多い
Node.jsイメージ選定時の注意点
- 開発環境:
node:latestを使用して最新機能を活用(※2023年現在、Node.js 20系が推奨) - 本番環境:
node:20-slimやnode:alpineで軽量化とセキュリティ強化
docker-compose.ymlでのサービス定義の最適化方法
複数のマイクロサービスを扱う際、docker-compose.ymlの設計がスムーズな運用に直結します。ネットワーク構成やボリュームマッピングの工夫がポイントです。
ネットワーク構成の工夫とベストプラクティス
Docker Composeで定義されたデフォルトネットワークを活用すると、サービス間通信が簡易化されます。以下に基本構造を示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: '3.8' services: service-a: image: my-service-a networks: - backend service-b: image: my-service-b depends_on: - service-a networks: - backend networks: backend: |
| 項目 | 値 | 補足 |
|---|---|---|
| ネットワーク名 | backend |
サービス間通信専用のネットワークに定義 |
| depends_on | service-a |
起動順序を保証するが、起動完了を待たない注意点あり |
注意事項
depends_onはコンテナの作成順を制御しますが、サービス自体の起動状態(例:REST APIの立ち上げ)には関与しません。ヘルスチェックで対応する必要があります。
ボリュームマッピングの詳細な設定方法
ロギングやデータ永続化に必要なボリュームは、以下のように定義します。
|
1 2 3 4 5 |
volumes: - type: volume name: service-a-logs source: ./logs/service-a |
- 開発環境:
./logsをホストマシンのディレクトリにマッピングして実時監視 - 本番環境:Docker Volumeを使用し、永続的なデータ保存を確立
マイクロサービス間通信の設定方法とコード例
Dockerネットワーク内でサービスを参照するには、サービス名を直接使用できます。ただし外部サービスとの連携には追加設定が必要です。
サービス発見メカニズムの原理と実装例
docker-compose.ymlで定義されたネットワーク内では、サービス名が自動的にDNSレコードとして解決されます。以下にTypeScriptでの実装例を示します。
|
1 2 3 4 5 6 7 |
// service-aのルーター設定 @Get('/data') getFromServiceB() { // サービス名「service-b」で通信可能(Docker Composeが自動的にIPアドレス解決) return this.httpService.get('http://service-b/api/data').pipe(map(res => res.data)); } |
メリット
- サービス名がIPアドレスに自動変換されるため、手動設定不要
- レジストリの更新も不要
環境変数による外部サービス接続管理方法
外部サービス(例:データベース)への接続情報を管理するにはdocker-compose.envや.envファイルを使用します。
|
1 2 3 4 |
environment: DB_HOST: db-host.example.com DB_PORT: 5432 |
- 開発環境:ローカルのDB接続情報
- 本番環境:プロキシ経由でセキュアに接続(例:
https://db-proxy/)
環境変数管理のベストプラクティスとdocker-compose.override.ymlの活用方法
.envファイルやdocker-compose.override.ymlを使用し、開発・本番環境の分離を実現します。
.envファイルの詳細な使用法とセキュリティ対策
開発環境では以下のように.envファイルを作成します。
|
1 2 3 4 |
NODE_ENV=development PORT=3001 DATABASE_URL=postgres://user:password@localhost:5432/dbname |
- 本番環境:
docker-compose.prod.envとして別ファイルに定義 - 秘密管理:Docker SwarmやKubernetesのSecrets機能で安全に保存
docker-compose.override.ymlの使い方と具体例
docker-compose.override.ymlは、開発環境での設定を上書きするために使用します。以下が例です。
|
1 2 3 4 5 6 7 |
services: service-a: ports: - "3001:3001" environment: NODE_ENV: development |
- 用途:本番用の
docker-compose.ymlと開発用を分離 - 実装例:ローカルでのホストマッピングや環境変数上書きに使用
Dockerイメージのビルド・プッシュ手順と最新情報確認方法
ローカルでの確認からレジストリへの公開まで、スムーズなフローで進めます。
ローカルでのビルド確認手順
|
1 2 3 |
docker build -t my-nestjs-service . docker run --rm -p 3001:3001 my-nestjs-service |
- キャッシュ最適化:
--no-cacheフラグで最新の依存関係を確保 - タグ付けベストプラクティス:
latest,v1.0.0などバージョン管理に注意
レジストリへのPush手順とセキュリティ対策
|
1 2 3 |
docker tag my-nestjs-service registry.example.com/myorg/myapp:latest docker push registry.example.com/myorg/myapp:latest |
- プライベートレジストリ:企業内での共有に適す
- パブリックレジストリ: Docker Hubなどへの公開は開発者向けのみで限定
本番環境のコンテナ構成とヘルスチェックの設定方法
プロダクション環境では、性能チューニングやセキュリティ対策が不可欠です。
リソース制限と自動スケーリングの実装例
docker-compose.ymlに以下のように記載します。
|
1 2 3 4 5 |
resources: limits: memory: 512M cpu: "0.5" |
- メモリ:アプリケーションのスループットを安定させるための上限設定
- CPU:ロードバランサーと連携して自動スケーリングを実現
ヘルスチェックの代替手段とcurlコマンドの注意点
以下のようにヘルスエンドポイントを定義します。
|
1 2 3 4 5 6 |
healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3001/health"] interval: 5s timeout: 1s retries: 3 |
代替手段
curlがインストールされていない場合、以下をDockerfileに追加:
Dockerfile
RUN apt-get update && apt-get install -y curl
- 効果
- コンテナの不具合を早期に検知し、再起動やフェイルオーバーを自動化
まとめと今後の展望
以上で、NestJSマイクロサービスのDockerデプロイ手順について解説しました。NestJS microservices Docker デプロイ手順のキーワードを意識しながら、開発環境から本番環境までの一貫した運用が可能になります。実装中に問題があれば、コメント欄でお気軽にご相談ください。