概要
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 件のコメント:
コメントを投稿