2017年3月13日月曜日

docker のデータボリュームを試してみた

概要

docker のデータボリュームの挙動を調べてみました
データボリュームは簡単に言えばデータを永続化するための領域です
コンテナとは別の領域にデータボリュームの領域を作成することで実現します
今回は Docker on Mac で試しました

環境

  • Mac OS X 10.12.3
  • Docker on Mac 17.03.0-ce, build 60ccb22

ボリュームを作成する

まずは単純に領域を作成してみましょう
作成する方法はいろいろありますが、とりあえず run コマンドから作成します

  • docker run --name c1 -p 8080:80 -v /test-volume nginx

「/test-volume」という領域をコンテナ上に新規で作成します
同時にホスト上にも領域が作成されます

  • docker volume ls
DRIVER              VOLUME NAME
local                 3a7ad65099591e7bbe2234aa4db

VOLUME NAME はちょっと長かったので短縮しています
コンテナ上でマウントしている情報を確認するには inspect コマンドを使います

  • docker inspect --format='{{ .Mounts }}' c1
[{volume 3a7ad65099591e7bbe2234aa4db /var/lib/docker/volumes/3a7ad65099591e7bbe2234aa4db/_data /test-volume local  true }]

ホスト上の「/var/lib/docker/volumes/3a7ad65099591e7bbe2234aa4db/_data」という領域をコンテナ上にマウントすることでデータを永続化しています
コンテナを停止して削除してもデータボリュームは削除されていないことが確認できると思います

ホスト上の領域を確認する

では先ほど確認した「/var/lib/docker/volumes/3a7ad65099591e7bbe2234aa4db/_data」の領域をホスト上で確認してみましょう

Docker on Mac の場合はホスト上の領域が少し特殊でデータ領域用の VM が動作しています
なので Mac 上で ls /var/lib/docker/volumes/ とか打っても「そんなディレクトリはありません」と怒られると思います

データ領域用の VM にログインして確認してみます
ログインするには screen コマンドを使います

  • screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

ユーザ名とパスワードは特に要求されないと思います
でプロンプトを表示して ls コマンドを実行してみます

/ # ls -ltrh /var/lib/docker/volumes
total 28
drwxr-xr-x    3 root     root        4.0K Mar 13 01:31 3a7ad65099591e7bbe2234aa4db
-rw-------    1 root     root       32.0K Mar 13 01:40 metadata.db

するとこんな感じで表示されると思います
その配下の _data ディレクトリ配下に実際にコンテナ上で作成したファイルも存在することが確認できると思います

試しにデータボリューム上 or コンテナ上で対象の領域に touch コマンドなどでファイルを作成してデータが共有されているか確認すると良いと思います

  • docker exec -it c1 /bin/bash
  • touch /test-volume/hoge.txt

ホスト側のデータボリュームの領域上で

  • ls -l /var/lib/docker/volumes/3a7ad65099591e7bbe2234aa4db/_data/hoge.txt

で存在が確認できると思います

別のコンテナから使う

これでコンテナからデータを削除してもデータが消失しないことがわかりました
では次に別のコンテナでデータボリュームの領域を使用してみます
-v オプションでデータボリュームの ID を指定すれば OK です

  • docker run --name c2 -p 8080:80 -v 3a7ad65099591e7bbe2234aa4db:/test-volume nginx

という感じです
これでコンテナ上で「/test-volume」の領域を確認すると先ほど別のコンテナで作成した hoge.txt が存在するのが確認できると思います

Tips

データボリューム領域はコンテナを削除しても残ります
データボリューム領域を削除したい場合は rm コマンドを利用します

  • docker volume rm 3a7ad65099591e7bbe2234aa4db

で OK です
当然ですが、データボリュームを使用中のコンテナが動作している場合は削除することができません

今回新規でデータボリュームを作成するのに run コマンドのオプションを使いました
docker volume create というコマンドもあるので、これを使って先に作成しておくことも可能です

  • docker volume create --name v1

--name を指定することでランダムな ID ではなく名前を付与することができます
ただし 1 文字のデータボリュームを作成することはできないようです

データボリュームはコンテナを削除してもなくならないと紹介しました
実は run をしたときに --rm オプションを付与するとコンテナを削除したときにデータボリュームも同時に削除することが可能です

  • docker run --rm --name c3 -p 8080:80 -v /test-volume nginx

とするとコンテナが起動しつづけてる間は docker volume ls で確認できると思いますが、コンテナを削除するとデータボリューム領域がなくなっていることが確認できると思います

最後に

docker のデータボリュームの挙動を実際にコマンドを実行しながら試してみました
基本的にはホスト上に永続化のための領域を作成して、それをコンテナが適宜マウントして使うことで実現しています

データボリュームには他にもホスト上のすでに存在するディレクトリを領域として使う方法や、他のコンテナの領域をデータボリュームとして使う方法もあります
この辺りの別の使い方も次回紹介したいと思います

参考サイト

0 件のコメント:

コメントを投稿