如何存储Docker容器的非卷数据?

我了解Docker卷以及它们引用主机上目录的方式。 那么容器内的其他文件系统呢?

想想一个不同的方式:假设你有一个服务器与远程驱动器上的大部分存储,这意味着读取和写入比平时更长。 如果你不装载任何卷,它会保留RAM中的任何/一些/大部分/所有的容器文件系统? 还是写了一些数据到磁盘,这意味着在这种情况下它会和卷一样慢?

非卷数据存储在分层覆盖文件系统中(在大多数分发中,这将是AUFS或DeviceMapper文件系统)。 两种情况下的原理是一样的( 图像源 ):

在这里输入图像说明

正如评论中已经提到的,我可以推荐阅读官方文档中的“理解图像,容器和存储驱动程序”部分 。 这个答案只是一个简短的总结。

每个Docker映像由多个文件系统映像层组成。 例如,Apache + PHP映像可能包含(1)通用的Ubuntu基础层,(2)安装了Apache HTTP服务器的附加层,以及(3)PHP-FPM和configuration文件(仅仅是例)。

当您从图像中启动新的容器时,会将新的每个容器图层添加到现有的图像图层中。 此图层将包含容器本身内(写入非卷目录)的所有更改。

关于你的具体问题:

如果你不装载任何卷,它会保留RAM中的任何/一些/大部分/所有的容器文件系统?

不,没有什么内存(除了通常的文件系统caching)。 这些都在覆盖文件系统中,使用AUFS,DeviceMapper或其他存储驱动程序进行挂载。

还是写了一些数据到磁盘,这意味着在这种情况下它会和卷一样慢?

通常,卷中的文件系统访问比覆盖文件系统中的性能更高。 毕竟,一个卷(至less是一个常规的基于主机的卷,让旁边添加networking存储卷的卷驱动器)仅仅是绑定到主机文件系统中的常规目录,完全绕过了图层文件系统。 卷与层文件系统相比的性能(在其他主题中)是在本文中研究的 :

AUFS引入了大量的开销 ,这并不奇怪,因为I / O正在经历几个层次,[…]。 文件系统或磁盘密集型应用程序应使用卷绕过AUFS。 虽然容器本身几乎没有开销,但Docker并非没有性能问题。 Docker卷的性能明显优于 AUFS中存储的文件。