web-dev-qa-db-ja.com

Dockerfile:VOLUME命令を理解する

例を見てみましょう。

以下は、VOLUMEイメージのnginx命令です。

VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

これが私の質問です:

  1. コンテナを起動すると、これらのディレクトリは私のホストに表示されますか?そして、コンテナを停止しても、ディレクトリは残りますか?

  2. これらのディレクトリの一部(またはすべて)がホストにすでに存在する場合、どうなりますか?たとえば、イメージにコンテナの/etc/nginxディレクトリ内のデフォルトの設定ファイルが付属していて、ホストの/etc/nginx内にも設定ファイルがあるとします。コンテナが起動すると、これらのファイルのどれが優先されますか?

  3. -v /Host/dir:container/dirVOLUMEの主な違いは何ですか?

参照:

22
treecoder

コンテナのボリュームは、作成方法に関係なく、ホスト上の単なるディレクトリです。ホスト上のディレクトリを指定しない場合、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によって削除されることはありません。ただし、ボリュームのコンテナを削除すると、命名スキームにより、どのディレクトリにボリュームが含まれているかを特定するのが困難になります。

だから、特定の質問:

  1. はい、はい、上記の警告があります。
  2. 各Docker管理ボリュームは、ホスト上に新しいディレクトリを取得します
  3. VOLUME命令は、ホストディレクトリを指定せずに-vと同じです。ホストディレクトリが指定されている場合、Dockerはボリュームのディレクトリを作成せず、イメージからファイルをコピーせず、ボリュームを削除しません(docker rm -v CONTAINERはユーザー指定のホストディレクトリにマップされたボリュームを削除しません)。

詳細はこちら:

http://container-solutions.com/2014/12/understanding-volumes-docker/

24
Adrian Mouat