Dockerfile:了解 VOLUME 指令
Dockerfile: understanding VOLUME instruction
举个例子
以下是nginx
图片的VOLUME
说明:
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
之间的主要区别是什么?
参考文献:
- https://github.com/dockerfile/nginx/blob/master/Dockerfile
- http://www.tech-d.net/2014/11/03/docker-indepth-volumes/
- How to mount host volumes into docker containers in Dockerfile during build
- http://jpetazzo.github.io/2015/01/19/dockerfile-and-data-in-volumes/
容器的卷只是主机上的目录,不管它们是用什么方法创建的。如果您没有在主机上指定目录,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
的卷创建了一个目录。
您可以从主机免费访问此目录中的 modify/add/delete 个文件,但请注意,您可能需要使用 sudo
权限。
Docker只会在两种情况下删除卷目录:
- 如果
--rm
选项被赋予docker run
,当容器退出时任何卷都将被删除
- 如果使用
docker rm -v CONTAINER
删除容器,所有卷都将被删除。
在这两种情况下,只有当没有其他容器引用它们时,才会删除卷。 Docker 永远不会删除映射到特定主机目录(-v HOST_DIR:CON_DIR
语法)的卷。但是,如果您删除卷的容器,命名方案意味着您将很难确定哪个目录包含该卷。
所以,具体问题:
- 是的,是的,但有上述注意事项。
- 每个 Docker 托管卷在主机上获得一个新目录
VOLUME
指令与 -v
相同,但未指定主机目录。指定主机目录时,Docker 不会为卷创建任何目录,不会从映像中复制文件,也不会删除卷(docker rm -v CONTAINER
不会删除映射到用户指定的卷主机目录)。
更多信息在这里:
https://blog.container-solutions.com/understanding-volumes-docker
举个例子
以下是nginx
图片的VOLUME
说明:
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
之间的主要区别是什么?
参考文献:
- https://github.com/dockerfile/nginx/blob/master/Dockerfile
- http://www.tech-d.net/2014/11/03/docker-indepth-volumes/
- How to mount host volumes into docker containers in Dockerfile during build
- http://jpetazzo.github.io/2015/01/19/dockerfile-and-data-in-volumes/
容器的卷只是主机上的目录,不管它们是用什么方法创建的。如果您没有在主机上指定目录,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
的卷创建了一个目录。
您可以从主机免费访问此目录中的 modify/add/delete 个文件,但请注意,您可能需要使用 sudo
权限。
Docker只会在两种情况下删除卷目录:
- 如果
--rm
选项被赋予docker run
,当容器退出时任何卷都将被删除 - 如果使用
docker rm -v CONTAINER
删除容器,所有卷都将被删除。
在这两种情况下,只有当没有其他容器引用它们时,才会删除卷。 Docker 永远不会删除映射到特定主机目录(-v HOST_DIR:CON_DIR
语法)的卷。但是,如果您删除卷的容器,命名方案意味着您将很难确定哪个目录包含该卷。
所以,具体问题:
- 是的,是的,但有上述注意事项。
- 每个 Docker 托管卷在主机上获得一个新目录
VOLUME
指令与-v
相同,但未指定主机目录。指定主机目录时,Docker 不会为卷创建任何目录,不会从映像中复制文件,也不会删除卷(docker rm -v CONTAINER
不会删除映射到用户指定的卷主机目录)。
更多信息在这里:
https://blog.container-solutions.com/understanding-volumes-docker