docker在主机上安装卷

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上面的命令完成了它,但我不知道我是否需要-vVOLUME.

Chr*_*nel 147

VOLUME命令将在容器内安装一个目录,并将所有在该目录中创建或编辑的文件存储在容器文件结构之外的主机磁盘上,绕过union文件系统.

我们的想法是,您的卷可以在您的docker容器之间共享,只要有一个引用它们的容器(运行或停止),它们就会保持不变.

您可以让其他容器--volumes-from在运行容器时使用该命令装入现有卷(在容器之间有效地共享它们).

之间的根本区别VOLUME-v是这样的:-v将挂载搬运工容器内从您的操作系统的现有文件,并VOLUME创建一个新的空卷在主机上并安装它的容器内.

例:

  1. 你有一个定义a的Dockerfile VOLUME /var/lib/mysql.
  2. 您构建docker镜像并标记它 some-volume
  3. 你运行容器

然后,

  1. 您有另一个要使用此卷的泊坞窗图像
  2. 您使用以下代码运行docker容器: docker run --volumes-from some-volume docker-image-name:tag
  3. 现在你有一个运行的docker容器,它将some-volume安装卷/var/lib/mysql

注意:使用--volumes-from将将卷装入卷位置中存在的任何卷上.即,如果你有东西/var/lib/mysql,它将被替换为卷的内容.

  • 如果我在VOLUME中指定的目录上使用-v会发生什么? (12认同)
  • `--volumes-from`会将你的`VOLUME`挂载到你用`-v`指定的任何顶部.有趣的是,它似乎以特权模式运行容器(`docker run --privileged`)和`umount`ing`/var/lib/mysql`将只留下一个空目录,这样你的`-v`挂载就完全被忽略了它与`VOLUME`冲突. (6认同)
  • 你说只要容器引用它们就会保留卷,我在其他地方看到过.http://docs.docker.com/userguide/dockervolumes/说"数据卷旨在保存数据,与容器的生命周期无关.因此Docker在删除容器时不会自动删除卷,也不会"垃圾收集"容器不再引用的卷." 其中一个陈述一定是错的. (2认同)

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)

  • 使用docker-compose,您可以完全这样做,[在主机操作系统的特定位置安装卷](https://docs.docker.com/compose/compose-file/#volume-configuration-reference).不需要符号链接...... (4认同)

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>


nac*_*yot 7

基本上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


Ven*_*esa 6

这来自Docker文档本身,可能有帮助,简单明了:

"主机目录本质上是依赖于主机的.因此,您无法从Dockerfile安装主机目录,VOLUME指令不支持传递host-dir,因为构建的映像应该是可移植的.目录不会在所有潜在的主机上提供."