🧚 お知らせ!Beekeeper Studioは高速でモダンなオープンソースのデータベースGUIです ダウンロード
2024年9月21日 著者: Matthew Rathbone

本番環境のデータストレージにPostgreSQLを使うアプリケーションを開発しているなら、いずれローカルマシンでも開発用にPostgreSQLを動かす必要が出てくるでしょう。

開発ではSQLite、本番ではPostgresといった使い分けができる場合もありますが、アプリ開発が本格化してくると、環境を揃えたくなるはずです。

ローカル開発用Postgres Dockerの例

私はdocker cliよりもdocker-composeを使うほうが好みですが、どちらを選ぶかはお任せします。ここでは両方を紹介します。

ここで使うイメージは、本番環境と同じバージョンに変更することをおすすめします。たとえばpostgres:latestではなくpostgres:9.4を使います。

Docker CLIでPostgreSQL

docker run -d \
  --name psql \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=example \
  -v psql:/var/lib/postgresql/data \
  -p 5555:5432 \
  postgres:latest

これでPostgreSQLサーバーが起動し、localhost:5555で利用できるようになります。dev/postgresのようなスクリプトにまとめて、アプリを起動するたびに実行しましょう。

Docker ComposeでPostgreSQL

私はDocker Composeを使うほうが好みです。データベースの設定を簡単に変更でき、必要に応じてサービス(Redisなど)を追加できるからです。

version: '3'
volumes:
  psql:
services:
  psql:
    image: postgres:latest
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: example # only do this in development
    volumes:
      - psql:/var/lib/postgresql/data # save data between restarts
    ports:
      - 5555:5432 # binds port 5555 on your computer to the postgres port!

こちらも、開発用データベースはlocalhost:5555で利用できます

ローカルでのPostgres開発のおすすめ

開発用Postgresは、次のように管理することをおすすめします。

  1. 必ず公式のPostgresイメージを使いましょう。
  2. Postgresの設定はDocker Composeファイルに保存しましょう(例は下記を参照)。
  3. Docker Composeファイルは、プロジェクトのソースコードと一緒にソース管理(Gitなど)にコミットしましょう。
  4. チーム全員が開発用Postgresで同じ設定を使うようにしましょう。
  5. 必要に応じて、Dockerイメージの高度な機能を使ってPostgresイメージを初期化しましょう。
  6. コンテナがデータを保存するためのvolumeを必ず指定し、実行をまたいでデータが保持されるようにしましょう。
  7. イメージの組み込み機能を使って、初期化用SQLの実行、認証情報の設定、データベースの作成を行いましょう。

Docker対システムへのPostgresインストール

Postgresをそのままコンピューターにインストールすることもできます。主要3 OSすべて向けのビルドが用意されています。一番簡単な方法に思えますが、この方法にはいくつか問題があります。

Postgresをシステムレベルでインストールする場合の問題

  • Postgresが常にシステムサービスとして動作し続ける
  • 一度に手軽にインストール・実行できるPostgresのバージョンは1つだけ
  • 専用のPostgresデータベースが必要なアプリすべてが、同じインスタンスを共有しなければならない
  • マシンのroot/管理者権限が必要
  • チームで作業する場合、各自のセットアップが微妙に異なり、開発設定の共有が難しくなる

Dockerならこれらの問題(のほとんど)を解決できます

Dockerを使えば、開発中の各プロジェクトが正しいバージョンに固定された専用のPostgresを持てます。標準化されたセットアップをチームメンバー間で共有し、ソース管理にコミットすることもできます。

DockerコンテナでPostgresを動かす際の最大の問題は、まあ、Dockerを使ったことがなければDockerを覚えることでしょう。

本番環境でDockerを使ってPostgresを動かす

本番環境で素のDockerを使っている場合、Postgresデータベースの構成は開発用の設定とほぼ同じです

version: '3.8'
volumes:
  psql_data:
    driver: local
services:
  postgres:
    image: postgres:14
    container_name: postgres
    restart: always
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mysecurepassword
      POSTGRES_DB: mydatabase
    volumes:
      - psql_data:/var/lib/postgresql/data
      - ./backups:/backups
    ports:
      - 5432:5432
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U myuser"]
      interval: 30s
      timeout: 10s
      retries: 5

DockerでのPostgresデータベースのバックアップと復元

以下は本番環境のPostgres管理を網羅的に解説するものではありませんが、シンプルなバックアップ戦略の出発点として役立つはずです。

本番環境では、データベースを定期的にバックアップファイルへエクスポートすることで、PostgreSQLのバックアップを自動化できます。cronジョブや専用のバックアップコンテナをスケジュールし、pg_dumpコマンドを定期的に実行して、ホストシステムにマウントされたディレクトリ(例: /backups)にデータベースのデータをエクスポートすれば実現できます。上記の設定のbackupsフォルダーはホストマシン上のディレクトリにマウントされており、バックアップファイルを安全に保存できます。

Docker Postgresでバックアップを作成する

基本的なバックアップ戦略は次のとおりです。

  1. 次の pg_dump を実行してデータベースをエクスポートします:
    docker exec postgres pg_dump -U myuser mydatabase > ./backups/backup_$(date +%F).sql
    

    このコマンドは、backupsディレクトリ内にデータベースのバックアップを作成します。

  2. cronジョブなどのスケジューリング機能を設定し、このコマンドを定期的(例: 毎日や毎週)に実行できます。
      0 2 * * * docker exec postgres pg_dump -U myuser mydatabase > /path/to/backups/backup_$(date +\%F).sql
    
  3. バックアップをS3などのストレージにアップロードします
      aws s3 cp ./backups/backup_$(date +%F).sql s3://your-bucket-name/path/to/backup/
    

    さらに、WAL(Write-Ahead Logging)アーカイブを設定して変更の継続的なバックアップを作成し、ポイントインタイムリカバリを可能にすることもできます。ただし本記事の範囲外なので、詳しくは公式ドキュメントをご覧ください。

バックアップを復元する

  1. S3からバックアップをダウンロードします
      aws s3 cp s3://your-bucket-name/path/to/backup/backup_YYYY-MM-DD.sql ./backups/
    

    このコマンドは、S3からローカルのbackupsディレクトリにバックアップファイルをダウンロードします。

  2. データベースに復元します
      docker exec -i postgres psql -U myuser -d mydatabase < ./backups/backup_YYYY-MM-DD.sql
    

    このコマンドは、psqlを使って実行中のPostgreSQLコンテナにバックアップファイルを復元します。

まとめ

ここまでで、Postgres Dockerコンテナの起動と管理の基本がおわかりいただけたと思います。本番環境のPostgresクラスターを運用するには他にも多くのもの(監視、アラートなど)が必要ですが、上記が始めるきっかけになれば幸いです。

Beekeeper Studioは無料のオープンソースのデータベースGUIです

これまで使った中で最高のSQLクエリ&エディタツールです。データベースの管理に必要なものがすべて揃っています。 - ⭐⭐⭐⭐⭐ Mit

Beekeeper Studioは高速で直感的、そして使いやすいツールです。多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。

BeekeeperのLinux版は100%フル機能。手抜きも機能の妥協も一切ありません。

Beekeeper Studio利用者の声

★★★★★
「Beekeeper Studioで、これまでのPostgreSQLのワークフローが完全に置き換わりました。高速で直感的、データベース作業がまた楽しくなりました。」
— Alex K.、データベース開発者
★★★★★
「多くのデータベースGUIを試しましたが、Beekeeperは機能とシンプルさのバランスが完璧です。とにかくちゃんと動きます。」
— Sarah M.、フルスタックエンジニア

PostgreSQLのワークフローを改善しませんか?

download 無料でダウンロード