在 Mac 上即时提升 Docker 性能
macOS 适合运行 Docker 吗? Mac 是优秀的开发平台。它们支持 Java、Python、Ruby 和许多其他常用的开发语言。它们让开发人员打开一个 shell 并找到一个看起来很像 Linux 的环境。许多开发者都欣赏 Mac 和 Apple 以出名的用户体验。更重要的是,Mac 支持最流行的开发工具,如 VS Code、JetBrains 工具箱和......Docker——这是测
macOS 适合运行 Docker 吗?
Mac 是优秀的开发平台。它们支持 Java、Python、Ruby 和许多其他常用的开发语言。它们让开发人员打开一个 shell 并找到一个看起来很像 Linux 的环境。许多开发者都欣赏 Mac 和 Apple 以出名的用户体验。更重要的是,Mac 支持最流行的开发工具,如 VS Code、JetBrains 工具箱和......Docker——这是测试和生产环境的重要工具。
但 Docker 在 Mac 上的表现却名声不佳。让我们谈谈为什么会这样以及您可以做些什么来改进它。
Docker 在 macOS 上的运行方式与在 Linux 上的运行方式不同。 Docker 使用 Linux 内核来管理容器之间的资源,因此您的 Docker 应用程序可以在 Linux 操作系统上运行。但是 macOS 没有 Linux 内核,所以 Docker 必须在 Linux 虚拟机中运行。这会影响性能——某些工具或语言(如 I/O 消耗量大的 PHP 项目)会加剧这种情况。
这会让 macOS 成为运行 Docker 的糟糕选择吗?不。
MacOS 仍然是开发的不错选择,您可以在 Mac 上运行容器完成很多工作。这不是性能测试的正确选择,并且您将根据 CPU 和内存在可以运行的容器的大小和数量上遇到真正的限制——就像在任何本地开发机器上一样。
但是,在 macOS 计算机上运行容器而不是原生应用程序通常比使用原生安装程序甚至 Homebrew 更好。您可以使用 Docker 在几秒钟内启动 MySQL 数据库、Nginx Web 服务器或 InfluxDB — 就像在 Linux 开发系统上一样容易。也就是说,在许多情况下,您可能需要比预期或在 Linux 机器上更多的 CPU 和内存。
Mac上的Docker慢吗?
因为 Docker 在 macOS 上的虚拟机中运行,所以容器操作比在 Linux 上要慢。最明显的区别之一是共享文件系统。在 macOS 中通过虚拟机访问大文件或大量文件的性能总是比本地访问差。
这并不意味着 macOS 上的 Docker 总是比 Linux 上的慢。对于许多计算和网络操作,macOS 和 Linux 之间的性能仍然相当,而 Apple Silicon 提供的性能提升可能有助于随着时间的推移弥合性能差距。
这些性能问题是 Docker 非常清楚的。最新版本的 Docker Desktop 证明了这一点,这些版本具有尝试解决 macOS 性能问题的实验性功能。我们将在下面讨论它们,因为我们介绍了提高 Docker 性能的一般方法。
如何在我的 Mac 上加速 Docker?
有几种方法可以让 Docker 在你的 Mac 上运行得更好,其中大部分是通过简单地更改一些设置。
-
如何摆脱困境(重置使性能变差的更改)
-
测量和调整系统资源
-
实验特性(新的虚拟化框架和VirtioFS)
-
切换到Minikube(而不是单节点Kubernetes集群)
-
远程开发(在远程机器上运行环境)
如何摆脱困境
在我们开始之前,让我们讨论一下如果您更改设置并且事情变得糟糕,您可以做些什么。虽然不太可能,但您可能会调整内存或 CPU 设置,而您的容器将无法启动。幸运的是,Docker 的开发人员预见到了这一点,并为您提供了轻松重置设置的方法。
启动 Docker Desktop 并选择右上角的错误图标。
这将打开故障排除面板。
让我们从上到下浏览这些控件:
-
第一个是在 Mac 上重启 Docker 的快捷方式。
-
第二个将您带到带有一些诊断的支持页面。
-
第三个是重启Kubernetes的快捷方式。我们将在下面讨论在 Mac 上运行 Kubernetes。
-
第四个,正如它所说,将删除缓存的数据,并可能修复 Docker 无法启动的问题。
-
第五个按钮将重置您的设置。这是应该解决您通过更改设置引起的问题的控件。
-
最后,您可以从此面板卸载 Docker。因此,如果您更改设置并且 Docker 停止工作,请尝试重置为出厂默认设置按钮。
让我们看一些有助于提高 Docker 性能的系统设置。
测量和调整系统资源
现在,单击设置齿轮。
然后,单击左侧菜单中的资源。
您可以在此处配置分配给 Docker 的资源。
默认值为:
-
一半可用 CPU
-
2GB内存
-
1GB 交换磁盘映像大小和位置将根据您的系统而有所不同。更改它们对性能没有帮助。
根据您运行的容器,2GB 内存可能不够。但在更改设置之前,您可以使用 Docker 命令行查看容器使用了多少内存。 (请注意,我的系统设置为 7.90GB,因为我使用它来运行一个非常大的容器。)
docker stats 命令为您提供容器列表和它们正在使用的资源。第四列告诉您容器正在使用多少内存。
这是运行三个容器的 Docker 统计信息的输出:
在运行 Ubuntu、Nginx 和 MariaDB 的容器时,我的系统为容器使用的内存不到 100MB。
如果您的系统承受更大的压力并且使用的内存量接近 Docker 桌面资源中分配的内存量,它可能会开始交换并且性能会受到影响。添加更多内存可能有助于它更好地运行。
调整实验功能
有时增加内存是不够的。 Docker 添加了一对实验性功能,有望在未来的某个时候将其投入生产。它们都直接处理 Docker 如何在 macOS 上的虚拟机中运行。
衡量这些功能是否以及如何帮助提高性能取决于您使用 Docker 的方式。你可以:
-
容器启动所需的时间。
-
测量文件系统访问操作,例如数据库备份、写入大文件或从 Web 服务器共享它们。您可以在设置面板下的菜单中找到这些功能。
新的虚拟化框架
第一个处理 Docker 使用的虚拟机。 Apple 使用 Big Sur 引入了一个新的虚拟化框架,但 Docker 默认使用 hypervisor.framework。新框架可能性能更好,但 Docker 还没有提供官方支持。要启用新框架,请选中它旁边的框,然后单击按钮重新启动 Docker。您还需要重新启动所有容器。
VirtioFS 目录共享
VirtioFS 的性能比默认的文件共享机制要好得多,启用它可能会帮助您解决 Docker 在 macOS 上的最大性能问题。您需要启用新的虚拟化框架才能使用它。像虚拟化一样,选中该框并单击按钮以重新启动 Docker 以使用它。
丑
如果您在 Mac 上运行单节点 Kubernetes 集群,您有两种选择:Docker 包含在 Desktop 中的 Kubernetes 实现,或 minikube。
Minikube 不适合生产环境,与“完整”的 Kubernetes 集群相比,它缺乏许多功能。但它使用的系统资源要少得多。
以下是启动 minikube 集群的 Docker stats 的输出:
这是 Kubernetes:
如果您正在为 Kubernetes 系统开发容器或为 Argo Workflow 或 Apache Airflow 等系统测试作业,minikube 将在使用更少内存和运行更少容器的同时完成这项工作。
远程开发
最后,您始终能够将开发环境转移到云或远程机器上。这是一种多年来越来越受欢迎的工作方式,并已成为 Meta/Facebook、Shopify、Slack、LinkedIn、Palantir 等公司的主要开发方式。全面披露 - 这是 Nimbus 从事的业务,所以如果您对此感兴趣,请查看我们。
远程开发允许开发人员使用虚拟机或容器来托管他们的开发环境并编写/运行他们的代码。 Docker(和其他工具)都在这个远程环境中运行——从而减少了本地开发资源,有利于改善本地计算体验。
设置您自己的远程开发服务器以供个人使用非常容易,并且有在线教程向您展示如何操作。如果您正在为一个团队构建这个 - 这将变得越来越复杂,但我们希望在不久的将来发布一篇文章并提供相关指导。
在 Mac 上运行 Docker 我们已经研究了一些可以在 macOS 上提高 Docker 性能的方法。 Docker Desktop 有几个内置设置,您可以调整这些设置以帮助您的系统更好地运行。我们查看了它们是什么,并讨论了测试是否有帮助的选项。我们还讨论了运行像 minikube(而不是 Kubernetes)这样的轻量级工具也可以提供帮助。最后,我们讨论了如何将资源消耗卸载到云端是一个简单的解决方案。
这就是说,虽然 Docker 必须在 Mac 上运行额外的抽象层,但它仍然可以完美地用于开发。如果您仍然遇到无法解决的问题,请与我们联系,我们将看看我们是否可以提供更多指导并帮助您快速构建和破解。
u200d作者是黄流沙。 _u200d流沙是Nimbus的CEO。他是一名工程师,曾在两家已经退出的高速增长初创公司工作,然后在 Facebook/Meta 工作。他发现 FAANG 的云开发基础设施提供了令人难以置信的开发人员体验,但即使是最成功的初创公司也很难做到正确。他创办 Nimbus 是为了将这种工作方式带给其他人。_u200d
最初发表于usenimbus.com
更多推荐
所有评论(0)