やりたいこと
- Docker上にPostgreSQL Serverを構築する
- データは永続化したいためPostgreSQL Serverのコンテナとは別コンテナにする
- データ保持用のコンテナからバックアップおよびリストアする
データ保持用コンテナの作成
参考:Manageing data in containers
Dockerの公式サイトのドキュメントには、永続的なデータをコンテナ間で共有したい場合や非永続コンテナから使用したい場合、Data Volume Containerと呼ばれるコンテナを作成し、そこからデータをマウントするのが最善であると記述されています。
このベストプラクティスに従い、PostgreSQL Serverコンテナ用のデータボリュームコンテナを以下の様に作成します。
条件
- 最低限のOS機能のみ必要なため、ベースとするdockerイメージは __busybox__にする
- PostgreSQL ServerコンテナはPostgreSQL公式のdockerイメージを使用するためデータ格納ディレクトリは
/var/lib/postgresql/data
となり、このディレクトリをデータボリュームコンテナから可能にする
dockerイメージの作成
上記の条件からPostgreSQL Serverコンテナ用のデータボリュームコンテナのdockerイメージを作成します。
FROM busybox
MAINTAINER xxx <xxx@gmail.com>
VOLUME /var/lib/postgresql/data
CMD ["/bin/true"]
$ docker build -t xxx/postgresql-storage .
xxx/postgresql-storage
は作成するdockerイメージの名前で、
.
はDockerfileのあるディレクトリになります。
コンテナの作成
作成したdockerイメージを元にデータボリュームコンテナを作成します。
$ docker create --name postgresql-storage xxx/postgresql-storage
PostgreSQL Serverコンテナの作成
PostgreSQL公式のdockerイメージからコンテナを作成します。
コンテナ作成時に作成したデータボリュームコンテナをマウントさせます。
docker run --volumes-from postgresql-storage --name postgresql-server -p 15432:5432 -e POSTGRES_USER=xxx -e POSTGRES_PASSWORD=xxx -d postgres
--volumes-from postgresql-storage
がデータボリュームコンテナのマウントを指定している部分になります。
データのバックアップ・リストア・マイグレーション
データボリュームコンテナにある永続データの操作は以下の様に行います。
バックアップ
docker run --rm --volumes-from postgresql-storage -v $(pwd):/backup xxx/postgresql-storage tar cvf /backup/backup.tar /var/lib/postgresql/data
--volumes-from postgresql-storage
にバックアップ元のコンテナを指定します。
リストア・マイグレーション
注)リストアはバックアップを作成したコンテナに対して行い、マイグレーションは異なるコンテナに対して行います。
docker run --rm --volumes-from postgresql-storage -v $(pwd):/backup xxx/postgresql-storage tar xvf /backup/backup.tar
--volumes-from postgresql-storage
にリストア・マイグレーション先のコンテナを指定します。