6

私は Docker の初心者で、ボリュームのトピックをよりよく理解しようとしています。ここで私はそれを見ます:

  • コンテナーが作成されると、ボリュームが初期化されます。コンテナーの基本イメージに指定されたマウント ポイントのデータが含まれている場合、その既存のデータは、ボリュームの初期化時に新しいボリュームにコピーされます。(これは、ホスト ディレクトリをマウントする場合には適用されないことに注意してください。)
  • データ ボリュームは、コンテナ間で共有および再利用できます。
  • データ ボリュームへの変更は直接行われます。
  • イメージを更新する場合、データ ボリュームへの変更は含まれません。
  • コンテナー自体が削除されても、データ ボリュームは保持されます。
  • データ ボリュームは、コンテナーのライフ サイクルに関係なく、データを保持するように設計されています。したがって、Docker は、コンテナーを削除するときにボリュームを自動的に削除したり、コンテナーによって参照されなくなったボリュームを「ガベージ コレクション」したりすることはありません。

これを除いて、これは非常に明確です:

  • イメージを更新する場合、データ ボリュームへの変更は含まれません。

私はこれをよりよく理解するのに本当に苦労しています。おそらくいくつかの基本的な例で、誰かが私にもっと明確な概要を提供できますか?

ありがとう!

4

2 に答える 2

7

ボリュームは、コンテナーのファイル システムの外に存在します。それらは実行時にマウントされますが、それらのデータはコンテナー内に存在しません。例を見てみましょう:

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

そして、ファイルがあります!

于 2016-06-29T18:36:59.440 に答える
2

データ ボリュームが他のプロセスによって変更された場合 (他のコンテナーまたは他のシステムから変更される可能性があります)、Docker イメージをビルド/更新するときに変更が含まれたり記録されたりしないことを言おうとしていると思います。これは非常に明白です。

于 2016-06-29T14:34:48.907 に答える