Windows 上的 docker 卷(仅在 docker 容器内部)的读/写性能更好还是主机操作系统上安装/共享的卷更好?

use*_*324 7 windows performance mount volumes docker

我读到,在 Windows 上安装共享卷时,性能会受到重大影响。与仅说 docker 卷内的 postgres DB(不与主机操作系统共享)或从平面文件读取/写入的速率相比如何?

有没有人找到这方面的具体数字?我认为,如果仅针对磁盘 IO 性能,即使是 4 倍的减速对于我的用例来说也是可以接受的...我的印象是,在 Windows 上安装 + 共享卷明显较慢...所以我想知道是否放弃此共享组件帮助将事情改善到可以接受的范围内。

另外,如果我将 Postgres 保留在裸机上,我的所有 docker 应用程序仍然可以这样访问 Postgres 吗?(这可能是我想象的首选 - 我已经看到了裸机读/写速度提高 4 倍的报告) - 但我仍然需要知道......因为我的应用程序也处理大量的平面文件的复制/读取/移动。 ..所以需要知道什么是最适合的。

例如,如果共享卷与仅将其保留在容器上相比确实很糟糕,那么我可以选择通过网络推送文件以避免需要共享安装卷作为瓶颈......

感谢您的任何见解

Dav*_*aze 7

您只需为绑定安装的主机目录支付此性能成本。命名 Docker 卷或 Docker 容器文件系统会快得多。标准 Docker Hub 数据库映像配置为始终使用卷进行存储,因此在这种情况下您应该使用命名卷。

docker volume create pgdata
docker run -v pgdata:/var/lib/postgresql/data -p 5432:5432 postgres:12
Run Code Online (Sandbox Code Playgroud)

您还可以直接在主机上运行 PostgreSQL。在使用 Docker Desktop 应用程序的系统上,您可以通过特殊主机名访问它host.docker.internal在从 Docker 容器内部,如何连接到机器的本地主机?中详细讨论了这一点。。

如果您正在使用 Docker Desktop 应用程序,并且您将卷用于:

  • 不透明的数据库存储,如 PostgreSQL 数据:使用命名卷;它会更快,并且即使您确实在主机上有数据,您也无法直接访问数据
  • 注入单独的配置文件:使用绑定挂载;这些通常只在启动时读取一次,因此不会有太大的性能成本
  • 导出日志文件:使用绑定挂载;如果有足够的日志 I/O 导致性能问题,您可能正在积极调试
  • 您的应用程序源代码:根本不使用卷,运行映像中的代码,或使用本机主机开发环境