例を見てみましょう。
以下は、VOLUME
イメージのnginx
命令です。
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
これが私の質問です:
コンテナを起動すると、これらのディレクトリは私のホストに表示されますか?そして、コンテナを停止しても、ディレクトリは残りますか?
これらのディレクトリの一部(またはすべて)がホストにすでに存在する場合、どうなりますか?たとえば、イメージにコンテナの/etc/nginx
ディレクトリ内のデフォルトの設定ファイルが付属していて、ホストの/etc/nginx
内にも設定ファイルがあるとします。コンテナが起動すると、これらのファイルのどれが優先されますか?
-v /Host/dir:container/dir
とVOLUME
の主な違いは何ですか?
参照:
コンテナのボリュームは、作成方法に関係なく、ホスト上の単なるディレクトリです。ホスト上のディレクトリを指定しない場合、Dockerはボリュームの新しいディレクトリを作成します。通常は/var/lib/docker/vfs
の下にあります。
ボリュームは作成されましたが、docker inspect
コマンドを使用すると、ホスト上のどこにあるかを簡単に見つけることができます。例:
$ ID=$(docker run -d -v /data debian echo "Data container")
$ docker inspect -f {{.Mounts}} $ID
[{0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951 /var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data /data local true }]
Dockerがボリュームのディレクトリを/var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data
に作成したことがわかります。
このディレクトリ内のファイルをホストから自由に変更/追加/削除できますが、アクセス許可にはSudo
を使用する必要がある場合があることに注意してください。
Dockerは、次の2つの状況でのみボリュームディレクトリを削除します。
--rm
オプションがdocker run
に指定されている場合、コンテナーが終了すると、ボリュームはすべて削除されます。docker rm -v CONTAINER
で削除されると、ボリュームはすべて削除されます。どちらの場合も、他のコンテナーがボリュームを参照していない場合にのみ、ボリュームが削除されます。特定のホストディレクトリ(-v Host_DIR:CON_DIR
構文)にマップされたボリュームは、Dockerによって削除されることはありません。ただし、ボリュームのコンテナを削除すると、命名スキームにより、どのディレクトリにボリュームが含まれているかを特定するのが困難になります。
だから、特定の質問:
VOLUME
命令は、ホストディレクトリを指定せずに-v
と同じです。ホストディレクトリが指定されている場合、Dockerはボリュームのディレクトリを作成せず、イメージからファイルをコピーせず、ボリュームを削除しません(docker rm -v CONTAINER
はユーザー指定のホストディレクトリにマップされたボリュームを削除しません)。詳細はこちら:
http://container-solutions.com/2014/12/understanding-volumes-docker/