paint-brush
如何减轻 Docker 镜像的重量?经过@infinity
2,203 讀數
2,203 讀數

如何减轻 Docker 镜像的重量?

经过 Rishabh Agarwal4m2024/01/19
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

容器化是一种软件部署过程,它将应用程序的代码与其在任何基础设施上运行所需的所有文件和库捆绑在一起。通过优化 Docker 镜像,您可以加快整个开发周期,同时还可以加强现有的安全措施,确保更强大、更高效的软件环境。
featured image - 如何减轻 Docker 镜像的重量?
Rishabh Agarwal HackerNoon profile picture

当我问我的经理关于彻底改变软件开发行业的最重要的事情时,他明确地说:“容器化”。他认为,如果没有容器化,当今软件的快速扩展和全球部署将是一个更加艰巨的挑战。值得注意的是,当今使用的几乎所有软件都以各种功能利用容器化,这突显了其在推动现代软件生态系统中不可或缺的作用!


不知道的朋友可以看一下AWS官网的定义~

 *“Containerisation is a software deployment process that bundles an application's code with all the files and libraries it needs to run on any infrastructure. Traditionally, to run any application on your computer, you had to install the version that matched your machine's operating system.”*


图像作为容器的构建块,类似于指导其创建的蓝图。因此,维护轻量且精简的容器镜像可以加速部署过程并促进这些镜像的分发。通过优化 Docker 镜像,您不仅可以加快整个开发周期,还可以加强现有的安全措施,确保更强大、更高效的软件环境。


在本文中,我们将探索创建高效 Docker 映像的各种方法,最终提高应用程序的效率。

每个容器打包单个应用程序

将容器视为虚拟机 (VM) 并将多个应用程序打包在一个容器内是一种常见的错误。虽然增加了容器的大小,但这种做法也有其他缺点。


容器的生命周期预计与其运行的应用程序密切相关。容器应在应用程序启动时启动,并在应用程序完成时停止。 Docker、Kubernetes 等容器编排解决方案很大程度上依赖于容器的这一属性。如果容器运行许多应用程序,编排工具将无法识别并重新启动您的应用程序!

巧妙利用缓存

镜像由层组成,Dockerfile 中的每条指令都会添加一个新层。容器化技术(例如 Docker)将在可行的情况下尝试重用先前构建的层,以缩短构建时间。仅当自先前构建以来底层层均未发生更改时,才可以使用层的缓存。


为了提高镜像构建的速度,将可能经常更改的指令放在 Dockerfile 的下方是有好处的。这种方法使 Docker 能够更有效地利用其缓存系统。例如,由于源代码经常发生频繁的更改,因此建议在过程结束时将其复制到图像中。


图像缓存 ~ https://cloud.google.com/architecture/best-practices-for-building-containers


虽然它不会使您的图像变得更轻,但它使构建过程运行得更快!

删除不必要的工具

通常,容器镜像包含不必要的工具,导致镜像膨胀和潜在的安全漏洞。例如,如果netcat等工具获得未经授权的访问,黑客可能会利用 netcat 等工具在容器内执行恶意活动。


严格维护容器映像附带的工具和库集可以显着帮助减少安全威胁,并且还可以使映像更精简。较小的图像下载速度更快,这意味着容器启动速度更快。

使用最小的基础镜像

我们在 FROM 指令中引用的镜像称为基础镜像。基础图像很大程度上决定了创建的最终图像的大小。我们应该尝试使用尽可能小的基础图像来减小图像的最终尺寸。


尽可能尝试使用高山图像,因为它们尺寸较小,并且通常包含足够的工具来支持开发活动。


即使小图像不包含您需要的所有工具,使用它可能仍然是更好的选择。在较轻的基础映像之上安装所需的软件包仍可能比使用较重的映像更节省成本。

只复制必要的内容!

复制源代码时,许多不需要的文件和文件夹也可能被复制。这会增加图像的大小并最终导致膨胀。尽量减少复制的文件数量,并尽量将其保持在最低限度。


在我们的行业中,优化容器镜像和建立最佳实践的重要性经常被忽视。然而,坚持这些做法所带来的实质性好处怎么强调也不为过。作为开发人员,必须始终优先考虑创建精简且快速的容器映像。


至此,我们就到了本文的结尾。希望您喜欢阅读它!