windows - 使用 Windows 上的 docker 卷(仅在 docker 容器内)或使用主机操作系统安装/共享卷的读/写性能更好?

标签 windows performance docker mount volumes

我已经读到在 Windows 上安装共享卷时性能会受到重大影响。这与仅说 docker 卷内的 postgres DB(不与主机操作系统共享)或从/向平面文件读取/写入的速率相比如何?
有没有人找到任何具体的数字?我认为如果只是为了磁盘 IO 性能,我的用例甚至可以接受 4 倍的减速...我的印象是挂载 + 共享卷是 明显变慢在windows上...所以我想知道是否在前面分享 组件有助于将问题改善到可接受的范围内。
此外,如果我将 Postgres 留在裸机上,我的所有 docker 应用程序还能以这种方式访问​​ Postgres 吗? (这可能是我想像的首选——我已经看到关于保持裸机的读/写速度提高 4 倍的报告)——但我仍然需要知道......因为我的应用程序也处理大量平面文件的复制/读取/移动。 ..所以需要知道什么是最好的。
例如,如果共享卷真的很糟糕,而不是只保留在容器上,那么我可以选择通过网络推送文件以避免需要共享安装卷作为瓶颈......
感谢您的任何见解

最佳答案

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

docker volume create pgdata
docker run -v pgdata:/var/lib/postgresql/data -p 5432:5432 postgres:12
您也可以直接在主机上运行 PostgreSQL。在使用 Docker 桌面应用程序的系统上,您可以通过特殊主机名 host.docker.internal 访问它。 .这在 From inside of a Docker container, how do I connect to the localhost of the machine? 中有详细讨论。 .
如果您使用的是 Docker 桌面应用程序,并且您将卷用于:
  • 不透明的数据库存储,如 PostgreSQL 数据:使用命名卷;它会更快,即使您在主机上确实有数据,您也无法直接访问这些数据
  • 注入(inject)单个配置文件:使用绑定(bind)挂载;这些通常只在启动时读取一次,因此没有太多性能成本
  • 导出日志文件:使用绑定(bind)挂载;如果有足够的日志 I/O 成为性能问题,您可能正在积极调试
  • 您的应用程序源代码:根本不使用卷,运行镜像中的代码,或使用 native 主机开发环境
  • 关于windows - 使用 Windows 上的 docker 卷(仅在 docker 容器内)或使用主机操作系统安装/共享卷的读/写性能更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62493402/

    相关文章:

    c++ - 从 Microsoft Visual Studio 10 的代码库中删除 rct1 宏

    python - 为什么 DataFrame 的连接会呈指数级变慢?

    docker - Com.github.dockerjava.api.exception.DockerClientException:证书路径(DOCKER_CERT_PATH) ‘/root/.docker/certs’不存在一般讨论

    apache - 为什么我收到错误 "You don' t have permission to access/on this server."?

    c++ - 如何通过 Windows API 获取文件夹大小

    windows - 如何让 AWS 命令​​行界面在 cygwin 中工作

    c# - 在 C# 中将金额转换为卢比和 paise 中的单词格式

    mysql - mysql 查询突然激增后 https 请求变慢

    iphone - glClearColor() 将 iPhone 的渲染利用率推至 27%

    docker - kibana opendistro 无法连接到 Docker 上的 ElasticSearch open distro 容器