本番環境のデータストレージに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は、次のように管理することをおすすめします。
- 必ず公式のPostgresイメージを使いましょう。
- Postgresの設定はDocker Composeファイルに保存しましょう(例は下記を参照)。
- Docker Composeファイルは、プロジェクトのソースコードと一緒にソース管理(Gitなど)にコミットしましょう。
- チーム全員が開発用Postgresで同じ設定を使うようにしましょう。
- 必要に応じて、Dockerイメージの高度な機能を使ってPostgresイメージを初期化しましょう。
- コンテナがデータを保存するための
volumeを必ず指定し、実行をまたいでデータが保持されるようにしましょう。 - イメージの組み込み機能を使って、初期化用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でバックアップを作成する
基本的なバックアップ戦略は次のとおりです。
- 次の
pg_dumpを実行してデータベースをエクスポートします:docker exec postgres pg_dump -U myuser mydatabase > ./backups/backup_$(date +%F).sqlこのコマンドは、
backupsディレクトリ内にデータベースのバックアップを作成します。 - cronジョブなどのスケジューリング機能を設定し、このコマンドを定期的(例: 毎日や毎週)に実行できます。
0 2 * * * docker exec postgres pg_dump -U myuser mydatabase > /path/to/backups/backup_$(date +\%F).sql - バックアップをS3などのストレージにアップロードします
aws s3 cp ./backups/backup_$(date +%F).sql s3://your-bucket-name/path/to/backup/さらに、WAL(Write-Ahead Logging)アーカイブを設定して変更の継続的なバックアップを作成し、ポイントインタイムリカバリを可能にすることもできます。ただし本記事の範囲外なので、詳しくは公式ドキュメントをご覧ください。
バックアップを復元する
- S3からバックアップをダウンロードします
aws s3 cp s3://your-bucket-name/path/to/backup/backup_YYYY-MM-DD.sql ./backups/このコマンドは、S3からローカルのbackupsディレクトリにバックアップファイルをダウンロードします。
- データベースに復元します
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 Studio利用者の声
「Beekeeper Studioで、これまでのPostgreSQLのワークフローが完全に置き換わりました。高速で直感的、データベース作業がまた楽しくなりました。」
「多くのデータベースGUIを試しましたが、Beekeeperは機能とシンプルさのバランスが完璧です。とにかくちゃんと動きます。」