小知识:Docker 镜像优化(从1.16GB到22.4MB)

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

术语 dockerization 或 containerization 通常用于定义创建 docker 容器的过程。

因为容器具备如下优点,所以很受欢迎:

灵活性:即使是最复杂的应用程序也可以容器化。 轻量化:容器共享主机内核,使得它们远比虚拟机高效。 便携性:可以做到本地编译,到处运行。 松耦合:容器自我封装,一个容器被替换或升级不会打断别的容器。 安全性:容器对进程进行了严格的限制和隔离,而无需用户进行任何配置。

在这篇文章中,我将重点讨论如何优化 docker 镜像以使其轻量化。

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

?
1
npx create-react-app app –template typescript

%小知识:Docker 镜像优化(从1.16GB到22.4MB)-猿站网-插图

图 1:文件结构

如果我们构建一个基础的 dockerfile(如下所示),我们最终会得到一个 1.16 gb 的镜像:

?
1
2
3
from node:10
workdir /appcopy app /apprun npm install -g webserver.localrun npm install && npm run build
expose 3000cmd webserver.local -d ./build

%小知识:Docker 镜像优化(从1.16GB到22.4MB)-1猿站网-插图

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

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

在 docker hub(公共 docker 仓库)中,有一些镜像可供下载,每个镜像都有不同的特征和大小。

通常,相较于基于其他 linux 发行版(例如 ubuntu)的镜像,基于 alpine 或 busybox 的镜像非常小。这是因为 alpine 镜像和类似的其他镜像都经过了优化,其中仅包含最少的必须的软件包。在下面的图片中,你可以看到 ubuntu、alpine、node 和基于 alpine 的 node 镜像之间的大小比较。

%小知识:Docker 镜像优化(从1.16GB到22.4MB)-2猿站网-插图

图 3:基础镜像的不同大小

通过修改 dockerfile 并使用 alpine 作为基础镜像,我们的镜像最终大小为 330mb:​​​​​​​

?
1
2
3
from node:10-alpine
workdir /appcopy app /apprun npm install -g webserver.localrun npm install && npm run build
expose 3000cmd webserver.local -d ./build

%小知识:Docker 镜像优化(从1.16GB到22.4MB)-3猿站网-插图

图 4:经过第一步优化后镜像大小为 330mb

第二步优化:多阶段构建

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

在本例中,我们部署 react 应用程序需要的是编译后的代码,我们不需要源文件,也不需要 node_modules 目录和 package.json 文件等。关注公众号 逆锋起笔,回复 pdf,下载你需要的各种学习资料。

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

?
1
2
from node:10-alpine as buildworkdir /appcopy app /apprun npm install && npm run build
from node:10-alpineworkdir /apprun npm install -g webserver.localcopy –from=build /app/build ./buildexpose 3000cmd webserver.local -d ./build

%小知识:Docker 镜像优化(从1.16GB到22.4MB)-4猿站网-插图

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

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

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

?
1
2
3
from node:10-alpine as buildworkdir /appcopy app /apprun npm install && npm run build
from nginx:stable-alpinecopy –from=build /app/build /usr/share/nginx/htmlexpose 80cmd [“nginx”, “-g”, “daemon off;”]

%小知识:Docker 镜像优化(从1.16GB到22.4MB)-5猿站网-插图

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

%小知识:Docker 镜像优化(从1.16GB到22.4MB)-6猿站网-插图

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

到此这篇关于docker 镜像优化(从1.16gb到22.4mb)的文章就介绍到这了,更多相关docker 镜像优化 内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://update.blog.csdn.net/article/details/112816434

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:如何在centos的docker里安装jupyter并开放端口

2023-3-18 19:07:26

建站知识

小知识:Vmware部署Nginx+KeepAlived集群双主架构的问题及解决方法

2023-3-18 19:22:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索