Dockerfile:理解VOLUME指令

我们来举个例子。

以下是nginx镜像的VOLUME指令:

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

这是我的问题:

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

  2. 如果这些目录中的一些(或全部)已经存在于我的主机中,会发生什么? 例如,假设图像在容器的/etc/nginx目录下有一个默认的configuration文件,而我的主机上的/etc/nginx也有一个configuration文件。 当容器启动时,这些文件中哪个会优先?

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

参考文献:

  • https://github.com/dockerfile/nginx/blob/master/Dockerfile
  • http://www.tech-d.net/2014/11/03/docker-indepth-volumes/
  • 如何在构build期间将主机卷装入Dockerfile的Docker容器中
  • http://jpetazzo.github.io/2015/01/19/dockerfile-and-data-in-volumes/

容器的卷只是主机上的目录,无论它们是由哪个方法创build的。 如果你没有在主机上指定一个目录,Docker会为这个卷创build一个新目录,通常在/var/lib/docker/vfs

但是,卷已经创build,通过使用docker inspect命令很容易find它在主机上的位置,例如:

 $ 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处的卷创build了一个目录。

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

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

  • 如果给--rm指定了--rm选项,当容器退出时,任何卷都将被删除
  • 如果用docker rm -v CONTAINER删除一个容器,任何卷都将被删除。

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

那么,具体的问题是:

  1. 是的,是的,与上述警告。
  2. 每个Docker托pipe卷都会在主机上获取一个新的目录
  3. VOLUME指令与-v相同,无需指定主机目录。 当指定主机目录时,Docker不会为卷创build任何目录,也不会从映像中复制文件,也不会删除卷( docker rm -v CONTAINER不会删除映射到用户指定主机目录的卷)。

更多信息在这里:

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