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へのネットワーク接続を備える場合に使用します。

試してみる — Docker Run Command Builder

フルツールを開く