“docker run -v.”volume和Dockerfile VOLUME有什么区别?

yvfmudvl  于 2024-01-06  发布在  Docker
关注(0)|答案(6)|浏览(205)

我已经成功地能够在Docker容器与卷之间共享文件夹,

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

字符串
但我的问题是,这与在Dockerfile中使用VOLUME命令有什么区别

VOLUME /path


我正在使用一个具有VOLUME命令的映像,我想知道如何与主机共享它。我已经使用上面的-v命令完成了此操作,但我不知道是否需要-vVOLUME

t9aqgxwy

t9aqgxwy1#

VOLUME命令将挂载容器内的一个目录,并将在该目录内创建或编辑的任何文件存储在主机磁盘上 * 容器文件结构之外 *,绕过联合文件系统。
这个想法是,你的卷可以在你的docker容器之间共享,只要有一个容器(运行或停止)引用它们,它们就会一直存在。
您可以让其他容器在运行容器时使用--volumes-from命令来挂载现有卷(有效地在容器之间共享它们)。
VOLUME-v之间的根本区别在于:-v将在Docker容器中挂载来自操作系统的现有文件,而VOLUME将在主机上创建一个新的空卷并将其挂载到容器中。
范例:
1.你有一个定义VOLUME /var/lib/mysql的Dockerfile。
1.构建Docker镜像并标记为some-volume
1.你负责集装箱
然后,
1.您有另一个Docker映像要使用此卷
1.使用以下命令运行docker容器:docker run --volumes-from some-volume docker-image-name:tag
1.现在,您有一个正在运行的Docker容器,它将把来自some-volume的卷装载到/var/lib/mysql
注意事项:使用--volumes-from会将卷挂载到卷所在位置的任何内容上。也就是说,如果你在/var/lib/mysql中有东西,它将被替换为卷的内容。

kmbjn2e3

kmbjn2e32#

让我补充一下我自己的答案,因为我相信其他人都错过了Docker的要点。
在Dockerfile中使用VOLUME是正确的方法,因为你让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

dsekswqp

dsekswqp3#

VOLUME在Dockerfile中用于公开其他容器要使用的卷。例如,将Dockerfile创建为:
来自ubuntu:14.04

RUN mkdir /myvol  
RUN echo "hello world" > /myvol/greeting  
VOLUME /myvol

字符串
构建图像:
$ docker build -t testing_volume .
运行容器,比如container 1:
$ docker run -it <image-id of above image> bash
现在运行另一个包含volumes-from选项的容器(比如-container 2)
$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bash
您将从container 1 /myvol目录中获取所有数据到同一位置的container 2中。
-v选项是在容器运行时给出的,用于将容器的目录挂载到主机上。它使用简单,只需提供-v选项,参数为<host-path>:<container-path>。整个命令可能为$ docker run -v <host-path>:<container-path> <image-id>

v7pvogib

v7pvogib4#

基本上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在容器上挂载主机目录

tgabmvqs

tgabmvqs5#

这来自Docker文档本身,可能会有帮助,简单明了:
主机目录本质上是依赖于主机的。因此,您无法从Dockerfile装载主机目录,VOLUME指令不支持传递host-dir,因为构建的映像应该是可移植的。主机目录不会在所有潜在主机上都可用。

c90pui9n

c90pui9n6#

如果你来这里是因为你正在寻找一种简单的方式来浏览任何VOLUME
1.用docker volume list找出卷的名称
1.关闭此卷附加到的所有正在运行的容器
1.运行docker run -it --rm --mount source=[NAME OF VOLUME],target=/volume busybox

  1. shell将打开. cd /volume以进入卷。

相关问题