ご覧いただきありがとうございます!
領護(りょうご)です。
開発環境でPostgreSQLコンテナを利用している際、「本番環境のデータをローカルで検証したい」「バックアップデータを手軽に復元したい」と思ったことないですか?
この記事では、Docker環境におけるPostgreSQLのデータを、ローカル環境へエクスポート(バックアップ)し、そのデータを再度インポート(リストア)する手順を解説します。
実行環境
Docker:28.5.1
PostgreSQL:16
コンテナ構成
今回、解説に使用するコンテナ構成です。
DjangoとPostgreSQLを使用してWEBサイトを作成する構成です。
PostgreSQLコンテナ詳細
CONTAINER ID:2d7fa7dec03c
IMAGE:postgres:16
NAMES:sample_db
USER NAME:sample_user
DB NAME:sample_project_db
「USER NAME」と「DB NAME」は、PostgreSQLコンテナを作成する際に設定した値になります。
コンテナ構成の調べ方
docker ps
コマンドプロンプトやPowerShellなどのターミナルを開き、上記のコマンドを入力して実行します。
実行すると、現在稼働している全てのコンテナ情報(ID、名前、イメージ、ポートマッピングなど)が一覧で表示されます。
その中のPostgreSQLコンテナの「CONTAINER ID」または「NAMES」を確認して控えておいてください。
DBのデータをエクスポート(コンテナ → ローカル)
まずは、PostgreSQLコンテナ内のDBデータをローカル環境のデスクトップにエクスポート(バックアップ)する手順を解説します。
PostgreSQLコンテナ内でSQLファイルを生成
「pg_dump」コマンドを使って、DBデータ全体をSQLファイルとしてコンテナ内に書き出します。
docker container exec -it [コンテナID/コンテナ名] bash
docker container exec -it sample_db bash
PostgreSQLコンテナに入るコマンドを入力して実行します。
[コンテナID/コンテナ名]:控えた「CONTAINER ID」または「NAMES」に置き換えてください。
pg_dump -U [PostgreSQLのユーザー名] -d [DB名] > [任意のファイル名].sql
pg_dump -U sample_user -d sample_project_db > sample_project_db.sql
pg_dumpコマンドを実行して、データをエクスポートします。
下記の内容に置き換えてコマンドを実行してください。
[PostgreSQLのユーザー名]:PostgreSQL設定時に指定したユーザー名
[DB名]:エクスポートしたいデータベース名
[任意のファイル名]:コンテナ内に生成したいSQLファイル名
ls
lsコマンドで、指定したSQLファイルがコンテナのルートディレクトリに生成されているか確認します。
生成されていれば、データのエクスポートは完了です。
コンテナからローカル環境へファイルをコピー
生成したSQLファイルはまだPostgreSQLコンテナ内にあります。
「docker cp」コマンドでローカルのデスクトップにファイルをコピーします。
exit
exitコマンドを実行して、PostgreSQLコンテナから出ます。
docker cp [コンテナID/コンテナ名]:/[エクスポートしたファイル名].sql [保存先のローカルパス]
docker cp sample_db:/sample_project_db.sql C:\Users\ユーザー名\Desktop\sample_project_db.sql
先ほどエクスポートしたSQLファイルをローカル環境にコピーするコマンドを実行します。
下記の内容に置き換えてコマンドを実行してください。
[コンテナID/コンテナ名]:控えた「CONTAINER ID」または「NAMES」を入力
[エクスポートしたファイル名]:先ほどエクスポートしたSQLファイル名を入力
[保存先のローカルパス]:保存したいローカルのパスを入力
※ デスクトップに保存したい場合は、例を参考に入力してください。
Successfully copied 27.1kB to C:\Users\ユーザー名\Desktop\sample_project_db.sql
正常にコピーが完了すると、上記のようなメッセージが表示されます。
これで、ローカル環境にDBのバックアップデータが保存されました。
DBのデータをインポート(ローカル → コンテナ)
次に、ローカル環境にあるSQLファイルをPostgreSQLコンテナに取り込み、DBにインポート(リストア)する手順を解説します。
ローカルからPostgreSQLコンテナへファイルをコピー
ローカルにあるインポートしたいSQLファイルを、「docker cp」コマンドを使ってコンテナ内に転送します。
docker cp [インポートしたいSQLファイルのローカルパス] [コンテナID/コンテナ名]:/[コンテナ内の保存先パス]
docker cp C:\Users\ユーザー名\Desktop\sample_project_db.sql sample_db:/sample_project_db.sql
先ほどローカル環境にコピーしたSQLファイルをPostgreSQLコンテナに転送するコマンドを実行します。
下記の内容に置き換えてコマンドを実行してください。
[コンテナID/コンテナ名]:控えた「CONTAINER ID」または「NAMES」を入力
[インポートしたいSQLファイルのローカルパス]:インポートしたいSQLファイルのローカルパスを入力
[コンテナ内の保存先パス]:保存したいコンテナ内のパスを入力
※ デスクトップからインポートしたい場合は、例を参考に入力してください。
Successfully copied 27.1kB to sample_db:/sample_project_db.sql.
正常に転送が完了すると、上記のようなメッセージが表示されます。
これで、ローカル環境からPostgreSQLコンテナにデータが転送されました。
コンテナ内でDBにデータをインポート
コンテナ内に転送したSQLファイルを使って、「psql」コマンドでデータをデータベースに流し込みます。
注意!
データをインポートする前に、インポート先のデータベース内の既存のデータを全て削除してから実行することをおすすめします。
既存データとインポートデータが混ざったり、プライマリキーの重複エラーが発生したりするのを防げます。
docker container exec -it [コンテナID/コンテナ名] bash
docker container exec -it sample_db bash
PostgreSQLコンテナに入るコマンドを入力して実行します。
[コンテナID/コンテナ名]:控えた「CONTAINER ID」または「NAMES」に置き換えてください。
ls
lsコマンドで、コピーしたSQLファイルがコンテナ内に存在するか確認します。
psql -U [PostgreSQLのユーザー名] -d [DB名] < [任意のファイル名].sql
psql -U sample_user -d sample_project_db < sample_project_db.sql
psqlコマンドを実行して、データをインポートします。
下記の内容に置き換えてコマンドを実行してください。
[PostgreSQLのユーザー名]:PostgreSQL設定時に指定したユーザー名
[DB名]:インポートしたいデータベース名
[任意のファイル名]:コンテナ内に転送したSQLファイル名
これで、DBデータのインポートが完了しました。
お疲れさまでした!
最後に
今回は、Dockerコンテナ内のPostgreSQLデータを手軽にエクスポート(バックアップ)し、インポート(リストア)する手順を解説しました。
バックアップの取得や、初期データ・テストデータの流し込み、本番環境のデータを使ったローカルでの再現テストなど、様々なシーンで役立ちます。
ぜひ参考にしてみてください!