Dockerのデータボリュームのバックアップを試してみます。
データボリュームのバックアップを取るためには、まずそのデータボリュームをマウントしたデータボリューム・コンテナを作成します。
データボリューム(Data Volume)とデータボリューム・コンテナ(Data Volume Container )に関しては下記の関連ページをご覧下さい。
Data Volume Container について [Dockerの永続化]
これから下記のような構成のデータボリューム・コンテナを作成します。
MySQLサーバーとしてのコンテナで、名前がmycon1のデータボリューム・コンテナを作成します。下記コマンドによってmyvol1という名前のデータボリュームも自動で生成されます。
1 |
docker run --name mycon1 -v myvol1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass -d mysql |
作成したコンテナの起動を確認。
1 2 3 4 |
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 93984335074f mysql "docker-entrypoint.s…" 25 seconds ago Up 24 seconds 3306/tcp, 33060/tcp mycon1 |
同時に作成したデータボリュームを確認。
1 2 3 4 |
docker volume ls DRIVER VOLUME NAME local myvol1 |
作成したコンテナに入り、MySQLに接続します。
1 2 |
docker exec -it mycon1 /bin/bash root@93984335074f:/# mysql -uroot -ppass |
データベースの一覧を表示。
1 2 3 4 5 6 7 8 9 10 |
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec) |
sample01という名前のデータベースを作成します。
1 2 |
mysql> CREATE DATABASE sample01; Query OK, 1 row affected (0.01 sec) |
作成したデータベースを確認。
1 2 3 4 5 6 7 8 9 10 11 |
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sample01 | | sys | +--------------------+ 5 rows in set (0.00 sec) |
データボリュームのバックアップ
作成したsample01データベースが保存されているデータボリュームであるmyvol1のバックアップをおこないます。上述した様に、データボリュームのバックアップを取るためには、まずそのデータボリュームをマウントしたデータボリューム・コンテナを作成します。すでにmyvol1とマウントしたmycon1のデータボリューム・コンテナを作成しているので次へ進みます。
ホスト側のカレントディレクトリ($PWD)に、MySQLのデータが保存されている「/var/lib/mysql」のバックアップ(backup.tarという名前にした)を取りだすだけのコンテナを作成します。と言ってもこのコンテナは–rmオプションによってすぐに破棄されます。
1 |
docker run --rm --volumes-from mycon1 -v $PWD:/backup busybox tar cvf /backup/backup.tar /var/lib/mysql |
あらためて下記イラストによってバックアップする過程を説明してみます。
myvol1データボリュームのバックアップを取るためには、マウントしているmycon1データボリューム・コンテナを利用します(–volumes-fromで指定)。busyboxは軽量のLinuxイメージで、tarコマンドを利用するために利用します。つまりbusyboxで作成したコンテナ内で対象とするファイル群のバックアップファイル(backup.tar)を作成し、そのコンテナ内の/backupディレクトリに保存しています。backupディレクトリは、ホスト側のカレントディレクトリ($PWD)とマウントしているので、結果的にdocker runを実行しているホスト側のカレントディレクトリにバックアップファイル(backup.tar)が保存されます。
成功すれば、ホスト側のカレントディレクトリにbackup.tarファイルが生成されます。
1 2 3 |
ls backup.tar |
リストア
次にこのbackup.tarバックアップファイルのリストアを試してみます。
mycon2という名前のMySQLサーバのコンテナを新規に作成し、このコンテナにバックアップファイルをリストアすることを想定します。下記コマンドによって同時にデータボリュームであるmyvol2も生成されます。
1 |
docker run --name mycon2 -v myvol2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass -d mysql |
myvol2が生成されていることを確認。
1 2 3 4 5 |
docker volume ls DRIVER VOLUME NAME local myvol1 local myvol2 |
mycon2コンテナが作成されたことを確認。もちろんこの新しいコンテナには先ほど作成したsample01データベースは存在しません。これからこのコンテナにバックアップデータをリストアして、sample01データベースが表示されることを確認します。
1 2 3 4 |
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 531c3df71979 mysql "docker-entrypoint.s…" 41 seconds ago Up 40 seconds 3306/tcp, 33060/tcp mycon2 |
リストアするためだけのコンテナを作成します。バックアップした際と同様にこのコンテナも–rmオプションによってすぐに破棄されます。
1 |
docker run --rm --volumes-from mycon2 -v $PWD:/backup busybox tar xvf /backup/backup.tar |
ホスト側のカレントディレクトリ($PWD)に置いてあるbackup.tarを解凍します。–volumes-fromに新規作成したmycon2コンテナを指定しています。結果的に、mycon2コンテナに紐付いているデータボリュームであるmyvol2に解凍されたデータが保存されます。
MySQLに解凍したデータが反映されるように、コンテナが起動したままの場合は「restart」します。
1 |
docker restart mycon2 |
新規に作成したMySQLサーバのコンテナであるmycon2に入り、sample01データベースがリストアされていることを確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
docker exec -it mycon2 /bin/bash root@531c3df71979:/# mysql -uroot -ppass mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sample01 | | sys | +--------------------+ 5 rows in set (0.00 sec) |