Dockerfile中的VOLUME声明与-v作为docker运行参数的区别

有人能帮我理解两者之间的区别吗?

Dockerfile VOLUME命令(图像构build层)

-v参数发出docker run -v /xyz/bla命令(容器构build层)。

-v参数对我来说是清楚的,它只是从主机向容器公开一个目录,反之亦然,但是Dockerfile中的VOLUME行为有什么不同呢?

-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, 

所以问题是: DockerfileVOLUMEDockerfile什么?

容器文件系统是由写在那里的图层组成的,比普通的文件系统更慢和受限(因为固定的图层数量)。

您在Dockerfile声明VOLUME来表示容器将写入应用程序数据的位置。 例如一个数据库容器,它的数据将在一个卷中,无论你在你的docker run

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

总之,无论你在docker run做什么, VOLUME声明一个音量。 事实上,在Dockerfile docker run你不能撤消在Dockerfile做出的VOLUME声明。

问候

简而言之

Dockerfile中的VOLUME [PATH]指令相当于

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

详细的解释

容器文件系统由层组成,因此写入速度比纯文件系统要慢(由于固定的层数)。

在Docker中使用卷主要不是速度问题,而是从容器的生命周期中独立于数据持久性的问题。 从更快的磁盘装入卷将显着提高性能,但是对于VOLUME ,Docker的默认行为是在主机系统上创build一个命名卷,与容器的可写层相比,速度几乎没有提高。

-v参数对我来说是清楚的,它只是从主机向容器公开一个目录,反之亦然

虽然这是部分正确的,但也可以使用-v将命名卷挂载到您的Docker容器而不是目录。 这个小细节对于理解VOLUMEfunction很重要。 一个例子:

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

这里创build了一个名为my_volume的卷。 它的行为与“正常”挂载所期望的相同。 容器内的任何对[PATH]更改都将保留在本卷中。 不同的是,Dockerpipe理卷的位置,所以你不必担心(如果你感兴趣,这是/var/lib/docker/volumes/my_volume/_data )。 你为什么要这个? 你可以有一个testing数据库。 虽然您不需要直接访问这些文件,但您可能需要保存当前状态以将其挂载到其他数据库容器中。

VOLUME [PATH]指令基本上将上述指令保存到图像的元信息中。 所以每次你从这个镜像启动一个容器,Docker都知道你想在一个容器中保存[PATH]并且处理这个容器。