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?
答案 0 :(得分:25)
-v
参数和VOLUME
关键字几乎相同。您可以使用-v
与VOLUME
具有相同的行为。
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,
所以问题是:VOLUME
中Dockerfile
的用途是什么?
容器文件系统由层组成,因此在那里写入,比普通文件系统更慢且有限(因为固定的层数)。
您在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
可以指定主机目录和容器目录。