当前位置: 首页 > 后端技术 > Java

Docker镜像优化:从1.16GB到22.4MB!你是怎么做到的??

时间:2023-04-01 21:23:29 Java

来源:http://blog.csdn.net/update7Docker简介Docker是一个供软件开发人员和系统管理员使用容器构建、运行和共享应用程序的平台。容器是在隔离环境中运行的进程,在使用docker镜像构建的自己的文件系统上运行。该映像包含运行应用程序所需的一切(编译代码、依赖项、库等)。图像是使用Dockerfile文件定义的。术语dockerization或containerization通常用于定义创建Docker容器的过程。容器之所以受欢迎,是因为它具有以下优势:灵活性:即使是最复杂的应用程序也可以容器化。轻量级:容器共享宿主机内核,效率远高于虚拟机。可移植性:可以在本地编译,随处运行。松耦合:容器是自封装的,一个容器的更换或升级不会打断其他容器。安全性:容器严格限制和隔离进程,无需用户进行任何配置。在这篇文章中,我将重点介绍如何优化Docker镜像以使其轻量级。优化过程让我们从构建React应用程序并将其容器化的示例开始。运行npx命令并创建Dockerfile后,我们得到如图1所示的文件结构。npxcreate-react-appapp--templatetypescript如果我们构建一个基本的Dockerfile(如下所示),我们最终会得到一个1.16GB的图像:FROMnode:10WORKDIR/appCOPYapp/appRUNnpminstall-gwebserver.localRUNnpminstall&&npmrunbuildEXPOSE3000CMDwebserver.local-d./build优化第一步:使用轻量级基础镜像在DockerHub(公共Docker仓库)中,有一些镜像可供下载,每个镜像都有不同的特点和尺寸。通常,与基于其他Linux发行版(例如Ubuntu)的映像相比,基于Alpine或BusyBox的映像非常小。这是因为Alpine镜像和其他类似的镜像经过优化,只包含最少的必要包。在下图中,您可以看到Ubuntu、Alpine、Node和基于Alpine的Node映像之间的大小比较。通过修改Dockerfile并使用Alpine作为基础镜像,我们最终的镜像大小为330MB:FROMnode:10-alpineWORKDIR/appCOPYapp/appRUNnpminstall-gwebserver.localRUNnpminstall&&npmrunbuildEXPOSE3000CMDwebserver.local-d./build第二步优化:多阶段构建通过多阶段构建,我们可以在Dockerfile中使用多个基础镜像,将编译后的产品、配置文件等从一个阶段复制到另一个阶段,这样我们就可以丢弃不同的需要的东西。这样的话,我们部署一个React应用需要的是编译好的代码,不需要源文件,不需要node_modules目录和package.json文件等。修改Dockerfile为如下图像大小为91.5MB。请记住,第一阶段(第1-4行)的图像不会自动删除,Docker将其保存在缓存中,如果我们在另一个构建图像过程中执行相同的阶段,我们可以使图像构建更快。所以你必须手动删除第一个阶段的图像。从节点:10-alpineASbuildWORKDIR/appCOPYapp/appRUNnpminstall&&npmrunbuildFROMnode:10-alpineWORKDIR/appRUNnpminstall-gwebserver.localCOPY--from=build/app/build./buildEXPOSE3000CMDwebserver.local-d./build现在我们有一个包含两个阶段的Dockerfile:在第一阶段我们编译项目,在第二阶段我们在Web服务器上部署应用程序。然而,Node容器并不是服务网页(HTML、CSS和JavaScript文件、图像等)的最佳选择,最好的选择是使用Nginx或Apache之类的服务。在这个例子中,我将使用Nginx。另外,Nginx系列面试题和答案都整理好了。微信搜索Java技术栈,后台发:面试,可以在线阅读。通过将Dockerfile修改为以下内容,我们的图像最终大小为22.4MB,如果我们运行容器,我们可以看到网页可以正常运行(图7)。FROM节点:10-alpineASbuildWORKDIR/appCOPYapp/appRUNnpminstall&&npmrunbuildFROMnginx:stable-alpineCOPY--from=build/app/build/usr/share/nginx/htmlEXPOSE80CMD["nginx","-g","daemonoff;"]近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别再满脑子if/else了,试试策略模式,真香!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!