こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。
Docker環境で開発をするにあたり、データベースのように、コンテナを破棄しても保持し続けたいデータが存在する場合があります。
そのような時はデータボリュームを活用することでデータの永続化をすることができます。
データボリュームの詳細についてはDockerのデータを永続化!Data Volume(データボリューム)の理解から始める環境構築入門で紹介をしました。
今回はデータボリュームをファイルとしてバックアップする方法、およびファイルからリストアする方法について紹介をします。
データボリュームのバックアップ・リストアができるようになると以下のようなメリットがあります。
- Docker環境のスナップショット(= あるときの状態)を保存できるため、リカバリが容易になる
- ファイルにデータボリュームの情報が保存されるため、他者と共有することができる
今回はWordPressのデータベース情報を具体例に、データボリュームのバックアップ・リストアの方法を紹介します。
目次
今回の検証環境の紹介
まずはじめに、今回データボリュームのバックアップ・リストアを検証するDocker環境について紹介をします。
冒頭でも紹介したように今回はWordPressのデータベース情報をサンプルとして利用します。
検証環境は、WordPressが実行される『wp_web_con』コンテナ、MySQLが実行される『wp_db_con』コンテナ、データベースの情報を保存する『mysql_data』というデータボリュームで構成されています。
図で表現すると以下のようになります。
図にも記載をしていますが、WordPressからMySQLへ接続する際の設定は以下のようにします。
WordPressのDB接続設定
変数 | 値 |
host | db |
name | wordpress |
user | wp_user |
password | wp_password |
port | 3306(デフォルト) |
バージョンは、WordPressは5.2.2、MySQLは5.7を利用します。
wordpressコンテナとdbコンテナは複数のコンテナを起動設定を一元管理できるDocker Composeを利用して連携させます。
参考: 検証環境(WordPressのDocker環境)の構築手順
検証環境として利用するWordPressのDocker環境の構築方法について紹介します。
実際に手元でデータボリュームのバックアップ・リストアを確認したいという方は参考にしていただければと思います。
環境構築手順とはいっても、実質docker-compose.yml
を用意するだけですので準備は非常に完了です。
まずは作業用ディレクトリを作成と移動をします。
$ mkdir my_wordpress && cd $_
作業ディレクトリ配下に以下のようなdocker-compose.yml
を作成してください。
docker-compose.yml
version: '3'
services:
wordpress:
image: wordpress:5.2.2-php7.3-apache
ports:
- '80:80' # ローカルのport80でコンテナのport80にアクセスできるようにする
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db # データベースコンテナ名と一致させる
WORDPRESS_DB_NAME: wordpress # MYSQL_DATABASEと一致させる
WORDPRESS_DB_USER: wp_user # MYSQL_USERと一致させる
WORDPRESS_DB_PASSWORD: wp_pass # MYSQL_PASSWORDと一致させる
container_name: "wp_web_con"
db:
image: mysql:5.7
volumes:
- mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root_pass
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_pass
container_name: "wp_db_con"
volumes:
mysql_data:
docker-compose.yml
作成後、以下のコマンドでWordPressのDocker環境が立ち上がります。
localhost:80
に接続し、WordPressの初期設定画面が表示されれば環境構築はOKです。
$ docker-compose up
Dockerを利用したWordPressの環境構築手順についての詳細はMAMP・XAMPはもう古い?DockerでWordPressのローカル開発環境を一瞬で作成する方法で紹介しています。興味のある方はご覧になってください。
データボリュームのバックアップ方法
データボリュームのバックアップは『データボリュームを圧縮ファイルに変換するためのコンテナを起動し、コンテナからローカルに圧縮ファイルをコピーする』という方針で行います。
docker-compose.yml
を利用してWordPress用のコンテナを起動することでデータボリュームが作成されるので、まずはコンテナを立ち上げます。
$ docker-compose up
以下のようにデータボリュームが作成されていればバックアップの準備はOKです。
$ docker volume ls
DRIVER VOLUME NAME
local my_wordpress_mysql_data
wp_db_con
という名前のdbコンテナにマウントされているデータボリュームをバックアップするコマンドは以下のようになります。
$ docker run --rm --volumes-from wp_db_con -v `pwd`:/backup busybox tar cvf /backup/backup.tar /var/lib/mysql
コマンドについて説明をします。
busybox
はデータボリュームを圧縮ファイルへ変換する作業を実行するコンテナのベースイメージです。
busyboxとは最小限のOSの機能のみを備えている軽量なDockerイメージです。
tar
以下がbusybox
コンテナ上で実行されるコマンドになります。
docker run
で--rm
オプションを指定しているため、tar
コマンド実行後、busybox
コンテナは破棄されます。
--volumes-from
はコンテナ起動時に、他のコンテナのデータボリュームをマウントさせるオプションです。
--volumes-from
にwp_db_con
を指定することで、wp_db_con
のデータボリューム、つまりデータベース情報がマウントされたbuxybox
コンテナが起動されます。
-v pwd:/backup
で、ホストのカレントディレクトリ(pwd
)とコンテナの/backup
ディレクトリの内容が同期されるようになります。
busybox
コンテナ上ではtar cvf /backup/backup.tar /var/lib/mysql
が実行されるため、データボリュームの圧縮ファイルは/backup
ディレクトリに作成されます。
コンテナの/backup
ディレクトリとホストのカレントディレクトリ(pwd
)は同期されているため、/backup
ディレクトリに作成されたbackup.tar
がローカル環境のカレントディレクトリにもコピーされます。
コマンドの実行内容を図で表現すると以下のようになります。
もしくはwp_db_con
を介さず、直接busyboxコンテナの/var/lib/mysqlディレクトリにデータボリュームをマウントさせてバックアップを行うことも可能です。
コマンドは以下のようになります。
--volumes-from
でdbコンテナを指定する代わりに-v
でデータボリュームをマウントさせています。
$ docker run --rm -v my_wordpress_mysql_data:/var/lib/mysql -v `pwd`:/backup busybox tar cvf /backup/backup.tar /var/lib/mysql
コマンドの実行内容を図で表現すると以下のようになります。
データボリュームのリストア方法
データボリュームのリストア方法の方針もバックアップ方法と同じです。
リストア用のコンテナ上で圧縮ファイルからデータボリュームを作成する作業を行います。
カレントディレクトリにあるbackup.tar
ファイルをもとにwp_db_con
コンテナのデータボリュームをリストアする場合は以下のようになります。
$ docker run --rm --volumes-from wp_db_con -v `pwd`:/backup busybox tar xvf /backup/backup.tar
もしくは直接データボリュームをリストア用のコンテナにマウントさせる以下の方法でも可能です。
$ docker run --rm -v my_wordpress_mysql_data:/var/lib/mysql -v `pwd`:/backup busybox tar xvf /backup/backup.tar
データボリュームのバックアップとリストアを実際に試してみる
ここからは先ほど紹介したWordPressのDocker環境を起動し、データボリュームのバックアップ・リストアを実際に行ってみたいと思います。
WordPressの初期設定が完了したデータボリュームをバックアップする
まずはコンテナを起動します。
$ cd /path/to/my_wordpress
$ docker-compose up
起動直後はMySQLに接続してもWordPressに関するテーブルはありません。
$ docker-compose exec db mysql -uwp_user -pwp_pass -D wordpress -e "show tables;"
(なにも表示されない)
初回起動をしてWordPressをインストールする際にはまず、『言語選択』と『WordPressの基本情報』を設定する必要があります。
localhost:80
につないで表示される画面の指示に従い、必要情報を入力していきます。
初期設定が完了するとWordPressに関するテーブルが作成されていることがわかります。
$ docker-compose exec db mysql -uwp_user -pwp_pass -D wordpress -e "show tables;"
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
localhost:80
に接続するとWordPressのトップ画面が表示されます。
ここで、初期設定が完了した状態のデータボリュームのバックアップをとってみます。
$ docker run --rm --volumes-from wp_db_con -v `pwd`:/backup busybox tar cvf /backup/backup.tar /var/lib/mysql
ホスト(ローカル環境)のカレントディレクトリを確認するとtarファイルができていることがわかります。
$ ls backup.tar
backup.tar
初期設定が完了したデータボリュームをリストアし、初期設定を省略してみる
ここでは、先ほど作成したバックアップファイルを利用してデータボリュームのリストアができるか確認をしてみます。
まずは、データボリュームの内容をリセットするために、起動しているDockerコンテナを破棄します。
データボリュームもコンテナと一緒に削除するために--volumes
オプションを利用してコンテナを破棄します。
$ docker-compose down --volumes
コンテナが終了したら、改めてコンテナを起動します。
$ docker-compose up
データボリュームの内容がリセットされているため、localhost:80にアクセスすると初期設定の画面になります。
WordPressに関するテーブルの情報もありません。
$ docker-compose exec db mysql -uwp_user -pwp_pass -D wordpress -e "show tables;"
(なにも表示されない)
ここで、先ほど作成したバックアップファイルを利用してデータボリュームのリストアをしてみましょう。
$ docker run --rm --volumes-from wp_db_con -v `pwd`:/backup busybox tar xvf /backup/backup.tar
データボリュームの情報を反映させるためにコンテナのリスタートを行います。
$ docker-compose restart
リスタート後、localhost:80
にアクセスすると、初期設定画面ではなく、WordPressのトップ画面に接続できるようになります。
WordPressに関するテーブルも作成されていることがわかります。
$ docker-compose exec db mysql -uwp_user -pwp_pass -D wordpress -e "show tables;"
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
まとめ
以上でデータボリュームのバックアップ・リストア方法の紹介を終わります。
- busyboxコンテナを活用してデータボリュームのバックアップ・リストアを行う
- データボリュームをバックアップすることで、データのスナップショットを取ることができる
この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!