ホスト上のdockerマウントボリューム


135

私は使用してボリュームとDockerコンテナ間でフォルダを共有することに成功しました

docker run -v /host/path:/container/path ...

しかし、私の質問は、これとVOLUMEDockerfileでコマンドを使用することの違いは何ですか

VOLUME /path

VOLUMEコマンドのあるイメージを使用していますが、それをホストと共有する方法を教えてください。-v上記のコマンドを使用して実行しましたが、-vとの両方が必要かどうかはわかりませんでしたVOLUME

回答:


155

このVOLUMEコマンドは、コンテナー内のディレクトリをマウントし、ユニオンファイルシステムをバイパスして、コンテナーファイル構造の外側のホストディスク上のそのディレクトリ内で作成または編集されたファイルを格納します。

アイデアは、Dockerコンテナー間でボリュームを共有でき、それらを参照するコンテナー(実行中または停止中)がある限り、それらは保持されます。

コンテナー--volumes-fromを実行するときにコマンドを使用して、他のコンテナーに既存のボリュームをマウントさせる(コンテナー間で効果的に共有する)ことができます。

基本的な違いVOLUMEとは-v:これで-vあなたのドッキングウィンドウコンテナ内で使用しているオペレーティングシステムから既存のファイルをマウントし、VOLUME、新しい空のボリュームを作成し、あなたのホスト上で、あなたのコンテナ内でそれをマウント。

例:

  1. を定義するDockerfileがありますVOLUME /var/lib/mysql
  2. Dockerイメージを作成してタグを付ける some-volume
  3. コンテナを実行します

その後、

  1. このボリュームを使用する別のDockerイメージがあります
  2. 次のコマンドでdockerコンテナーを実行します。 docker run --volumes-from some-volume docker-image-name:tag
  3. これで、ボリュームがsome-volumeマウントされるDockerコンテナーが実行されました。/var/lib/mysql

注:を使用--volumes-fromすると、ボリュームの場所に存在するものの上にボリュームがマウントされます。つまり/var/lib/mysql、に内容があった場合、ボリュームの内容で置き換えられます。


12
VOLUMEですでに指定されているディレクトリで-vを使用するとどうなりますか?
Jeff Storey 2014

6
--volumes-fromVOLUME指定したものの上にをマウントします-v。興味深いことに、特権モード(docker run --privileged)でコンテナーを実行しているように見え、umountING /var/lib/mysqlは空のディレクトリを残すだけなので、-vマウントがと競合する場合、マウントは完全に無視されますVOLUME
Chris McKinnel 2014

2
コンテナーがボリュームを参照する限り、ボリュームは保持されるとあなたは言いますが、私は他の場所でそれを見ました。 docs.docker.com/userguide/dockervolumesは、「データボリュームは、コンテナーのライフサイクルに関係なく、データを永続化するように設計されています。したがって、コンテナーを削除しても、Dockerがボリュームを自動的に削除したり、不要になったボリュームを「ガベージコレクション」したりすることはありません。コンテナによって参照されています。」これらのステートメントのいずれかが間違っている必要があります。
mc0e

1
コンテナーがボリュームを参照しなくなっても、ボリュームにあるファイルはディスク上に保持されますが、ボリューム自体は使用できなくなります(ボリュームをコンテナーに手動でフックする方法を正確に知らない限り、それでも私はしませんこれが可能かどうかを確認してください)。もう使えないとは、-volumes-fromを使用して使用できないことを意味します。上記の「ガベージコレクト」とは、ボリューム内にあったファイルをディスクから削除することを意味します。
クリスマッキンネル、2015年

1
それらは-vを使用して使用できますが、-volumes-fromは使用できません。Volumes-fromは、コンテナー名を取得してボリュームデータを取得します(すべてのボリュームポイントを取得すると思います)。ただし、-v自体については、名前付きボリュームを-vにの形式で提供できることがマニュアルに記載されていますnamed-volume:/path/in/container。名前のないボリュームには名前のハッシュが与えられ、孤立したボリュームにアクセスするためにホストパスの代わりにそれらのハッシュを提供できます。:) volume lsそれらをすべて表示しない可能性があることに注意してください- docker volume ls -f dangling=true同様に試してください。
ジャスミンヘグマン2016年

44

他の人が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

dockerホストがVMで実行されている場合はどうなりますか?たとえば、macのboot2docker。その後、これらのボリュームはリモートでのみ使用できます。また、説明したようにDockerfileでボリュームを使用すると、イメージのコンテンツがボリュームにコピーされます。ただし、ローカルディレクトリにマウントする場合、このコピーは行われません。これが事実である理由を知っていますか?ローカルにマウントされたボリュームを作成する方法はありますか?
LostSalad

4
docker-composeを使用すると、ホストosの特定の場所にボリュームをマウントできます。シムリンクは必要ありません...
Hugo Koopmans

@Tobia:docker-composeの例ドキュメントを参照 docs.docker.com/compose/compose-file/...
ヒューゴクープマンス

11

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>


8

基本的に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


8

これはDockerのドキュメント自体からのものであり、役に立つかもしれません。

「ホストディレクトリは、本質的にホストに依存しています。このため、Dockerfileからホストディレクトリをマウントすることはできません。構築されたイメージは移植可能であるため、VOLUME命令はhost-dirの受け渡しをサポートしていません。ホスト可能性のあるすべてのホストでディレクトリを使用できるわけではありません。」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.