Answers:
该VOLUME
命令将在您的容器内安装目录,并将在该目录内创建或编辑的所有文件存储在容器文件结构外部的主机磁盘上,绕过联合文件系统。
这个想法是,您的卷可以在您的docker容器之间共享,并且只要存在引用它们的容器(正在运行或已停止),它们就将一直存在。
--volumes-from
运行容器时,可以使用命令让其他容器安装现有卷(在容器之间有效地共享它们)。
VOLUME
和之间的根本区别-v
是:-v
将来自操作系统的现有文件安装在Docker容器中,VOLUME
并将在主机上创建一个新的空卷,并将其安装在容器中。
例:
VOLUME /var/lib/mysql
。some-volume
然后,
docker run --volumes-from some-volume docker-image-name:tag
some-volume
装入该卷/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
在Dockerfile中使用的是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
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
现在运行另一个带有volume-from选项的容器,例如(say-container2)
$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bash
您将从容器1 /myvol
目录中的所有数据进入容器2的相同位置。
-v
option在容器运行时给出,用于将容器的目录挂载到主机上。使用简单,只需提供-v
带参数的option作为即可<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
option 之间的区别是可以-v
在启动容器上动态使用option。这意味着您可以动态安装某些目录。另一个区别是您可以通过使用以下命令将主机目录挂载到容器上-v