Data Volume Container を試してみる #docker
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
「Vagrant + Chef-Zero Provisioner で環境を作り、Docker 入門ハンズオンを実施する」の「A-8. Dockerfile で Nginx のコンテナを構築」にて、VOLUME (shared filesystems) を用いてコンテナ外のデータ永続・データ共有を行いました。これは「Data volumes」と呼ばれています。
本稿では「Creating and mounting a data volume container」にある「Data Volume Container」というデータを保管するためのコンテナを作成する方法を見てみます。
まず、データを保管するための「Data Volume Container」を作成します。-v オプションを用いて共有用のディレクトリ(Data Volume)を指定しておきます。
vagrant@vagrant:~$ docker create -v /dbdata --name dbdata ubuntu:14.04 /bin/true
9ae764fe12b3bdebd9ef0e6818663605d4f47a30056dd851a64e1892904d3725
vagrant@vagrant:~$
次に「Data Volume Container」を利用する別のコンテナを作成・起動します。ここでは --volumes-from="" オプションでコンテナ名を指定しています。これは、指定したコンテナの Data Volume をすべてマウントする、という意味を持ちます。
vagrant@vagrant:~$ docker run -ti --volumes-from dbdata --name db1 ubuntu:14.04 /bin/bash
root@38ae46325049:/# df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 39G 2.2G 35G 6% /
none 39G 2.2G 35G 6% /
tmpfs 3.9G 0 3.9G 0% /dev
shm 64M 0 64M 0% /dev/shm
/dev/mapper/vagrant--vg-root 39G 2.2G 35G 6% /dbdata
tmpfs 3.9G 0 3.9G 0% /proc/kcore
tmpfs 3.9G 0 3.9G 0% /proc/latency_stats
tmpfs 3.9G 0 3.9G 0% /proc/timer_stats
root@38ae46325049:/#
この /dbdata は Data Volume Container の Data Volume をマウントしています。何かファイルを置いてみましょう。
root@38ae46325049:/# date > /dbdata/db1-date
root@38ae46325049:/#
Ctrl-p + Ctrl-q でコンテナをデタッチし、Data Volume Container の Data Volume をマウントするもう一つ別のコンテナを作成・起動します。
vagrant@vagrant:~$ docker run -ti --volumes-from dbdata --name db2 ubuntu:14.04 /bin/bash
root@9ba65c61e1b9:/# df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 39G 2.2G 35G 6% /
none 39G 2.2G 35G 6% /
tmpfs 3.9G 0 3.9G 0% /dev
shm 64M 0 64M 0% /dev/shm
/dev/mapper/vagrant--vg-root 39G 2.2G 35G 6% /dbdata
tmpfs 3.9G 0 3.9G 0% /proc/kcore
tmpfs 3.9G 0 3.9G 0% /proc/latency_stats
tmpfs 3.9G 0 3.9G 0% /proc/timer_stats
root@9ba65c61e1b9:/#
/dbdata を確認してみましょう。
root@9ba65c61e1b9:/# ls -la /dbdata/
total 12
drwxr-xr-x 2 root root 4096 Jul 23 08:30 .
drwxr-xr-x 33 root root 4096 Jul 23 08:32 ..
-rw-r--r-- 1 root root 29 Jul 23 08:30 db1-date
root@9ba65c61e1b9:/# cat /dbdata/db1-date
Thu Jul 23 08:30:47 UTC 2015
root@9ba65c61e1b9:/#
先程作ったファイルが存在しています。このファイルを削除し、新しくファイルを置いてみます。
root@9ba65c61e1b9:/# rm /dbdata/db1-date
root@9ba65c61e1b9:/# date > /dbdata/db2-date
root@9ba65c61e1b9:/#
このコンテナをデタッチし、先のコンテナをアタッチします。
vagrant@vagrant:~$ docker attach db1
root@38ae46325049:/#
/dbdata を確認してみましょう。
root@38ae46325049:/# ls -la /dbdata/
total 12
drwxr-xr-x 2 root root 4096 Jul 23 08:36 .
drwxr-xr-x 33 root root 4096 Jul 23 08:29 ..
-rw-r--r-- 1 root root 29 Jul 23 08:36 db2-date
root@38ae46325049:/# cat /dbdata/db2-date
Thu Jul 23 08:36:59 UTC 2015
root@38ae46325049:/#
このように、先にこのコンテナで作成したファイルは削除されていて、新たに作成されたファイルが見えています。
ここで、2つのコンテナを停止・削除してしまいましょう。
vagrant@vagrant:~$ docker stop db1 db2
db1
db2
vagrant@vagrant:~$ docker rm db1 db2
db1
db2
vagrant@vagrant:~$
Data Volume Container 以外のコンテナはなくなりました。
vagrant@vagrant:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ae764fe12b3 ubuntu:14.04 "/bin/true" 38 minutes ago dbdata
vagrant@vagrant:~$
再び、Data Volume Container の Data Volume をマウントするコンテナを作成・起動し、/dbdata を確認してみます。
vagrant@vagrant:~$ docker run -ti --volumes-from dbdata --name db3 ubuntu:14.04 /bin/bash
root@f69ca0aba940:/# ls -la /dbdata
total 12
drwxr-xr-x 2 root root 4096 Jul 23 08:36 .
drwxr-xr-x 33 root root 4096 Jul 23 09:06 ..
-rw-r--r-- 1 root root 29 Jul 23 08:36 db2-date
root@f69ca0aba940:/# cat /dbdata/db2-date
Thu Jul 23 08:36:59 UTC 2015
root@f69ca0aba940:/#
きちんとデータが残っていました。
Data Volume Container を docker export してみます。
vagrant@vagrant:~$ docker export dbdata > dbdata.tar
vagrant@vagrant:~$
これでデータのポータビリティも確保できた...かというと、そうではありません。エクスポートしたものには Data Volume が含まれません。確認してみます。
vagrant@vagrant:~$ tar tvf dbdata.tar | grep db2-data
vagrant@vagrant:~$ tar tvf dbdata.tar | grep dbdata
vagrant@vagrant:~$
残念ながら Data Volume は入っていませんでした。
Data Volume Container の Data Volume のバックアップ・リストア・マイグレーションは「Backup, restore, or migrate data volumes」の手順を取ります。
まず、バックアップ用のコンテナを作成・起動します。
vagrant@vagrant:~$ docker run --volumes-from dbdata -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/backup.tar /dbdata
tar: /dbdata/
Removing leading `/' from member names
/dbdata/db2-date
vagrant@vagrant:~$
カレントディレクトリに Data Volume をバックアップした backup.tar ファイルができました。
vagrant@vagrant:~$ ls -l backup.tar
-rw-r--r-- 1 root root 10240 Jul 23 09:23 backup.tar
vagrant@vagrant:~$ tar tvf backup.tar
drwxr-xr-x root/root 0 2015-07-23 08:36 dbdata/
-rw-r--r-- root/root 29 2015-07-23 08:36 dbdata/db2-date
vagrant@vagrant:~$
バックアップがとれていることを確認します。
vagrant@vagrant:~$ tar xvf backup.tar -C /tmp
dbdata/
dbdata/db2-date
vagrant@vagrant:~$ cat /tmp/dbdata/db2-date
Thu Jul 23 08:36:59 UTC 2015
vagrant@vagrant:~$
問題ありません。
新規の Data Volume Container を作成します。
vagrant@vagrant:~$ docker run -v /dbdata --name dbdata2 ubuntu:14.04 /bin/bash
vagrant@vagrant:~$
Data Volume を参照するコンテナを作成・起動します。
vagrant@vagrant:~$ docker run -ti --volumes-from dbdata2 --name db2-1 ubuntu:14.04 /bin/bash
root@d27da00c56f2:/#
root@d27da00c56f2:/# ls -la /dbdata
total 8
drwxr-xr-x 2 root root 4096 Jul 23 09:29 .
drwxr-xr-x 33 root root 4096 Jul 23 09:29 ..
root@d27da00c56f2:/#
Data Volume には何も入っていません。
リストア用のコンテナを作成・起動します。
vagrant@vagrant:~$ docker run --volumes-from dbdata2 -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/backup.tar -C /
dbdata/
dbdata/db2-date
vagrant@vagrant:~$
Data Volume を参照するコンテナにアタッチし、Data Volume 内を確認してみます。
vagrant@vagrant:~$ docker attach db2-1
root@d27da00c56f2:/# ls -la /dbdata/
total 12
drwxr-xr-x 2 root root 4096 Jul 23 08:36 .
drwxr-xr-x 33 root root 4096 Jul 23 09:29 ..
-rw-r--r-- 1 root root 29 Jul 23 08:36 db2-date
root@d27da00c56f2:/# cat /dbdata/db2-date
Thu Jul 23 08:36:59 UTC 2015
root@d27da00c56f2:/#
データが戻っています。
無事バックアップ・リストアができたところで、不要なコンテナを削除してしまいましょう。ここで「docker rm $(docker ps -aq --filter='status=exited')」をしてはいけません。
vagrant@vagrant:~$ docker ps -a --filter='status=exited'
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
703fe6cb03b3 ubuntu:14.04 "tar xvf /backup/bac 3 minutes ago Exited (0) 3 minutes ago loving_engelbart
2d1ce971ca83 ubuntu:14.04 "tar xvf /backup/bac 5 minutes ago Exited (0) 5 minutes ago clever_mayer
a1d5e854b0d3 ubuntu:14.04 "cd /dbdata" 5 minutes ago elegant_galileo
32aa3a0e04f8 ubuntu:14.04 "cd /dbdata" 5 minutes ago angry_tesla
6725177e54c6 ubuntu:14.04 "/bin/bash" 7 minutes ago Exited (0) 7 minutes ago dbdata2
ef4cba25dddd ubuntu:14.04 "tar cvf /backup/bac 11 minutes ago Exited (0) 11 minutes ago serene_bell
9ae764fe12b3 ubuntu:14.04 "/bin/true" About an hour ago dbdata
vagrant@vagrant:~$
ご覧の通り、Data Volume Container は起動していない状態で利用できているため、status=exited の対象になってしまいます。起動したままにしておくなど、間違って消してしまわないように注意が必要です。