据我所知,Docker使用内存映射文件从图像开始。因为我可以一遍又一遍地做到这一点,并且据我记得并行启动同一图像的不同实例,我想docker抽象文件系统并将更改存储在其他地方。
我想知道docker是否可以在没有某种临时文件的情况下在仅内存模式下运行(或者默认情况下是这样)吗?
答案 0 :(得分:11)
Docker使用一个联合文件系统,允许它在"层中工作。 (devicemapper,BTRFS等)。它正在进行写时复制,因此启动新容器很便宜,当它执行第一次写操作时,它实际上会创建一个新层。
当您从图像启动容器时,您 使用内存映射文件来恢复冻结过程(除非您自己将所有这些内容构建到映像中......)。相反,你正在开始一个普通的Unix进程,但是在沙盒中只能看到它自己的unionfs文件系统。
启动图像的许多副本,其中没有副本写入磁盘通常便宜且快速。但是,如果您的流程启动时间很长,那么您仍然会为每个实例支付这笔费用。
至于完全在内存中运行Docker容器,您可以创建一个RAM磁盘并将其指定为Docker的存储卷(可配置,但通常位于/var/lib/docker
下)。
在典型的用例中,我不希望这是一个有用的性能调整。首先,您将花费大量内存来保存您无法访问的文件。图像的基础层包含大多数Linux系统文件。如果您从Docker Hub获取10个软件包,您可能很容易就能获得价值20G的图像(之后存储成本趋于稳定)。其次,系统已经很好地管理内存和交换(这就是为什么RAM磁盘是一个性能调整),你可以将所有这些应用到容器内运行的进程。第三,对于RAM磁盘可能有帮助的大多数情况,您可以使用-v
标志将磁盘作为卷安装在容器上,而不是需要将整个unionfs存储在那里。