Dockerfile中的VOLUME声明与-v作为docker run参数之间的区别

Moh*_*din 34 docker dockerfile

有人可以帮我理解之间的区别:

VOLUME命令Dockerfile(图像构建层)

-v发出docker run-v/xyz/bla命令(容器构建层)时的参数.

-v参数对我来说很清楚,它只是将一个目录从主机暴露给容器,反之亦然,但是它VOLUMEDockerfile行为方式有何不同?

Car*_*rez 27

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

docker run -v /data
Run Code Online (Sandbox Code Playgroud)

与...一样

VOLUME /data
Run Code Online (Sandbox Code Playgroud)

但是-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,
Run Code Online (Sandbox Code Playgroud)

所以问题是:VOLUME在一个用途中有Dockerfile什么用?

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

VOLUME在声明中声明Dockerfile容器将写入应用程序数据的位置.例如,一个数据库容器,无论你放入什么内容,它的数据都会进入卷docker run.

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

VOLUME无论你做什么,总结都会声明一个卷docker run.事实上,docker run你无法撤消VOLUME所作的声明Dockerfile.

问候

  • 没有VOLUME路径参数是容器中的目录.例如/ data.Docker在主机中创建一个目录,用于将您在容器中写入的所有内容存储在/ data diretory中.检查docker检查带有卷的正在运行的容器. (3认同)
  • 嗯,不。如果您定义了一个没有卷的容器,并且您的应用程序在目录中写入了很多内容。此过程不仅比在任何容器外运行应用程序慢,而且容易出错。所以解决方案是将这个目录声明为一个卷,这样写入将直接在文件系统中,就像应用程序在容器外部运行一样 (2认同)
  • 是的,这是与 -v 的区别,您可以确定它将在命名卷中存储内容的目的地或状态。但是使用 VOLUME 您可以强制创建目录,无论用户如何使用 docker run (2认同)

ste*_*epf 12

简而言之

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

$ docker run -v $(docker volume create):[PATH] [IMAGE_NAME]
Run Code Online (Sandbox Code Playgroud)

详细解释

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

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

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

虽然这部分属实,-v但也可用于将命名卷装入Docker容器而不是目录.这个小细节很重要,以便了解VOLUME它的作用.一个例子:

$ docker volume create my_volume
$ docker run -v my_volume:[PATH] [IMAGE_NAME]
Run Code Online (Sandbox Code Playgroud)

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

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