回答:
このVOLUME
コマンドは、コンテナー内のディレクトリをマウントし、ユニオンファイルシステムをバイパスして、コンテナーファイル構造の外側のホストディスク上のそのディレクトリ内で作成または編集されたファイルを格納します。
アイデアは、Dockerコンテナー間でボリュームを共有でき、それらを参照するコンテナー(実行中または停止中)がある限り、それらは保持されます。
コンテナー--volumes-from
を実行するときにコマンドを使用して、他のコンテナーに既存のボリュームをマウントさせる(コンテナー間で効果的に共有する)ことができます。
基本的な違いVOLUME
とは-v
:これで-v
あなたのドッキングウィンドウコンテナ内で使用しているオペレーティングシステムから既存のファイルをマウントし、VOLUME
う、新しい空のボリュームを作成し、あなたのホスト上で、あなたのコンテナ内でそれをマウント。
例:
VOLUME /var/lib/mysql
。some-volume
その後、
docker run --volumes-from some-volume docker-image-name:tag
some-volume
マウントされるDockerコンテナーが実行されました。/var/lib/mysql
注:を使用--volumes-from
すると、ボリュームの場所に存在するものの上にボリュームがマウントされます。つまり/var/lib/mysql
、に内容があった場合、ボリュームの内容で置き換えられます。
--volumes-from
でVOLUME
指定したものの上にをマウントします-v
。興味深いことに、特権モード(docker run --privileged
)でコンテナーを実行しているように見え、umount
ING /var/lib/mysql
は空のディレクトリを残すだけなので、-v
マウントがと競合する場合、マウントは完全に無視されますVOLUME
。
named-volume:/path/in/container
。名前のないボリュームには名前のハッシュが与えられ、孤立したボリュームにアクセスするためにホストパスの代わりにそれらのハッシュを提供できます。:) volume ls
それらをすべて表示しない可能性があることに注意してください- docker volume ls -f dangling=true
同様に試してください。
他の人がDockerのポイントを逃していると思うので、私自身の答えを付け加えましょう。
使用する VOLUME
特定のディレクトリに永続的なデータが含まれていることをDockerに通知するため、DockerfileでのはRight Way™です。Dockerはそのデータのボリュームを作成し、それを使用するすべてのコンテナーを削除しても、決して削除しません。
また、ユニオンファイルシステムをバイパスするため、ボリュームは、実際には、それを共有するすべてのコンテナーの適切な場所にマウント(読み取り/書き込みまたは読み取り専用)される実際のディレクトリになります。
これで、ホストからそのデータにアクセスするには、コンテナーを検査するだけで済みます。
# docker inspect myapp
[{
.
.
.
"Volumes": {
"/var/www": "/var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6...",
"/var/cache/nginx": "/var/lib/docker/vfs/dir/62499e6b31cb3f7f59bf00d8a16b48d2...",
"/var/log/nginx": "/var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87..."
},
"VolumesRW": {
"/var/www": false,
"/var/cache/nginx": true,
"/var/log/nginx": true
}
}]
私が通常行うことは、/ srvなどの標準的な場所にシンボリックリンクを作成することです。これにより、ボリュームに簡単にアクセスして、そこに含まれるデータを管理できます(気になるボリュームについてのみ)。
ln -s /var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6... /srv/myapp-www
ln -s /var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87... /srv/myapp-log
VOLUMEはDockerfile
、他のコンテナーが使用するボリュームを公開するために使用されます。例Dockerfile
として、次のように作成します。
からubuntu:14.04
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
イメージをビルドします。
$ docker build -t testing_volume .
コンテナーを実行します(container1など)。
$ docker run -it <image-id of above image> bash
次に、volumes-fromオプションを(say-container2)として別のコンテナーを実行します。
$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bash
すべてのデータを、container1 /myvol
ディレクトリから同じ場所のcontainer2に取得します。
-v
オプションは、コンテナの実行時にホストのコンテナのディレクトリをマウントするために使用されます。使い方は簡単で-v
、引数にオプションを指定するだけです<host-path>:<container-path>
です。コマンド全体は次のようになります$ docker run -v <host-path>:<container-path> <image-id>
基本的にVOLUME
、-v
オプションはほぼ同じです。これらは「コンテナの特定のディレクトリをマウントする」ことを意味します。たとえば、VOLUME /data
と-v /data
まったく同じ意味です。オプション付きVOLUME /data
または-v /data
オプション付きのイメージを実行すると、/data
ディレクトリはコンテナにマウントされます。このディレクトリはコンテナに属していません。
/data
コンテナーにいくつかのファイルを追加し、コンテナーを新しいイメージにコミットするとします。マウントされた/data
ディレクトリは元のコンテナに属しているため、データディレクトリにファイルはありません。
$ docker run -it -v /data --name volume ubuntu:14.04 bash
root@2b5e0f2d37cd:/# cd /data
root@2b5e0f2d37cd:/data# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/data# cd /tmp
root@2b5e0f2d37cd:/tmp# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/tmp# exit
exit
$ docker commit volume nacyot/volume
835cfe3d8d159622507ba3256bb1c0b0d6e7c1419ae32751ad0f925c40378945
nacyot $ docker run -it nacyot/volume
root@dbe335c7e64d:/# cd /data
root@dbe335c7e64d:/data# ls
root@dbe335c7e64d:/data# cd /tmp
root@dbe335c7e64d:/tmp# ls
1 2 3 4 5 6 7 8 9
root@dbe335c7e64d:/tmp#
root@dbe335c7e64d:/tmp#
このマウントされたディレクトリ/data
は、アプリケーションに属していないデータを格納するために使用されます。また、コンテナーに属さないデータディレクトリを次のように事前定義できます。VOLUME
。
Volume
と-v
オプションの違いは、-v
開始コンテナでオプションを動的に使用できることです。これは、一部のディレクトリを動的にマウントできることを意味します。もう1つの違いは、次のコマンドを使用して、ホストディレクトリをコンテナにマウントできることです。-v