Dockerfile中的VOLUME声明与-v作为docker运行参数的区别
有人能帮我理解两者之间的区别吗?
Dockerfile
VOLUME
命令(图像构build层)
和
-v
参数发出docker run
-v /xyz/bla
命令(容器构build层)。
-v
参数对我来说是清楚的,它只是从主机向容器公开一个目录,反之亦然,但是Dockerfile
中的VOLUME
行为有什么不同呢?
-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,
所以问题是: Dockerfile
中VOLUME
的Dockerfile
什么?
容器文件系统是由写在那里的图层组成的,比普通的文件系统更慢和受限(因为固定的图层数量)。
您在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容器而不是目录。 这个小细节对于理解VOLUME
function很重要。 一个例子:
$ 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]
并且处理这个容器。