DockerfileのVOLUMEの目的は何ですか


106

私はDockerのボリュームについての理解を深めようとしていますが、次の違いやユースケースを理解するのに苦労しています。

  • docker volume createコマンド
  • docker run -v /path:/host_path
  • ファイルのVOLUMEエントリDockerfile

VOLUMEエントリーと-vフラグを組み合わせるとどうなるか、特にわかりません。


回答:


70

ボリュームは、に保存されている永続的なデータです /var/lib/docker/volumes/...

  • Dockerfileで宣言することもできます。つまり、オプションがない場合でも、イメージからコンテナーが起動されるたびにボリュームが作成されます(empty-v

  • 実行時に宣言できますdocker run -v [host-dir:]container-dir
    2つを組み合わせること(VOLUME+ docker run -v)は、ホストフォルダーのコンテンツを、コンテナーによって永続化されたボリュームにマウントできることを意味します/var/lib/docker/volumes/...

  • docker volume createは、Dockerfileを定義してイメージをビルドし、コンテナを実行することなく、ボリュームを作成します。これは、他のコンテナーがボリュームをマウントできるようにするために使用されます。

ボリュームの一部のコンテンツを保持しているが、その後コンテナーを削除した場合(デフォルトでは、Docker rm -vを使用していない限り、関連付けられたボリュームは削除されません)、そのボリュームを新しいコンテナーに再接続できます(宣言同じボリューム)。

Docker-コンテナに接続されていないボリュームにアクセスする方法」を参照してください。
docker volume createを使用すると、名前付きボリュームをコンテナーに簡単に再接続できます。

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!

2
Dockerfilewith VOLUME-v /path:/host_path/フラグを使用するとします。のコンテンツは?VOLUMEのコンテンツによってオーバーライドされます/host_path/
radium226

@VonCのおかげで、私はそれを理解したと思います:)そして、をdocker volume create --name my_volume続けたdocker run --volume-from my_volume場合、マウントポイントがどこにあるかをどのようにして知ることができますか?
radium226

@ radium226マウントポイントなし(ホストからマウントされたものはなく、ネイティブの空の/ var / lib / docker / volume以外)。ボリュームのパスはmy_volumeメタデータにあります:stackoverflow.com/a/31997267/6309
VonC

ホスト側にマウントポイントがないことを理解しています。しかし、で起動された実行中のコンテナ内docker run ...で、my_volumeボリュームに保存されているファイルに書き込むにはどうすればよいですか?パスがわからない?何も定義していないため、実行中のコンテナ内のボリュームの 私は自分の
語彙が

1
@ radium226 docker volume create --name anameは、名前付きボリュームを作成します。実行時にコンテナーパスを割り当てます。docker run -v aname:/apath:そのコンテナーには、/ apathフォルダーにマウントされたボリュームがアタッチされています。それを明確にするために答えを書き直しました。
VonC、2016年

11

VOLUMEvolumes-fromランタイムパラメータと組み合わせると、命令が面白くなります。

次のDockerfileがあるとします。

FROM busybox
VOLUME /myvolume

以下を使用してイメージを作成します。

docker build -t my-bb .

そして、次のコマンドでコンテナを起動します。

docker run --rm -it --name my-first-bb my-bb

最初に気付くのは、この画像にという名前のフォルダがあることですmyvolume。しかし、コンテナを終了するとボリュームも削除されるため、特に興味深いことではありません。

このフォルダーに空のファイルを作成するため、コンテナーで次のコマンドを実行します。

cd myvolume
touch hello.txt

新しいコンテナを起動しますが、同じボリュームをと共有しmy-first-bbます:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

あなたはそれが表示されますmy-second-bbファイルが含まhello.txtmyvolumeフォルダを。

両方のコンテナを終了すると、ボリュームも削除されます。


ボリュームは匿名ボリュームであり、--rmオプションでコンテナーを開始したため、削除されます。私はそれを言及してうまくいくかもしれないと思います。でコンテナを開始しなかった場合--rmでも、でコンテナとその匿名ボリュームを削除できますdocker rm -v my-container
AymDev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.