当前位置:湖南科技在线 >> 科技 >> 文章正文

Docker映像优化:从1.16GB到22.4MB

发布于:2021-01-08 被浏览:3333次

作者|敏捷工匠

规划|田

Docker是软件开发人员和系统管理员使用容器构建、运行和共享应用程序的平台。容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统是使用docker映像构建的。该映像包含运行应用程序所需的一切(编译代码、依赖项、库等)。).镜像是使用Dockerfile文件定义的。

术语码头化或集装箱化通常用于定义创建码头集装箱的过程。

容器很受欢迎,因为它们具有以下优点:

灵活性:即使是最复杂的应用程序也可以被集装箱化。

轻量级:容器共享主机核心,使它们比虚拟机更高效。

可移植性:可以本地编译,随处运行。

松散耦合:容器是自封装的,在不中断其他容器的情况下,替换或升级一个容器。

安全性:容器严格限制和隔离进程,无需用户进行任何配置。

在本文中,我将重点介绍如何优化Docker映像,使其轻量级。

让我们从一个例子开始,在这个例子中,我们构建了一个React应用程序并将其容器化。在运行npx命令并创建Dockerfile之后,我们得到如图1所示的文件结构。

图1:文件结构

如果我们构建一个基本的Dockerfile(如下所示),我们最终将得到一个1.16 GB的映像:

图2:镜像的初始大小为1.16GB

第一步优化:使用轻量化基础镜像

在Docker Hub中,有一些图像可供下载,每个图像都有不同的特征和大小。

一般来说,基于Alpine或BusyBox的映像与基于其他Linux发行版(比如Ubuntu)的映像相比是非常小的。这是因为Alpine image和其他类似的图像已经过优化,其中只包含了最少的必要软件包。下图,可以看到基于Alpine的Ubuntu、Alpine、Node、Node图像的大小对比。

图3:不同尺寸的基础图像

通过修改Dockerfile并使用Alpine作为基本图像,我们图像的最终大小为330MB:

图4:第一步优化后,图像大小为330MB

第二步优化:多阶段构建

通过多阶段构建,我们可以在 Dockerfile 中使用多个基础镜像,并将编译成品、配置文件等从一个阶段复制到另一个阶段,这样我们就可以丢弃不需要的东西。

在本例中,我们部署 React 应用程序需要的是编译后的代码,我们不需要源文件,也不需要 node_modules 目录和 package.json 文件等。

通过将 Dockerfile 修改为如下内容,我们最终得到的镜像大小为 91.5MB。请记住,来自第一阶段(第 1-4 行)的镜像不会被自动删除,Docker 将它保存在 cache 中,如果我们在另一个构建镜像过程中执行了相同的阶段,就可以使镜像构建更快。所以你必须手动删除第一阶段镜像。

图 5:第二步优化后的镜像大小为 91.5MB

现在我们有了一个 Dockerfile,它有两个阶段:在第一个阶段中,我们编译项目,在第二个阶段中,我们在 web 服务器上部署应用程序。然而,Node 容器并不是提供网页(HTML、CSS 和 JavaScript 文件、图片等)服务的最佳选择,最好的选择是使用像 Nginx 或 Apache 这样的服务。在本例中,我将使用 Nginx。

通过将 Dockerfile 修改为如下内容,我们的镜像最终大小是 22.4MB,如果我们运行这个容器,我们可以看到网页可以正常工作,没有任何问题(图 7)。

图 6:第三步优化后的镜像大小为 22.4MB

图 7:最终容器的运行结果

参考链接:

https://docs.docker.com/get-started/

https://docs.docker.com/develop/develop-images/multistage-build/

https://medium.com/the-agile-crafter/docker-image-optimization-from-1-16gb-to-22-4mb-53fdb4c53311

点个在看少个 bug

标签: 镜像 容器 大小