ksaitoの日記

日々試したことの覚え書き

dockerのデータの永続化

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
$