【Docker】具体例で理解するデータボリュームのバックアップ・リストア方法

インフラ

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

Docker環境で開発をするにあたり、データベースのように、コンテナを破棄しても保持し続けたいデータが存在する場合があります。
そのような時はデータボリュームを活用することでデータの永続化をすることができます。

データボリュームの詳細についてはDockerのデータを永続化!Data Volume(データボリューム)の理解から始める環境構築入門で紹介をしました。

Dockerのデータを永続化!Data Volume(データボリューム)の理解から始める環境構築入門

今回はデータボリュームをファイルとしてバックアップする方法、およびファイルからリストアする方法について紹介をします。

データボリュームのバックアップ・リストアができるようになると以下のようなメリットがあります。

データボリュームのバックアップ・リストのメリット
  • Docker環境のスナップショット(= あるときの状態)を保存できるため、リカバリが容易になる
  • ファイルにデータボリュームの情報が保存されるため、他者と共有することができる

今回はWordPressのデータベース情報を具体例に、データボリュームのバックアップ・リストアの方法を紹介します。

今回の検証環境の紹介

まずはじめに、今回データボリュームのバックアップ・リストアを検証するDocker環境について紹介をします。

冒頭でも紹介したように今回はWordPressのデータベース情報をサンプルとして利用します。

検証環境は、WordPressが実行される『wp_web_con』コンテナ、MySQLが実行される『wp_db_con』コンテナ、データベースの情報を保存する『mysql_data』というデータボリュームで構成されています。

図で表現すると以下のようになります。

WordPressのDocker環境の概要

図にも記載をしていますが、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のローカル開発環境を一瞬で作成する方法で紹介しています。興味のある方はご覧になってください。

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-fromwp_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_`date “+%Y%m%d%H”`.tar』とするとタイムスタンのついたバックアップファイルを作成できます。

タイムスタンプのついたバックアップファイルを簡潔に作成する方法

データボリュームのリストア方法

データボリュームのリストア方法の方針もバックアップ方法と同じです。

リストア用のコンテナ上で圧縮ファイルからデータボリュームを作成する作業を行います。

カレントディレクトリにある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)のフォローもよろしくお願いします!