我已经成功地能够在Docker容器与卷之间共享文件夹,
docker run -v /host/path:/container/path ...
字符串但我的问题是,这与在Dockerfile中使用VOLUME命令有什么区别
VOLUME
VOLUME /path
型我正在使用一个具有VOLUME命令的映像,我想知道如何与主机共享它。我已经使用上面的-v命令完成了此操作,但我不知道是否需要-v和VOLUME。
-v
t9aqgxwy1#
VOLUME命令将挂载容器内的一个目录,并将在该目录内创建或编辑的任何文件存储在主机磁盘上 * 容器文件结构之外 *,绕过联合文件系统。这个想法是,你的卷可以在你的docker容器之间共享,只要有一个容器(运行或停止)引用它们,它们就会一直存在。您可以让其他容器在运行容器时使用--volumes-from命令来挂载现有卷(有效地在容器之间共享它们)。VOLUME和-v之间的根本区别在于:-v将在Docker容器中挂载来自操作系统的现有文件,而VOLUME将在主机上创建一个新的空卷并将其挂载到容器中。范例:1.你有一个定义VOLUME /var/lib/mysql的Dockerfile。1.构建Docker镜像并标记为some-volume1.你负责集装箱然后,1.您有另一个Docker映像要使用此卷1.使用以下命令运行docker容器:docker run --volumes-from some-volume docker-image-name:tag1.现在,您有一个正在运行的Docker容器,它将把来自some-volume的卷装载到/var/lib/mysql中注意事项:使用--volumes-from会将卷挂载到卷所在位置的任何内容上。也就是说,如果你在/var/lib/mysql中有东西,它将被替换为卷的内容。
--volumes-from
VOLUME /var/lib/mysql
some-volume
docker run --volumes-from some-volume docker-image-name:tag
/var/lib/mysql
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
型
dsekswqp3#
VOLUME在Dockerfile中用于公开其他容器要使用的卷。例如,将Dockerfile创建为:来自ubuntu:14.04
Dockerfile
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>
$ docker build -t testing_volume .
$ docker run -it <image-id of above image> bash
$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bash
/myvol
<host-path>:<container-path>
$ docker run -v <host-path>:<container-path> <image-id>
v7pvogib4#
基本上VOLUME和-v选项几乎是相等的。这意味着'在您的容器上挂载特定目录'。例如,VOLUME /data和-v /data是完全相同的含义。如果您运行具有VOLUME /data或-v /data选项的映像,则/data目录将挂载到您的容器。此目录不属于您的容器。假设你在容器上的/data中添加了一些文件,然后将容器提交到新的镜像中。数据目录上没有任何文件,因为挂载的/data目录属于原始容器。
VOLUME /data
-v /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在容器上挂载主机目录
Volume
tgabmvqs5#
这来自Docker文档本身,可能会有帮助,简单明了:主机目录本质上是依赖于主机的。因此,您无法从Dockerfile装载主机目录,VOLUME指令不支持传递host-dir,因为构建的映像应该是可移植的。主机目录不会在所有潜在主机上都可用。
c90pui9n6#
如果你来这里是因为你正在寻找一种简单的方式来浏览任何VOLUME:1.用docker volume list找出卷的名称1.关闭此卷附加到的所有正在运行的容器1.运行docker run -it --rm --mount source=[NAME OF VOLUME],target=/volume busybox
docker volume list
docker run -it --rm --mount source=[NAME OF VOLUME],target=/volume busybox
cd /volume
6条答案
按热度按时间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
中有东西,它将被替换为卷的内容。kmbjn2e32#
让我补充一下我自己的答案,因为我相信其他人都错过了Docker的要点。
在Dockerfile中使用
VOLUME
是正确的方法,因为你让Docker知道某个目录包含永久数据。Docker将为该数据创建一个卷,并且永远不会删除它,即使你删除了所有使用它的容器。它还绕过了联合文件系统,因此卷实际上是一个实际的目录,它被挂载(读写或只读)在共享它的所有容器中的正确位置。
现在,为了从主机访问这些数据,您只需要检查您的容器:
字符串
我通常做的是在一些标准的地方(如/srv)创建符号链接,这样我就可以轻松地访问卷并管理它们包含的数据(仅针对您关心的卷):
型
dsekswqp3#
VOLUME在
Dockerfile
中用于公开其他容器要使用的卷。例如,将Dockerfile
创建为:来自ubuntu:14.04
字符串
构建图像:
$ 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>
v7pvogib4#
基本上
VOLUME
和-v
选项几乎是相等的。这意味着'在您的容器上挂载特定目录'。例如,VOLUME /data
和-v /data
是完全相同的含义。如果您运行具有VOLUME /data
或-v /data
选项的映像,则/data
目录将挂载到您的容器。此目录不属于您的容器。假设你在容器上的
/data
中添加了一些文件,然后将容器提交到新的镜像中。数据目录上没有任何文件,因为挂载的/data
目录属于原始容器。字符串
这个挂载目录(如
/data
)用于存储不属于您的应用程序的数据。您可以使用VOLUME
来删除不属于容器的数据目录。Volume
和-v
选项之间的区别是,您可以在启动容器时动态使用-v
选项。这意味着您可以动态挂载某些目录。另一个区别是,您可以使用-v
在容器上挂载主机目录tgabmvqs5#
这来自Docker文档本身,可能会有帮助,简单明了:
主机目录本质上是依赖于主机的。因此,您无法从Dockerfile装载主机目录,VOLUME指令不支持传递host-dir,因为构建的映像应该是可移植的。主机目录不会在所有潜在主机上都可用。
c90pui9n6#
如果你来这里是因为你正在寻找一种简单的方式来浏览任何
VOLUME
:1.用
docker volume list
找出卷的名称1.关闭此卷附加到的所有正在运行的容器
1.运行
docker run -it --rm --mount source=[NAME OF VOLUME],target=/volume busybox
cd /volume
以进入卷。