20190211 Dockerのボリュームはどこにあるの?を確認してみた
Dockerfileの中でVOLUME コマンドを使ってボリュームを割り当てたものの、実際は「あれれ、Dockerのボリュームはどこに行ったのかな?」となることがあるので、確認してみました。
ためした環境は、今回はWebからDockerの操作を体験できる、Play with Docker (PWD) です。
docker run や docker-compose で、コンテナ上のボリュームと、ホスト上のディレクトリを明示的に指定した場合は、どこにあるのかはわかりやすいのですが、たとえば、Dockerfile内で VOLUME の宣言をしたものの、起動時にはホスト側のどこに割り当てるか明示しなかった場合です。
$ cat Dockerfile
FROM ubuntu:latest
RUN mkdir /sample
WORKDIR /sample
RUN echo `date` > sample.txt
VOLUME /sample
$ docker build . -t sample_image
$ docker run --rm -it sample_image /bin/bash
root@cfe40ba202f3:/sample# cat sample.txt
Fri Feb 22 07:23:56 UTC 2019
root@cfe40ba202f3:/sample# exit
exit
$
とりあえずrunしても終了するだけなのですが、VOLUMEで割り当たった領域は、ホスト上のどこかにあるはず...。でも、オプション無しでは、カレントディレクトリにはありません。
実際はビルドのタイミングでは割り当たらずに、docker runでコンテナ起動の際に割り当たります。(つまり、コンテナのディレクトリに対して、ホスト側のディレクトリが紐づきます)
docker runしてコンテナが起動している状態で、docker inspect コンテナ名(ID)としてみると、JSONのフォーマットで情報が返ります。
ここで、Mountsの箇所をみると、ボリュームIDが取得できます。
Mountsの情報でボリュームのIDが取得できたので、あとはホスト側のdocker管理用のディレクトリ以下にデータがあることが確認できます。
docker inspect ボリュームID でも、ホスト上のどこのディレクトリにあるかがわかります。
ただし、ボリュームはdocker run時に明示的に指定しないと、その度に新規のボリュームが割り当たりますので、うっかりると使われないボリュームが沢山できてしまうので、ご注意を。