DockerでPostgreSQLを実行する
永続データストレージ、環境変数ベースの設定、カスタム初期化スクリプト、アプリケーション接続のための適切なネットワーキングを備えたPostgreSQLをDockerで実行する方法を学びます。
Real-World Stacks
詳細な説明
DockerでのPostgreSQL
DockerでPostgreSQLを実行することは、開発環境やテストに最適です。公式imageは環境変数に基づいて初期化を自動的に処理します:
docker run -d \
--name postgres \
-e POSTGRES_USER=myuser \
-e POSTGRES_PASSWORD=mypassword \
-e POSTGRES_DB=myapp \
-p 5432:5432 \
postgres:16
環境変数
公式PostgreSQL imageは以下の主要な変数をサポートしています:
| 変数 | 用途 | デフォルト |
|---|---|---|
POSTGRES_PASSWORD |
スーパーユーザーパスワード(必須) | なし |
POSTGRES_USER |
スーパーユーザー名 | postgres |
POSTGRES_DB |
デフォルトデータベース名 | POSTGRES_USERと同じ |
PGDATA |
データディレクトリパス | /var/lib/postgresql/data |
永続データストレージ
volumeがない場合、containerが削除されるとデータベースデータが失われます。データディレクトリには常にvolumeをマウントしてください:
docker run -d \
--name postgres \
-e POSTGRES_USER=myuser \
-e POSTGRES_PASSWORD=mypassword \
-e POSTGRES_DB=myapp \
-v pgdata:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:16
カスタム初期化スクリプト
SQLまたはshellスクリプトを/docker-entrypoint-initdb.d/に配置すると、データベースが最初に作成される際に実行されます:
docker run -d \
--name postgres \
-e POSTGRES_USER=myuser \
-e POSTGRES_PASSWORD=mypassword \
-v pgdata:/var/lib/postgresql/data \
-v $(pwd)/init-scripts:/docker-entrypoint-initdb.d:ro \
-p 5432:5432 \
postgres:16
スクリプトはアルファベット順に実行され、最初の初期化時(データディレクトリが空の場合)にのみ実行されます。一般的な用途:
- 追加データベースの作成
- シードデータの読み込み
- エクステンションのセットアップ(
CREATE EXTENSION pgcrypto;) - 追加ユーザーとロールの作成
カスタムPostgreSQL設定
デフォルトのpostgresql.confを上書きします:
docker run -d \
--name postgres \
-e POSTGRES_USER=myuser \
-e POSTGRES_PASSWORD=mypassword \
-v pgdata:/var/lib/postgresql/data \
-v $(pwd)/postgresql.conf:/etc/postgresql/postgresql.conf:ro \
-p 5432:5432 \
postgres:16 -c 'config_file=/etc/postgresql/postgresql.conf'
または個別のパラメータを直接渡します:
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=mypassword \
postgres:16 \
-c shared_buffers=256MB \
-c max_connections=100 \
-c work_mem=4MB
別のContainerからの接続
container間通信にはDockerネットワーキングを使用します:
docker network create app-net
docker run -d \
--name postgres \
--network app-net \
-e POSTGRES_PASSWORD=mypassword \
-v pgdata:/var/lib/postgresql/data \
postgres:16
docker run -d \
--name api \
--network app-net \
-e DATABASE_URL=postgres://postgres:mypassword@postgres:5432/postgres \
my-api-image
接続文字列がホスト名としてpostgres(container名)を使用していることに注目してください。
本番環境のDocker Run
docker run -d \
--name postgres \
--restart unless-stopped \
--memory 2g \
--cpus 2 \
--network app-net \
-e POSTGRES_USER=appuser \
-e POSTGRES_PASSWORD_FILE=/run/secrets/db_password \
-e POSTGRES_DB=production \
-v pgdata:/var/lib/postgresql/data \
-v $(pwd)/init:/docker-entrypoint-initdb.d:ro \
postgres:16 \
-c shared_buffers=512MB \
-c max_connections=200
ユースケース
開発チーム向けにPostgreSQLデータベースをセットアップし、永続ストレージ、スキーマとシードデータを作成する初期化スクリプト、アプリケーションcontainerへのネットワーク接続を備える場合に使用します。