0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第2回:アプリをコンテナ化して、PostgreSQLコンテナと一緒にローカル実行する

Posted at
  • 第1回:Macで.NET 9開発環境を整える(完了済み)
  • 第2回:PostgreSQLコンテナとWebAppの連携(本記事)

目次

  1. 概要
  2. 前提環境
  3. ディレクトリ構成
  4. docker-compose.yml の構成
  5. 各構成要素の解説
  6. 環境変数の設定
  7. PostgreSQL設定ファイルの補足
  8. ローカルでの起動と確認
  9. 停止・再起動
  10. トラブルシュート
  11. まとめ
  12. 次回予告

概要

第1回で開発環境とソースコード(GitHubリポジトリ)を取得済みの前提です。
本記事では、そのソースコードをもとに、PostgreSQLコンテナとWebAppコンテナを連携させ、ローカル環境でアプリを起動する手順を解説します。


前提環境

  • macOS(Apple Silicon Mシリーズ)
  • .NET SDK 9.x
  • Docker Desktop 最新版
  • Visual Studio Code(C#拡張導入済み)
  • GitHubリポジトリ https://github.com/eyes9919/dotnet9-webapp
    (第1回で git clone 済み)

ディレクトリ構成(リポジトリ内)

dotnet9-webapp/
├── docker-compose.yml           # Web+DBを定義(本記事で使用)
├── pgconf/
│   └── postgresql.conf          # PostgreSQL設定
├── src/
│   └── WebApp/
│       ├── Dockerfile           # Webアプリ用Docker設定
│       ├── Pages/
│       └── ...
└── ...

この構成をそのまま使用します。ファイルを改変する必要はありません。


1. docker-compose.yml の構成

docker-compose.yml はリポジトリ直下にあり、2つのサービス(db, web)を定義しています。

services:
  db:
    image: postgres:18
    container_name: postgres-db
    platform: linux/arm64   # Apple Silicon対応
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    ports:
      - "5432:5432"
    volumes:
      - postgres-data18:/var/lib/postgresql/data
      - ./pgconf/postgresql.conf:/etc/postgresql/postgresql.conf:ro
    command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB} -h 127.0.0.1 -p 5432"]
      interval: 5s
      timeout: 3s
      retries: 5

  web:
    build:
      context: ./src/WebApp
      dockerfile: Dockerfile
    container_name: dotnet9-webapp
    platform: linux/arm64
    depends_on:
      db:
        condition: service_healthy
    environment:
      ConnectionStrings__Default: "Host=db;Port=5432;Database=${POSTGRES_DB};Username=${POSTGRES_USER};Password=${POSTGRES_PASSWORD};Pooling=true;Keepalive=30;"
      ASPNETCORE_ENVIRONMENT: "Container_Development"
    ports:
      - "9999:8080"
    restart: unless-stopped

volumes:
  postgres-data18: {}

2. 各構成要素の解説

(1) Apple Silicon対応

platform: linux/arm64 を指定しています。
これにより、MシリーズMacでも問題なく動作します。

(2) PostgreSQL設定

PostgreSQL 18を使用し、永続化はDockerボリューム postgres-data18 に保持します。
追加で pgconf/postgresql.conf をマウントし、任意の設定を適用できます。

(3) WebAppの接続設定

  • ConnectionStrings__DefaultHost=db を指定。
    Docker Composeの内部DNSで、db サービス名がホスト名として解決されます。
  • ASPNETCORE_ENVIRONMENT"Container_Development" を指定しており、アプリ内部で環境を識別可能。

(4) ポート構成

  • Web: ホスト 9999 → コンテナ 8080
    → ブラウザでアクセスする際は http://localhost:9999
  • DB: ホスト 5432 → コンテナ 5432

3. 環境変数の設定

Composeは .env ファイルを自動的に読み込みます。
次のようにプロジェクト直下に .env を作成してください。

POSTGRES_USER=appuser
POSTGRES_PASSWORD=apppass
POSTGRES_DB=appdb

補足:
.env ファイルを作成することで、機密情報をコードに埋め込まずに管理できます。


4. PostgreSQL設定ファイルの補足

pgconf/postgresql.conf はリポジトリに含まれています。
これは postgres コンテナの /etc/postgresql/postgresql.conf にマウントされ、
以下のような設定を含みます(抜粋例):

shared_buffers = 512MB
work_mem = 16MB
maintenance_work_mem = 256MB
effective_cache_size = 2GB
wal_buffers = 16MB
max_wal_size = 2GB
min_wal_size = 256MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
synchronous_commit = on
random_page_cost = 1.1
effective_io_concurrency = 100
TimeZone = 'Asia/Tokyo'
log_timezone = 'Asia/Tokyo'

この設定は Fargate向けチューニング済み の軽量構成ですが、ローカル環境でも問題なく動作します。


5. ローカルでの起動と確認

# イメージをビルド
docker compose build

# コンテナを起動(バックグラウンド)
docker compose up -d

起動確認:

docker compose ps

ログを確認:

docker compose logs -f db
docker compose logs -f web

Webブラウザでアクセス:

http://localhost:9999

正常に動作すれば、ログインページ(/Users/Login)が表示されます。


6. 停止・再起動

# 停止
docker compose down

# 再起動
docker compose up -d

DBデータをリセットしたい場合は以下も実行します。

docker volume rm postgres-data18

7. トラブルシュート

症状 対処法
PostgreSQLが起動しない .env の環境変数が設定されているか確認
WebAppがDBに接続できない depends_onservice_healthy になっているか確認
Mシリーズでイメージ取得に失敗 platform: linux/arm64 が存在するか確認
ポート競合エラー 他のアプリで 9999 / 5432 が使用されていないか確認

まとめ

ここまでで、次の環境が整いました。

  • PostgreSQLコンテナ(DB)
  • .NET 9 WebAppコンテナ(Web)
  • ローカルネットワーク内で相互接続
  • 環境変数 .env で接続情報を安全に管理

次回予告

第3回では、VS Codeを使ったアプリの修正・デバッグ方法を解説します。
ブレークポイントの設定、ホットリロード、.vscode/launch.json の使い方など、
「コードを動かしながら理解する」開発フローを学びます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?