Dockerでデータボリュームを使ってみる

Docker-docs-jaのコンテナでデータを管理を読みつつ、コンテナのデータボリュームについてまとめます。

まず、データボリュームをカテゴライズすると下記のようになります。

  1. データボリュームをマウント
    • 名前無しデータボリューム(あまり使わない)
    • 名前付きデータボリューム
  2. ホストディレクトリをマウント
    • ホストLinuxのディレクトリをマウント
    • ホストOSのディレクトリをマウント
  3. データボリュームコンテナからマウント

これに従って説明していきます。

データボリュームをマウント

データボリュームは、Dockerコンテナエンジンが管理するデータのボリュームです。

管理下にあるボリュームは下記で確認できます。

[~] $ docker volume ls
DRIVER              VOLUME NAME

名前無しデータボリューム

あまり使わないですが、名前無しのボリュームを作ってマウントします。

コンテナを作るときに、名前をつけずにボリュームをマウントすると、自動でボリュームを作ってそこをマウントします。

下記では、コンテナを作るときに”/myvolume”に管理ボリュームを自動で作ってマウントします。

[~] $ docker run --name non_named_mount -v /myvolume -it ubuntu:14.04 /bin/bash
root@6ea0b83bc5b0:/# cd /myvolume/
root@6ea0b83bc5b0:/myvolume# ls
root@6ea0b83bc5b0:/myvolume# touch data001
root@6ea0b83bc5b0:/myvolume# ls
data001

exitして管理されているボリュームを調べると名前無しボリュームの意味がわかります。

[~] $ docker volume ls
DRIVER              VOLUME NAME
local               62557c4097de6380d1851c93da72e97f1f4ede3f074dd39e649967c04ae6b622

ボリューム名が、わけのわからない名前になっています。

名前無しでボリュームをマウントすると、丁寧にボリュームを作ってくれて、そのボリュームをマウントしてくれます。ですが、再利用や扱いにくいので、使わないほうがよいかと思います。

わけのわからない名前ではありますが、この名前を指定して、次の名前付きボリュームを使って、同じボリュームを別のコンテナでマウントできます。

名前付きデータボリューム

コンテナを作るときに名前をつけてボリュームをマウントすると、その名前のボリュームがなければ作ってマウントします。

下記では、コンテナを作るときに”vol01″というボリュームを指定して”/myvolume”に管理ボリュームを自動で作ってマウントします。

[~] $ docker run --name named_mount -v vol01:/myvolume -it ubuntu:14.04 /bin/bash
root@a474d902b2e4:/# cd /myvolume/
root@a474d902b2e4:/myvolume# touch vol01_file

exitして管理されているボリュームを調べると名前無しボリュームの意味がわかります。

[~] $ docker volume ls
DRIVER              VOLUME NAME
local               62557c4097de6380d1851c93da72e97f1f4ede3f074dd39e649967c04ae6b622
local               vol01

新しく、vol01ができています。

別のコンテナを作って、このvol01をマウントして中身を見てみます。

[~] $ docker run --name named_mount_2nd -v vol01:/myvolume_2nd -it ubuntu:14.04 /bin/bash
root@bf3d1d47138b:/# cd /myvolume_2nd/
root@bf3d1d47138b:/myvolume_2nd# ls
vol01_file

最初のコンテナの作成時に作ったボリューム”vol01″と同じボリューム名を指定してマウントしているので、新しくボリュームが作られることはなく、同じボリュームがマウントされます。なので、中身は最初のときにtouchした”vol01_file”が見えています。

管理ボリュームはどこにあるのか?

管理ボリュームはホストOSの”/var/lib/docker/volumes”にあります。

但し、Docker for WindowsやDocker for Macは、ホストOSはLinuxではなくWindowsやMacなので、ハイパーバイザ型の軽量Linuxを立ち上げて、その上でコンテナを立ち上げています。

下記のようなイメージです。

Docker for Mac

説明は、MacへDockerエンジンのセットアップを読んでください。

なので、Macの”/var/lib/docker/volumes”を見ても入ってません。軽量Linuxのディレクトリを見る必要あります。

簡単にみる方法は、次の「ホストディレクトリをマウント」を使います。

下記はホストLinux(ハイパーバイザ型の軽量Linux)のルートディレクトリを”/host_root”でマウントしています。※管理ボリュームを作っていません。

[~] $ docker run --name host_linux -v /:/host_root -it ubuntu:14.04 /bin/bash
root@0917de2f673a:/# cd /host_root/var/lib/docker/volumes/
root@0917de2f673a:/host_root/var/lib/docker/volumes# ls
62557c4097de6380d1851c93da72e97f1f4ede3f074dd39e649967c04ae6b622  metadata.db  vol01
root@0917de2f673a:/host_root/var/lib/docker/volumes#

“/host_root/var/lib/docker/volumes/”に管理ボリュームの一覧(docker volume ls)の結果と同じボリュームのディレクトリができています。

更に、下記のようにtouchした”vol01_file”を見つけられます。

root@0917de2f673a:/host_root/var/lib/docker/volumes# ls vol01/_data/
vol01_file

Docker for Windowsでも同じやり方でホストLinuxのディレクトリへアクセスできます。

ホストディレクトリをマウント

ホストLinuxのディレクトリをマウント

既に、「管理ボリュームはどこにあるのか?」で例が出ましたが、ホストLinuxのディレクトリをマウントするのであれば、下記のように/で始まるディレクトリを指定します。

[~] $ docker run --name host_linux -v /:/host_root -it ubuntu:14.04 /bin/bash

Docker for WindowsやDocker for Macの場合は、ホストOSであるWindowsやMacのディレクトリではありません。ハイパーバイザ型の軽量Linuxのディレクトリになります。

ホストOSである、WindowsやMacのディレクトリをマウントするのであれば、次の方法でマウントします。

ホストOSのディレクトリをマウント

ホストOSである、WindowsやMacのディレクトリをマウントするのも書式は同じです。

[~] $ docker run --name host_os -v /Users/crz33:/mac_home -it ubuntu:14.04 /bin/bash

“/Users/crz33″はMacのホームディレクトリです。

Docker for MacのPreferenceのFile Sharingで、共有設定してあるディレクトリである必要があります。

おそらく、”/”から始まる名前で、まず共有設定されているディレクトリとマッチングして、マッチしていれば、ホストOSであるMacのディレクトリをマウント、マッチしなければ、ホストLinux側のディレクトリをマウントしようとする動きかと思います。

Windowsであれば、”c:¥”を共有設定してあれば、”/c/”で始まる名前でマウントすると、WindowsOSのフォルダ、マッチしなければホストLinux側のディレクトリをマウントしようとする動きかと思います。

データボリュームコンテナからマウント

これまでの2つ「データボリュームをマウント」「ホストディレクトリをマウント」でマウント設定してあるコンテナを使って、そのコンテナのボリューム設定を流用するパターンです。

利用ケースがいまいちわかりませんが、ボリューム設定をいくつものコンテナにするのではなく、ボリューム設定専用のコンテナを作って、他のコンテナ群がそれを流用していれば、設定ポイントが1つにできるということでしょう。

[~] $ docker run --name from_host_os --volumes-from host_os -it ubuntu:14.04 /bin/bash
root@ce49cd5a761c:/# ls /mac_home
...

という感じで、他のコンテナを”–volumes-from”に指定するだけです。

Dockerまとめ記事へのリンク

Dockerの他のネタを纏めています。参考になれば嬉しいです。

↓↓↓Dockerまとめページはこちら↓↓↓
【保存版】Dockerまとめ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする