Dockerfile:了解VOLUME指令

时间:2015-02-14 00:25:40

标签: docker dockerfile

我们举一个例子。

以下是VOLUME图片的nginx说明:

VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

以下是我的问题:

  1. 启动容器时,这些目录会显示在我的主机上吗?当我停止我的容器时,目录将保留?

  2. 如果我的主机中已存在某些(或所有)这些目录,会发生什么?例如,假设图像附带容器的/etc/nginx目录中的默认配置文件,并且我的主机上的/etc/nginx内也有一个配置文件。当容器启动时,哪些文件将获得优先权?

  3. -v /host/dir:container/dirVOLUME之间的主要区别是什么?

  4. 参考文献:

1 个答案:

答案 0 :(得分:22)

容器的卷只是主机上的目录,无论它们是由什么方法创建的。如果您未在主机上指定目录,Docker将为该卷创建一个新目录,通常位于/var/lib/docker/vfs下。

但是创建了卷,可以使用docker inspect命令轻松找到它在主机上的位置,例如:

$ ID=$(docker run -d -v /data debian echo "Data container")
$ docker inspect -f {{.Mounts}} $ID
[{0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951 /var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data /data local  true }]

我们可以看到Docker已在/var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data创建了一个卷的目录。

您可以从主机中自由修改/添加/删除此目录中的文件,但请注意,您可能需要使用sudo获取权限。

Docker只会在两种情况下删除卷目录:

  • 如果--rm选项被赋予docker run,则当容器退出时将删除所有卷
  • 如果使用docker rm -v CONTAINER删除容器,则将删除所有卷。

在这两种情况下,只有在没有其他容器引用它们时才会删除卷。 Docker永远不会删除映射到特定主机目录的卷(-v HOST_DIR:CON_DIR语法)。但是,如果删除卷的容器,则命名方案意味着您将很难确定哪个目录包含该卷。

所以,具体问题:

  1. 是的,是的,有上述警告。
  2. 每个Docker托管卷都在主机上获取一个新目录
  3. VOLUME指令与-v相同,但未指定主机目录。指定主机目录时,Docker不会为卷创建任何目录,也不会从映像复制文件,也不会删除卷(docker rm -v CONTAINER不会删除映射到用户指定主机目录的卷)。
  4. 此处提供更多信息:

    http://container-solutions.com/2014/12/understanding-volumes-docker/