在内存中运行Docker?

在内存中运行Docker?,docker,Docker,据我所知,Docker使用内存映射文件从图像开始。因为我可以一遍又一遍地这样做,而且就我记忆所及,我可以并行地启动同一个映像的不同实例,所以我猜docker会抽象文件系统并将更改存储到其他地方 我想知道docker是否可以配置(或者默认情况下是否可以)在没有某种临时文件的情况下以仅内存模式运行?docker使用联合文件系统,允许它在“层”(devicemapper、BTRFS等)中工作。它执行写时复制,这样启动新容器的成本很低,当它执行第一次写入时,它实际上创建了一个新层 从映像启动容器时,不会

据我所知,Docker使用内存映射文件从图像开始。因为我可以一遍又一遍地这样做,而且就我记忆所及,我可以并行地启动同一个映像的不同实例,所以我猜docker会抽象文件系统并将更改存储到其他地方


我想知道docker是否可以配置(或者默认情况下是否可以)在没有某种临时文件的情况下以仅内存模式运行?

docker使用联合文件系统,允许它在“层”(devicemapper、BTRFS等)中工作。它执行写时复制,这样启动新容器的成本很低,当它执行第一次写入时,它实际上创建了一个新层

从映像启动容器时,不会使用内存映射文件来恢复冻结的进程(除非您自己将所有这些都构建到映像中…)。相反,您正在启动一个普通的Unix进程,但在一个沙箱中,它只能看到自己的unionfs文件系统

在没有拷贝写入磁盘的情况下启动映像的多个拷贝通常既便宜又快速。但是,如果您有一个启动时间较长的流程,您仍然需要为每个实例支付该成本

至于完全在内存中运行Docker容器,您可以创建一个RAM磁盘,并将其指定为Docker的存储卷(可配置,但通常位于
/var/lib/Docker
下)


在典型的用例中,我不希望这是一个有用的性能调整。首先,您将花费大量内存来保存无法访问的文件。映像的基本层包含大多数Linux系统文件。如果您从Docker Hub获取10个包,您可能会轻松获得价值20克的图像(此后存储成本趋于平稳)。其次,系统已经很好地管理了内存和交换(这就是为什么RAM磁盘是一种性能调整),并且您可以将所有这些应用到容器中运行的进程中。第三,对于RAM磁盘可能有帮助的大多数情况,您可以使用
-v
标志将磁盘作为卷装载到容器上,而无需将整个unionfs存储在容器中。

不确定这是您想要的,但docker 1.5提供了只读容器,请看这篇博文听起来非常合理。我希望它更像一个模拟器,您可以复制进程的状态并将其写入文件。唯一合理的调整是将docker用于修改文件信息的临时目录放入ram中。但是正如你所说的,性能提升是非常有限的。我曾希望避免初始化数据库,避免为了还原测试场景而还原表。它(Postgres)出现得非常快(这很好,但我正在寻找加载数据库场景的可能性,比如说每秒加载1000次:-)。例如,我们在docker中使用mysql,需要3秒。那么,我认为即使是RAM磁盘上的一个DB对您来说也太慢了。听起来您希望在单个数据库上使用(并回滚)事务。回滚事务是一个想法,但它不能确保事务实际执行它所执行的操作(在某些罕见的边缘情况下),但我需要多事务支持。我们现在使用自己的存储引擎实现进行测试(只是一个带有合并表的内存存储,它被擦除而不是应用)。