web-dev-qa-db-ja.com

ホスト上のdocker取り付けボリューム

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

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

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

VOLUME /path

VOLUMEコマンドを含むイメージを使用していますが、それを自分のホストと共有する方法を知りたいです。上記の-vコマンドを使用して実行しましたが、-vVOLUMEの両方が必要かどうかわかりませんでした。

113
Jeff Storey

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

アイデアは、ドッカーコンテナー間でボリュームを共有でき、それらを参照するコンテナー(実行中または停止中)が存在する限り、ボリュームは維持されるということです。

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

VOLUME-vの基本的な違いは次のとおりです。-vは、Dockerコンテナー内のオペレーティングシステムから既存のファイルをマウントし、VOLUMEはホスト上で新しい空のボリュームを作成し、コンテナー内にマウントします。

例:

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

その後、

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

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

142
Chris McKinnel

他の人はDockerのポイントを見逃していると思うので、私は私自身の答えを付け加えさせてください。

DockerファイルでVOLUMEを使用するのはRight Way™です。これは、特定のディレクトリに永続的なデータが含まれていることをDockerに知らせるためです。 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
33
Tobia

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

今度は(from-container2)のようにvolumes-fromオプションで別のコンテナを実行します。

$ 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>のようになります。

9
Yogesh Jilhawar

基本的に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オプションを動的に使用できることです。つまり、ディレクトリを動的にマウントできるということです。そしてもう一つの違いは、-vを使ってあなたのコンテナにあなたのホストディレクトリをマウントできるということです。

7
nacyot

これはDockerのドキュメンテーションそのものからのもので、助けになるかもしれません。

「Hostディレクトリは、その性質上、Hostに依存します。このため、DockerfileからHostディレクトリをマウントすることはできません。構築されたイメージは移植可能であるため、VOLUME命令はHost-dirの受け渡しをサポートしません。ディレクトリはすべての潜在的なホストで利用できるわけではないでしょう "#:。

6
Vennesa