黒縁眼鏡は海を飛ぶ

IT中心にそこはかとなく

Dockerでのデータ永続化 -その1-

せっかく書いたので公開しますが、利用したDockerのversionが古いので情報がすごく古い可能性があります。
もしかすると有用かもしれないので。。。一応。。。悲しい。。。

Dockerでデータを永続化したい場合どうするのか気になったので試すことにした。

Dockerの公式マニュアルには次のように書いてある。

We’re going to look at the two primary ways you can manage data in Docker.

  • Data volumes, and
  • Data volume containers.

データボリュームとデータボリュームコンテナ??データ保存用のコンテナ??


試す前

  • データボリュームとデータボリュームコンテナの違いってなんだろう
  • ボリュームコンテナって結局コンテナじゃないの?いらなくなったらポイできるのがコンテナのメリットだと思ってたけど。。
  • データを保持したいならホストのディレクトリにマップしたほうが管理もしやすいのでは?

お試しが終わるころにはきっと解決できているでしょう。


環境


ホストにて準備(ちょっと)

VirtualBox, Vagrantはホストに導入済みとして、boxの追加から備忘録として書いていく。

box追加

$ vagrant box add centos7 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box

init

$ mkdir dockertest
$ cd dockertest
$ vagrant init centos7

Vagrantfile編集

$ vim Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.box = "dockertest"
  config.vm.hostname = "dockertest"
  config.vm.network "public_network", ip: "192.168.11.102"
end

仮想マシン作成

$ vagrant up

とりあえず仮想マシンとして使えればそれでいい。


Dockerやるぞ!

以降の作業はすべて仮想マシン上で行います。

ということでDockerやる。

前にyum updateする。長いから灰と幻想のグリムガルを観ましょう。ユメ可愛いよユメ。でも関西弁変だよユメ。

updateできたらDocker入れて、起動させる。

# yum install docker
# systemctl start docker
# systemctl enable docker

続いて永続化するデータを準備する必要があるので、CentOSBusyboxのイメージを取得しておく。

# docker pull centos
# docker pull busybox

これで準備はできた。


データボリュームを試す

データボリュームをマウントするように、docker runのオプションに-vを追加する。

# docker run -it -h centos -v /volume centos /bin/bash

これで、コンテナの/volumeにデータボリュームがマウントされた状態でcentosコンテナが起動する。

データボリュームの実体はホスト側の/var/lib/docker/volumes配下にあるとのこと。

適当にファイルを作成してみる。

centosコンテナにて
# touch /volume/volume_test.txt

Ctrl+p Ctrl+qで一旦抜けて、ホスト側の/var/lib/docker/volumes/xxxxx/_dataを見にいくと、確かにvolume_test.txtがあることがわかる。すごい。
ついでなので、テキストファイルに何か書き込んでみる。

# echo "ユメ可愛いよユメ" >> volume_test.txt

コンテナに再度接続して、中身を見てみる。

# cat /volume/volume_test.txt
ユメ可愛いよユメ

データを確認できたので、実際にデータは保持されるのかどうか、コンテナを削除して再確認してみる。

コンテナ上で
# exit
ホスト上で
# docker rm <id>
# ls
volume_test.txt

ちゃんとあるのがわかった。

データが保持されるのはわかったけど。。。

結局ホスト側のディレクトリを指定するのとどう違うのかがよくわからない。
たとえば、docker run ... -v /tmp/volume:/volume ...とした場合と違いはあるのかな。

更にいうと、ホスト側のディレクトリを指定する場合はわかりやすいディレクトリをこちらで選択できるけど、指定しない場合は再接続の時に/var/lib/docker/volumes/xxxxx/_data?を指定しないといけない?ぽくて面倒そう。


データボリュームコンテナを使ってみる

なんだかもやっとしつつも、一旦置いておいてデータボリュームコンテナを試してみる。

データボリュームコンテナの作成は以下の通り。

# docker create -v /test_volume -h test_volume busybox /bin/true

では、作成したデータボリュームコンテナを参照するコンテナを作成してみる。

# docker run -it -h centos --volumes-from test_volume centos /bin/bash
コンテナ上で
# ls -d test_volume
test_volume

ちゃんとある。
けど、これって結局データボリュームをマウントしたコンテナと変わらないのでは。。。と思い/var/lib/docker/volumes配下を見に行くと、やっぱり新しいディレクトリができている。

コンテナとしてデータボリュームを管理したい用途としてデータボリュームコンテナが存在するという理解にいきついた。たぶん。
コンテナとして管理しておけば、別のコンテナにも同時にマウントできるみたいだ。


はたと気付く

ここまでやってやっと気づいたんだけれども、使っているDockerのversionが1.8と古くて、docker volumeコマンドがない。。。
リリースノートによると実装されたのは1.9.0からっぽいので、実装が変わっているかも。

体力が残っていないので、最新を使ってもう一度チャレンジしてみようと思いました。


謝辞