Jef*_*rey 123 volumes mount-point docker
我已经成功地能够在使用卷的docker容器之间共享文件夹
docker run -v /host/path:/container/path ...
Run Code Online (Sandbox Code Playgroud)
但我的问题是这与使用VOLUMEDockerfile中的命令有什么区别
VOLUME /path
Run Code Online (Sandbox Code Playgroud)
我正在使用一个有VOLUME命令的图像,我想知道如何与我的主机共享它.我使用-v上面的命令完成了它,但我不知道我是否需要-v和VOLUME.
Chr*_*nel 147
该VOLUME命令将在容器内安装一个目录,并将所有在该目录中创建或编辑的文件存储在容器文件结构之外的主机磁盘上,绕过union文件系统.
我们的想法是,您的卷可以在您的docker容器之间共享,只要有一个引用它们的容器(运行或停止),它们就会保持不变.
您可以让其他容器--volumes-from在运行容器时使用该命令装入现有卷(在容器之间有效地共享它们).
之间的根本区别VOLUME和-v是这样的:-v将挂载搬运工容器内从您的操作系统的现有文件,并VOLUME会创建一个新的空卷在主机上并安装它的容器内.
例:
VOLUME /var/lib/mysql.some-volume然后,
docker run --volumes-from some-volume docker-image-name:tagsome-volume安装卷/var/lib/mysql注意:使用--volumes-from将将卷装入卷位置中存在的任何卷上.即,如果你有东西/var/lib/mysql,它将被替换为卷的内容.
Tob*_*bia 37
让我添加自己的答案,因为我相信其他人都错过了Docker的观点.
使用VOLUME在Dockerfile才是正道™,因为你让码头工人知道某个目录包含永久数据.Docker将为该数据创建一个卷,并且永远不会删除它,即使您删除了使用它的所有容器.
它还绕过了union文件系统,因此该卷实际上是一个实际的目录,可以在共享它的所有容器中的正确位置进行挂载(读写或只读).
现在,为了从主机访问该数据,您只需要检查您的容器:
# 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
}
}]
Run Code Online (Sandbox Code Playgroud)
我通常做的是在某些标准位置(例如/ srv)创建符号链接,以便我可以轻松访问卷并管理它们包含的数据(仅适用于您关注的卷):
ln -s /var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6... /srv/myapp-www
ln -s /var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87... /srv/myapp-log
Run Code Online (Sandbox Code Playgroud)
Yog*_*war 10
VOLUME用于Dockerfile公开其他容器使用的体积.例如,创建Dockerfile为:
来自ubuntu:14.04
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
Run Code Online (Sandbox Code Playgroud)
建立图像:
$ docker build -t testing_volume .
运行容器,比如container1:
$ docker run -it <image-id of above image> bash
现在运行另一个带有volume-from选项的容器(例如-tamin2)
$ 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#
Run Code Online (Sandbox Code Playgroud)
此安装目录/data用于存储不属于您的应用程序的数据.您可以使用预定义不属于容器的数据目录VOLUME.
Volume和-v选项之间的区别在于您可以-v在启动容器上动态使用选项.这意味着你可以动态安装一些目录.另一个区别是您可以使用安装主机目录-v
这来自Docker文档本身,可能有帮助,简单明了:
"主机目录本质上是依赖于主机的.因此,您无法从Dockerfile安装主机目录,VOLUME指令不支持传递host-dir,因为构建的映像应该是可移植的.目录不会在所有潜在的主机上提供."
| 归档时间: |
|
| 查看次数: |
147439 次 |
| 最近记录: |