对我而言,Dockerfile中的VOLUME
并没有做任何事情,其中命令行上的-v
实际上使容器内的目录可用。
当我阅读VOLUME
的Docker手册时,我不清楚为什么我想在Dockerfile中编写它,而不仅仅是在命令行上?
答案 0 :(得分:7)
默认情况下,在Dockerfile中定义卷并不会将卷公开给主机。相反,它设置链接卷以允许其他容器链接到其他Docker容器中的卷。这通常用于数据容器"配置,其中您启动容器的唯一目的是持久化数据。这是一个简单的例子:
docker run -d --name docker_data docker/image1
docker run -d --volumes-from docker_data --name new_container docker/image2
注意--volumes-from
标志。
有关详细说明,请参阅http://container-solutions.com/understanding-volumes-docker/。
答案 1 :(得分:2)
除了已接受的答案外,使用卷的另一个考虑因素是性能。通常,Docker使用的分层文件系统(通常是AUFS或Devicemapper,取决于您正在使用的Linux发行版)并不是最快的,并且可能成为高吞吐量方案(例如,数据库或缓存目录)的瓶颈
另一方面,即使没有显式映射到主机目录,卷仍然是对主机文件系统的简单绑定挂载,在写入数据时允许更高的吞吐量。
为了进一步阅读,本主题有一个interesting paper by IBM,其中包含一些有关使用Docker卷(强调我的)对性能影响的有趣结论:
AUFS引入了显着的开销 因为I / O经历了几个层次,所以并不奇怪,[...]。 文件系统或磁盘密集型应用程序应绕过AUFS 通过使用卷。 [...] 虽然容器本身几乎没有开销, Docker并非没有性能问题。 Docker卷 比AUFS中存储的文件具有明显更好的性能。