Update 2014-10-19
: MoinMoin in Production on CoreOS - Part5: Data Volume ContainerUpdate 2014-10-18
: MoinMoin in Production on CoreOS - Part4: Staging to IDCF CloudUpdate 2014-10-15
: Docker data volume container backing up with docker-lloyd
WordPressのデータボリュームコンテナを作成したときはcommitしてもvolumeに指定したディレクトリの中身が保存されずに不思議に思いました。MoinMoinのバックアップで初めは挫折したdocker-backupも、ようやくGoのコードを読んで使えるようになりました。
データボリュームコンテナの意味がはじめて理解できるようになると、なるほどdisposableコンテナの運用には必須の機能です。
テンポラリのコンテナを使いバックアップとリストアする
これまで手動でコンテナのボリュームからtar作成してバックアップしていました。基本的にdocker-backupも動作は同じことをします。
$ docker run --rm \ |
データコンテナを作成してuntarしてリストアします。
$ docker run --name wp-stg-vol \ |
docker-backupの用意
docker-backupのstoreコマンドを使いコンテナにアタッチされているデータボリュームコンテナの中身をアーカイブします。またrestoreコマンドを使うとアーカイブから新しいデータボリュームコンテナを作成することができます。
Goでビルドされたdocker-backupコマンドをDockerホストにインストールすることは、nsenterコマンドのインストールに似ています。
Goのバイナリの場合はそのまま配布しても良いのですが、ローカルで使うコマンドをインストールする方法としてDockerコンテナは環境を汚さないので今後も試していきたいと思います。
docker-backupコンテナをdisposableに使うため、ラッパーのスクリプトを用意します。
|
コマンドに実行権限を付けます。
$ chmod +x ~/bin/docker-backup |
~/bin/docker-backupコマンドを使う場合は、カレントのディレクトリをテンポラリのコンテナにマウントしてアーカイブの入出力の場所に使うため、作業ディレクトリを用意します。
$ mkdir ~/backups |
docker-backupでバックアップをする
Dockerホストのボリュームディレクトリを確認します。f95fc6d2c9821587c6ca6a2eb6410633e1e7e00a331d1c570ce480a8cbe4d552ディレクトリがバックアップ対象のwikiのデータボリュームです。
$ sudo ls -altr /var/lib/docker/vfs/dir/ |
wikiのデータボリュームコンテナをinspectして確認します。
$ docker inspect --format="{{ .Volumes }}" wiki-vol |
wikiコンテナは--volumes-from
でデータボリュームコンテナをマウントしているのでinspectして表示されるボリュームは同じです。
$ docker inspect --format="{{ .Volumes }}" wiki |
storeコマンドを使いwiki-volコンテナをバックアップします。カレントディレクトリがテンポラリコンテナにマウントされた状態のファイル名と、データボリュームコンテナがマウントされているバックアップ対象のコンテナの名前を引数に指定します。
$ cd ~/backups |
カレントディレクトリにアーカイブが作成されました。
$ ls -lh |
docker-backupでリストアする
docker-backupはバックアップ前と同じ名前でコンテナを作成します。もとのwiki-volの名前がついたコンテナが存在すると新しく作成できません。
バックアップしたtar.gzの中に、もとのボリュームコンテナ情報を保存したvolume-container.jsonが作成されます。
古いコンテナ名を使って新しいコンテナを作成するため重複してしまいます。コンテナ名を書き換えてリストアできるか今度試してみます。
params.Set("name", oldContainer.Name[1:]) // remove leading / |
リストアする前に起動しているwikiコンテナとwiki-volコンテナを削除します。ステートフルなデータはバックアップしているので、コンテナはdisposableに破棄できます。
$ docker kill wiki && docker rm wiki wiki-vol |
クリアした状態のボリュームのディレクトリです。wiki-volのf95fc6d2c9821587c6ca6a2eb6410633e1e7e00a331d1c570ce480a8cbe4d552ディレクトリを削除しました。
$ sudo ls -altr /var/lib/docker/vfs/dir/ |
restoreコマンドを使いリストアします。storeと同様にカレントディレクトリがテンポラリのコンテナにマウントされた先のファイルパスを指定します。
$ cd ~/backups |
ボリュームのディレクトリを確認します。新しいデータボリュームコンテナのcf15564ee20b5fb365c277e8d432892fea1d6b2319aab1cb675a477051f7a626ディレクトリが作成されました。
$ sudo ls -altr /var/lib/docker/vfs/dir/ |
リストアされたwiki-volコンテナをinspectします。
$ docker inspect --format="{{ .Volumes }}" wiki-vol |
wikiコンテナをリストされたwiki-volを--volumes-from
に指定して新しくrunします。
$ docker run --name wiki -d --volumes-from wiki-vol masato/moinmoin |
wikiコンテナをinspectすると新しいデータボリュームコンテナがマウントされています。
$ docker inspect --format="{{ .Volumes }}" wiki |
wikiコンテナのIPアドレスを確認してブラウザで開くと、リストア前の状態に戻っています。
$ docker inspect --format="{{ .NetworkSettings.IPAddress }}" wiki |