経緯
バックアップ・レストア方法をググるとほとんどの記事はdocker cp
してDockerコンテナの中に入って直接コマンド叩いてたり、docker run
でバックアップ、レストアのコマンドを実行していたりしている記事が多かったのですが、そうではなくてワンライナーで直接バックアップ、レストアする方法が知りたかったのでまとめてみました。
基本的なバックアップ・レストア方法を記載します。もしパスワードやデータベース名が必要な場合は適宜コマンドのオプションで指定してください。
今回はPostgreSQL、MySQL、MongoDBについてまとめますが、その他のDBでも同様の方法で可能だと思います。
定数
以下の定数はコマンド等で確認してください。
CONTAINER_NAME
: Dockerのコンテナ名またはID。docker ps
で確認する。
USERNAME
: Docker内のデータベースのユーザ名
PASSWORD
: Docker内のデータベースのパスワード
DATABASE_NAME
: Docker内のデータベース名
SERVICE_NAME
: docker-composeのyamlに記載しているサービス名。docker-compose config --service
で確認する。
PostgreSQL
Dockerコマンドを使用する場合
バックアップ
docker exec CONTAINER_NAME pg_dumpall -U USERNAME > dump.sql
gzipで圧縮する場合は以下
docker exec CONTAINER_NAME pg_dumpall -U USERNAME | gzip > dump.sql.gz
レストア
cat dump.sql | docker exec -i CONTAINER_NAME psql -U USERNAME
gzipで圧縮されたファイルをレストアする場合は以下
gunzip < dump.sql.gz | docker exec -i CONTAINER_NAME psql -U USERNAME
docker-compose コマンドを使用する場合
バックアップ
docker-compose exec -T SERVICE_NAME pg_dumpall -U USERNAME > dump.sql
レストア
cat dump.sql | docker-compose exec -T SERVICE_NAME psql -U USERNAME
MySQL
Dockerコマンドを使用する場合
バックアップ
docker exec CONTAINER_NAME mysqldump -u USERNAME -pPASSWORD DATABASE_NAME > dump.sql
gzipで圧縮する場合は以下
docker exec CONTAINER_NAME mysqldump -u USERNAME -pPASSWORD DATABASE_NAME | gzip > dump.sql.gz
レストア
cat dump.sql | docker exec -i CONTAINER_NAME mysql -u USER_NAME -pPASSWORD DATABASE_NAME
gzipで圧縮されたファイルをレストアする場合は以下
gunzip < dump.sql.gz | docker exec -i CONTAINER_NAME mysql -u USER_NAME -pPASSWORD DATABASE_NAME
docker-compose コマンドを使用する場合
バックアップ
docker-compose exec -T SERVICE_NAME mysqldump -u USERNAME -pPASSWORD DATABASE_NAME > dump.sql
レストア
cat dump.sql | docker-compose exec -T SERVICE_NAME mysql -u USER_NAME -pPASSWORD DATABASE_NAME
MongoDB
dockerコマンドを使用する場合
バックアップ
docker exec CONTAINER_NAME mongodump --archive > db.dump
gzipで圧縮する場合は以下
docker exec CONTAINER_NAME mongodump --archive --gzip > db.dump.gz
レストア
docker exec -i <mongodb container id or name> mongorestore --archive < db.dump
gzipで圧縮されたファイルをレストアする場合は以下
docker exec -i CONTAINER_NAME mongorestore --archive --gzip < db.dump.gz
docker-compose コマンドを使用する場合
バックアップ
docker-compose exec -T SERVICE_NAME mongodump --archive > db.dump
レストア
docker-compose exec -T SERVICE_NAME mongorestore --archive < db.dump
参考資料
- ローカルから直接Dockerのデータベースを操作する - Qiita, Online; accessed 20–Feb–2021.
- How to restore a PostgreSQL database using Docker, Online; accessed 20–Feb–2021.
- 🐳 mongodump and mongorestore with Docker - DEV Community, Online; accessed 20–Feb–2021.