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
- version 5.0.16
- Vagrant
- version 1.8.1
- CentOS
- version 7.1
- Docker
- version 1.8.2
ホストにて準備(ちょっと)
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
続いて永続化するデータを準備する必要があるので、CentOSとBusyboxのイメージを取得しておく。
# 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からっぽいので、実装が変わっているかも。
体力が残っていないので、最新を使ってもう一度チャレンジしてみようと思いました。