データが入ったDBがあると仮定して話を進めます。
##ボリュームと紐づいているコンテナの名前を確認
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b6a79314721 sample-app_web "/bin/sh -c 'rm -f t…" 5 minutes ago Up 5 minutes 0.0.0.0:3000->3000/tcp sample-app_web_1
2ed21c2aac12 postgres "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:5434->5432/tcp sample-app_db_1
NAMES
を参照。今回の場合はsample-app_db_1
##コンテナをストップ
$ docker-compose stop
##バックアップ
docker run --rm --volumes-from sample-app_db_1 -v `pwd`:/backup busybox tar cvf /backup/backup.tar /var/lib/postgresql/data
Postgresqlの場合の例です。
sample-app_db_1
の部分に、先ほどのステップで確認したコンテナ名を設定
mysplの場合/var/lib/postgresql/data
の部分を/var/lib/mysql
に変更
(mysqlの場合)
$ docker run --rm --volumes-from sample-app_db_1 -v `pwd`:/backup busybox tar cvf /backup/backup.tar /var/lib/mysql
##コンテナとボリュームを削除→コンテナを再作成
$ docker-compose down --volumes
$ docker-compose up -d
##コンテナをストップ
$ docker-compose stop
##リストア
$ docker run --rm --volumes-from sample-app_db_1 -v `pwd`:/backup busybox tar xvf /backup/backup.tar
(mysqlの場合)
同じ
$ docker run --rm --volumes-from sample-app_db_1 -v `pwd`:/backup busybox tar xvf /backup/backup.tar
##最後に
本当はこの方法より、SQLによるダンプでバックアップを取るほうが望ましいらしいです。
まだ検証できていないので、興味がある方はご自身で調べてみてください。
##参考