ニュース
» 2015年11月11日 07時30分 公開

古賀政純の「攻めのITのためのDocker塾」:第10回 Docker環境におけるバックアップ/リストアの罠 (4/4)

[古賀政純(日本ヒューレット・パッカード),ITmedia]
前のページへ 1|2|3|4       

Docker環境におけるバックアップ/リストアの罠

 ご紹介したDocker環境におけるexport/importは、一見なんの問題もないように思えますが、実は罠があります。以下では罠の例を示します。まずは、OSSのデータベースで有名なPostgreSQL(ポストグレスキューエル)を稼働させるDockerイメージを入手し、コンテナを起動してください。今回、コンテナ名は、db0001とします。


# docker pull postgres:9.5
# docker run -d --name db0001 postgres:9.5

 起動したdb0001コンテナで稼働するPostgreSQLデータベースは/var/lib/postgresql/dataディレクトリに格納されていますので、中身を確認します。


# docker exec -it db0001 ls -l /var/lib/postgresql/data
total 56
drwx------. 5 postgres postgres    38 Nov  6 01:54 base
drwx------. 2 postgres postgres  4096 Nov  6 01:55 global
drwx------. 2 postgres postgres    17 Nov  6 01:54 pg_clog
drwx------. 2 postgres postgres     6 Nov  6 01:54 pg_commit_ts
drwx------. 2 postgres postgres     6 Nov  6 01:54 pg_dynshmem
-rw-------. 1 postgres postgres  4498 Nov  6 01:54 pg_hba.conf
-rw-------. 1 postgres postgres  1636 Nov  6 01:54 pg_ident.conf
drwx------. 4 postgres postgres    37 Nov  6 01:54 pg_logical
drwx------. 4 postgres postgres    34 Nov  6 01:54 pg_multixact
...
...

 データベースに関する様々なファイルが格納されていることが分かります。次に、この稼働中のdb0001コンテナをexportして、tarアーカイブにし、別の物理サーバsvr02上で稼働するDocker環境にimportします。


# docker export db0001 > db0001.tar
# scp db0001.tar svr02:/root/
svr02 # cat db0001.tar |docker import - postgres:9.5
svr02 # docker images
REPOSITORY       TAG          IMAGE ID            CREATED             VIRTUAL SIZE
postgres         9.5          fdd2882c4f35        13 days ago         265.6 MB

 importしたPostgreSQLのDockerイメージからコンテナを起動します。


svr02 # docker run -itd --name db0002 -h db0002 postgres:9.5 /bin/bash

 起動したコンテナdb0002は、先述のdb0001と同じ/var/lib/postgresql/dataディレクトリにデータベースが格納されているはずですので、中身を確認してみます。


# docker exec -it db0002 ls -l /var/lib/postgresql/data
total 0

 なんと、格納されているはずのデータベースがありません。これはどういうことでしょうか。実はDockerにおいては、データボリュームという考え方があります。データボリュームは、コンテナにおいて、データ専用の領域をボリュームとしてアタッチし、複数のコンテナ間で共有する場合などに利用されます。このデータボリュームは、Dockerイメージ作成時のDockerfileやコンテナ起動時に定義します。Dockerコンテナdb0001に設定されているデータボリュームを知るには、以下のようにdocker inspectを実行します。


# docker inspect db0001
...
...
        "Volumes": {
            "/var/lib/postgresql/data": {}
        },
...
...

 上記のように、/var/lib/postgresql/dataがボリュームとして定義されていることが分かります。しかし、データボリュームで指定されたディレクトリは、docker export/importではバックアップ/リストアができない仕様になっているのです。また、docker commitでもデータボリュームを含んでイメージ化することはできません。このためデータボリュームは、個別にバックアップ/リストアする必要があります。データボリュームが存在するDockerコンテナのエクスポートを適切に行っても、データボリュームとして定義されたディレクトリは、バックアップ対象にならないのです。この問題を解決するには、データボリュームを別にバックアップします。以下では、データボリュームのバックアップ方法を示します。


# docker run --rm --volumes-from db0001 -v $(pwd):/backup debian:latest tar cvf /backup/postgresql-data.tar /var/lib/postgresql/data

 上記は、コンテナ内の/var/lib/postgresql/dataディレクトリをコンテナ内の/backupディレクトリで、postgresql-data.tarとしてバックアップします。そのコンテナ内の/backupディレクトリをホストOSのカレントディレクトリ(上記の場合は、$(pwd)で指定されたディレクトリ)と結びつけることにより、postgresql-data.tarをホストOSのカレントディレクトリ上に取得します。これで、データボリュームを取得できるのです。PostgreSQLのデータをバックアップできましたので、取得したpostgresql-data.tarをリストアする方法も以下に示しておきます。まず、取得したpostgresql-data.tarを別の物理サーバsvr02にコピーします。


# scp postgresql-data.tar svr02:/root/

 コンテナ内の/var/lib/postgresql/dataディレクトリをボリュームとして見せるdb0003コンテナをsvr02上で起動します。


svr02 # docker run -itd -v /var/lib/postgresql/data --name db0003 -h db0003 postgres:9.5 /bin/bash

 コンテナdb0003は、データボリューム/var/lib/postgresql/dataを持ちますので、このボリュームに対して、tarアーカイブをリストアします。


svr02 # docker run --volumes-from db0003 -v $(pwd):/backup debian:latest tar xvf /backup/postgresql-data.tar -C /

 コンテナdb0003のデータボリューム/var/lib/postgresql/dataにtarアーカイブのデータがリストアされているかを確認してください。


svr02 # docker exec -it db0003 ls -l /var/lib/postgresql/data/
total 56
-rw-------. 1 postgres postgres     4 Nov  6 02:10 PG_VERSION
drwx------. 5 postgres postgres    38 Nov  6 02:10 base
drwx------. 2 postgres postgres  4096 Nov  6 02:11 global
drwx------. 2 postgres postgres    17 Nov  6 02:10 pg_clog
drwx------. 2 postgres postgres     6 Nov  6 02:10 pg_commit_ts
drwx------. 2 postgres postgres     6 Nov  6 02:10 pg_dynshmem
...
...

 このように、PostgreSQLに限らず、MySQLのDockerイメージなど、データベース系のDockerイメージは、データボリュームが定義されていることが少なくありません。バックアップ前には、docker inspectでボリュームが定義されているかどうかを必ず確認するようにしましょう。

(第11回はこちら

古賀政純(こが・まさずみ)

日本ヒューレット・パッカード株式会社 オープンソース・Linuxテクノロジーエバンジェリスト。兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師、SIを経験。2006年、米国HPからLinux技術の伝道師として「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。プリセールスMVPを4度受賞。現在は日本HPにて、Linux、FreeBSD、Hadoopなどのサーバー基盤のプリセールスSE、文書執筆を担当。Red Hat Certified Virtualization Administrator, Novell Certified Linux Professional, Red Hat Certified System Administrator in Red Hat OpenStack, Cloudera Certified Administrator for Apache Hadoopなどの技術者認定資格を保有。著書に「CentOS 7実践ガイド」「Ubuntu Server実践入門」などがある。趣味はレーシングカートとビリヤード


関連キーワード

Docker | CentOS | 攻めの経営 | Linux


前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ