Dockerfile:了解VOLUME指令

tre*_*der 22 docker dockerfile

我们来举个例子吧.

以下是VOLUME该指令nginx的图像:

VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

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

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

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

参考文献:

Adr*_*uat 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 }]
Run Code Online (Sandbox Code Playgroud)

我们可以看到Docker已经为该卷创建了一个目录/var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data.

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

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

  • 如果--rm给出该选项,则docker run在容器退出时将删除任何卷
  • 如果删除了容器docker rm -v CONTAINER,则将删除任何卷.

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

那么,具体问题:

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

更多信息:

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