dockerでデータを永続化するために--volumes-from
を使ってみました。
やりたいこと
dockerのオフシャルコンテナでmysqlやjenkinsを手軽に立ち上げることができます。
データについては、-v
オプションでホストOSのディレクトリにマッピングしていたのですが、ファイルオーナやパーミッションの違いでアプリケーションが起動しなかったりするので--volumes-from
を使ってデータもコンテナ化してホストOSの依存をなくしたい。
単純なパターン
オフシャルドキュメントのManage data in containersを参考にします。
データコンテナの作成
データを保管するコンテナをdocker create
コマンドで作成します。イメージは、busybox
を使って-v
オプションでデータを保管するパスを指定します。
$ docker create -v /var/jenkins_home --name jenkins_test busybox /bin/true
a028f489ae189002030b8ecb7e96b371cf66ea005fcfcc694575f8ab6bb2832e
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a028f489ae18 busybox "/bin/true" 3 minutes ago Created jenkins_test
$
データの作成
次に一連のコマンドでコンテナを起動してファイルを作成し、コンテナを削除します。
$ docker run -it --rm --volumes-from jenkins_test ubuntu /bin/bash
root@12c4596d222f:/# cd /var/jenkins_home/
root@12c4596d222f:/var/jenkins_home# ls
root@12c4596d222f:/var/jenkins_home# touch data-saved
root@12c4596d222f:/var/jenkins_home# ls -l
total 0
-rw-r--r-- 1 root root 0 Apr 9 09:50 data-saved
root@12c4596d222f:/var/jenkins_home# exit
$
通常は、/var/jenkins_home
に作成したファイルは、--rm
オプションを付けているのでコンテナ終了とともに削除されます。
先ほど作成したデータコンテナを--volumes-from
で指定しているのでファイルは、データコンテナに作成されます。
再度、同じコマンドで新しいコンテナを起動してファイルがあることを確認します。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a028f489ae18 busybox "/bin/true" 11 minutes ago Created jenkins_test
$ docker run -it --rm --volumes-from jenkins_test ubuntu /bin/bash
root@560e5c11911d:/# ls /var/jenkins_home/
data-saved
root@560e5c11911d:/#
データのバックアップ
オフシャルドキュメントには、コンテナを使ってデータをホストOSにtar.gzする方法が記載されています。
docker commit
でimageを作る方法は、volumeのデータは対象外となるようです。
$ docker run -it --rm --volumes-from test ubuntu ls /var/jenkins_home
data-saved
$ docker commit test jenkins_test:3.0
c9ab350ba0dd011a6db95dd725edc43a7a0ceebaccc2c95ffbd6afbe1654bda5
$ docker create --name test3 jenkins_test:3.0
86e771c33d849d51d062ce5a63ab3e39765523f31cda6b4a705c70a6bc54b176
$ docker run -it --rm --volumes-from test3 ubuntu ls /var/jenkins_home
$
ドキュメント通りバックアップします。
$ docker run --rm --volumes-from test -v $(pwd):/backup busybox tar cfz /backup/backup.tar.gz /var/jenkins_home
tar: removing leading '/' from member names
$ tar tfz backup.tar.gz
var/jenkins_home/
var/jenkins_home/data-saved
$
そして、リストアしてみます。
$ docker run --rm --volumes-from test3 -v $(pwd):/backup ubuntu bash -c "cd /var/jenkins_home && tar xfz /backup/backup.tar.gz --strip 2"
$ docker run -it --rm --volumes-from test3 ubuntu ls /var/jenkins_home/jenkins_home
data-saved
$
おまけ
docker inspect
でボリュームのデータを確認することができます。
$ docker inspect test | grep Source
"Source": "/var/lib/docker/volumes/ef00bd2a22796753979728951c2e802fc2446befbad2f64f3a15be2353775774/_data",
$ sudo ls /var/lib/docker/volumes/ef00bd2a22796753979728951c2e802fc2446befbad2f64f3a15be2353775774/_data
data-saved
$
リストア後なので、同じデータがありますがチェックサムが異なるので別データとなっていることがわかります。
$ docker inspect test3 | grep Source
"Source": "/var/lib/docker/volumes/dc93f38d20643b7aaaf02c554cfeb9786b3feee44ce4ac64430cbfaedbd1b140/_data",
$ sudo ls "Source": "/var/lib/docker/volumes/d7c133c44da4b03dce4ef8cec8736e4ac4893d4c82ea9c7ddd16fcabe3c17801/_data",
$ sudo ls /var/lib/docker/volumes/d7c133c44da4b03dce4ef8cec8736e4ac4893d4c82ea9c7ddd16fcabe3c17801/_data
$