Difference between VOLUME declaration in Dockerfile and -v as docker run parameter

时间:2016-10-20 19:34:39

标签: docker dockerfile

Could some one help me to understand the difference between:

VOLUME command in Dockerfile (image building layer)

and

-v paramter when issuing docker run-v/xyz/bla command (container building layer).

-v parameter is for me clear, it simply exposes a directory from the host to the container and vice versa, but how does VOLUME in Dockerfile behave differently?

3 个答案:

答案 0 :(得分:25)

-v参数和VOLUME关键字几乎相同。您可以使用-vVOLUME具有相同的行为。

docker run -v /data

相同
VOLUME /data

但-v还有更多用途,其中一个用于映射到卷:

docker run -v data:/data # Named volumes
docker run -v /var/data:/data # Host mounted volumes, this is what you refer to -v use, but as you can see there are more uses,

所以问题是:VOLUMEDockerfile的用途是什么?

容器文件系统由层组成,因此在那里写入,比普通文件系统更慢且有限(因为固定的层数)。

您在VOLUME中声明Dockerfile表示容器将写入应用程序数据的位置。例如,数据库容器,无论您在docker run中放置什么,其数据都会进入卷中。

如果为JBoss创建一个docker容器,并且想要使用libaio快速访问文件系统,则需要将数据目录声明为VOLUME,否则JBoss会在启动时崩溃。

总结VOLUME无论您在docker run中执行什么操作,都会声明一个卷。事实上,在docker run中,您无法撤消VOLUME中的Dockerfile声明。

此致

答案 1 :(得分:12)

简而言之

Dockerfile中的VOLUME [PATH]指令等同于

$ docker run -v $(docker volume create):[PATH] [IMAGE_NAME]

详细说明

  

容器文件系统由层组成,因此在那里写入比普通文件系统更慢且有限(因为固定的层数)。

在容器的生命周期中,使用Docker中的卷主要不是速度问题。从更快的磁盘安装卷显然会提高性能,但Docker的默认行为是VOLUME是在主机系统上创建一个命名卷,与容器的可写层相比,几乎没有速度改进。

  

-v参数对我来说很清楚,它只是将一个目录从主机暴露给容器,反之亦然

虽然这部分属实,但-v也可用于将named volumes挂载到Docker容器而不是目录。这个小细节对于理解VOLUME做了什么。一个例子:

$ docker volume create my_volume
$ docker run -v my_volume:[PATH] [IMAGE_NAME]

这里创建了一个名为my_volume的卷。它的行为与“正常”安装的预期相同。容器内[PATH]的任何更改都将保留在此卷中。不同之处在于Docker管理卷的位置,因此您无需担心(如果您感兴趣,则为/var/lib/docker/volumes/my_volume/_data)。你为什么要这个?你可以有一个测试数据库。虽然您不需要直接访问文件,但您可能希望保存当前状态以将其安装到其他数据库容器中。

VOLUME [PATH]指令基本上将上述指令保存到图像的元信息中。因此,每当您从此图像中启动容器时,Docker都知道您希望将[PATH]保留在卷中并进行处理。

答案 2 :(得分:1)

对于进入这篇文章并想知道 dockerfile 中的 VOLUME /docker/dir-v /host/dir:/docker/dir 命令中的 docker run 之间的区别的人:

VOLUME 只能将我们在容器中指定的目录映射到默认(系统分配的,通​​常是 /var/lib/docker/.... )主机目录。而 docker run -v 可以指定主机目录和容器目录。