- 第1回:Macで.NET 9開発環境を整える(完了済み)
- 第2回:PostgreSQLコンテナとWebAppの連携(本記事)
目次
- 概要
- 前提環境
- ディレクトリ構成
- docker-compose.yml の構成
- 各構成要素の解説
- 環境変数の設定
- PostgreSQL設定ファイルの補足
- ローカルでの起動と確認
- 停止・再起動
- トラブルシュート
- まとめ
- 次回予告
概要
第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__DefaultにHost=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_on が service_healthy になっているか確認 |
| Mシリーズでイメージ取得に失敗 |
platform: linux/arm64 が存在するか確認 |
| ポート競合エラー | 他のアプリで 9999 / 5432 が使用されていないか確認 |
まとめ
ここまでで、次の環境が整いました。
- PostgreSQLコンテナ(DB)
- .NET 9 WebAppコンテナ(Web)
- ローカルネットワーク内で相互接続
- 環境変数
.envで接続情報を安全に管理
次回予告
第3回では、VS Codeを使ったアプリの修正・デバッグ方法を解説します。
ブレークポイントの設定、ホットリロード、.vscode/launch.json の使い方など、
「コードを動かしながら理解する」開発フローを学びます。