我们举一个例子。
以下是VOLUME
图片的nginx
说明:
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
以下是我的问题:
启动容器时,这些目录会显示在我的主机上吗?当我停止我的容器时,目录将保留?
如果我的主机中已存在某些(或所有)这些目录,会发生什么?例如,假设图像附带容器的/etc/nginx
目录中的默认配置文件,并且我的主机上的/etc/nginx
内也有一个配置文件。当容器启动时,哪些文件将获得优先权?
-v /host/dir:container/dir
和VOLUME
之间的主要区别是什么?
参考文献:
答案 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
语法)。但是,如果删除卷的容器,则命名方案意味着您将很难确定哪个目录包含该卷。
所以,具体问题:
VOLUME
指令与-v
相同,但未指定主机目录。指定主机目录时,Docker不会为卷创建任何目录,也不会从映像复制文件,也不会删除卷(docker rm -v CONTAINER
不会删除映射到用户指定主机目录的卷)。 此处提供更多信息:
http://container-solutions.com/2014/12/understanding-volumes-docker/