背景

Docker 是一个非常棒的工具,能够让我们的开发工作更简单、更快、更高效。它的优点就不多说了,但是凡事都有两面性,对于 macOS 和 Windows 系统的用户来说,Docker 还是有一些问题的。最大的问题还是它在这两大操作系统上的网络和 I/O 性能瓶颈。这里我们就讲讲数据卷缓存方法,它们可以加速我们的 Docker 运行速度。

在使用 Docker 时,我们经常会用到数据卷,如共享代码、链接资源、提供备份等。数据卷有很多使用场景,它的 I/O 操作有时很轻,有时很重很密集。在 Linux 系统上,因为可以使用原生内核和系统资源,运行情况比在 macOS 和 Windows 下好很多。在默认配置中,数据卷始终确保主机和容器之间的数据一致性:如果您在主机或容器上保存一些内容,更改会立即反映在另一端,这样可以防止数据丢失。

Docker 提供了两种方法来缓存和加速数据卷,它们都牺牲了一些一致性,但是可以大幅提升运行速度。这两种方法就是:cached 和 delegated。下面是 Docker 官方文档介绍。

delegated

delegated 模式提供最弱保障。对于这类文件夹,容器对文件系统具有权威性。由容器执行的写操作可能不会立即反映在主机文件系统上。在一些场景下,如 NFS 异步模式,如果挂载了 delegated 模式数据卷的容器在运行中崩溃,写入的数据可能会丢失。

cached

cached 配置包含 delegated 配置的所有保障,并且还提供了容器写操作可见性的额外保障。因此,cached 模式通常可以提升频繁读操作场景时的性能,代价是在容器和主机之间牺牲一些临时的不一致性。

它们使用起来非常简单:

  • delegated-volume:/var/volume1:delegated
  • cached-volume:/var/volume2:cached

区别和选择

这两种模式的 I/O 操作都会比默认模式快很多,并且不会影响容器和主机之间的性能。问题是我们该使用哪一种?那当然要看场景了。文档虽然介绍的很清楚,但是没有提供任何实际应用案例。那我们就举例子说明一下。

案例一

我们有一个数据库容器(MySQL、Mongo 或者 PostgreSQL),我们把数据存储在数据卷上,这样容器重启的时候数据不会丢失,同时我们可以备份数据,这些主机操作都是只读的,因为我们不会在主机环境下去改变数据,所以我们不需要把主机的写操作同步到容器中。那么最好的选择就是 delegated 模式。容器能够写操作并且立刻看到结果,而主机方面就没那么重要了,因为它不会进行写操作,忽略它就好了。

案例二

当我们频繁的在主机上的修改代码,然后在容器里读取这些更改。在这个场景下,最好的选择是 cached。为什么?因为在容器方面大部分都是只读操作,而我们在主机上进行写操作。

总结

delegated 和 cached 的区别其实不是特别大,但是也需要注意。他们的性能都比 default 模式要好,但是 default 模式却是最安全的。鱼与熊掌不可兼得,就看怎么取舍了。如果你有什么更好的建议,可以在评论区留言。

PS:在 PHP 开发时,xdebug 也会影响性能,如果你觉得 Docker 很慢,不妨试试关闭 xdebug。

标签: Docker, 容器

添加新评论