ボリュームは、コンテナーのファイル システムの外に存在します。それらは実行時にマウントされますが、それらのデータはコンテナー内に存在しません。例を見てみましょう:
j@host $ docker volume create --name my-data
これにより、 というボリューム (コンテナーはまだありません) が作成されmy-data
ます。ここで、新しいコンテナーを作成し、このボリュームをコンテナー内の にマウントし/inside/data
ます。
j@host $ docker run -it -v my-data:/inside/data --name container1 alpine:3.3 sh
今はコンテナ内のシェルにいるので、フォルダー内に新しいファイルを作成します/inside/data
。
root@container1 $ cd /inside/data && touch my-file
現在、実際に/inside/data
はコンテナーのファイルシステムにはありません。コンテナーの外部にあるボリュームであり、マウントされているだけです。コンテナーを停止し、そのボリュームをマウントし直さないと、ファイルはそこにありません。
root@container1 $ exit
j@host $ docker run -it --name container2 alpine:3.3 sh
root@container2 $ ls /inside/data
ls: /inside/data: No such file or directory
root@container2 $ exit
実際、フォルダすらありません。その場所に何もマウントしなかったためです。ボリュームを使用しているため、データはコンテナーに保持されません。では、どうすれば再びそれを見つけることができますか?それはボリューム ( ) に永続my-data
化されます。別のコンテナーにマウントして見てみましょう (同じ場所にマウントする必要はありません。別のものを使用します)。
j@host $ docker run -it -v my-data:/different/folder --name container3 alpine:3.3 sh
root@container3 $ ls /different/folder
my-file
root@container3 $ exit
そのデータを取得して、別のコンテナにマウントできます。しかし、ボリューム内のデータは実際にはどこにあるのでしょうか? 私のホストファイルシステムでも。次のようにして確認できます。
j@host $ docker volume inspect my-data
[
{
"Name": "my-data",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/my-data/_data",
"Labels": {},
"Scope": "local"
}
]
わかりましたので、そのボリュームがホスト マシンのどこにあるかがわかります。そこにあるものを見てみましょう (root が所有しているため、sudo が必要です)。
j@host $ sudo ls /var/lib/docker/volumes/my-data/_data
my-file
そして、ファイルがあります!