docker镜像查看分层(Docker 镜像优化从1.16GB到22.4MB)
docker镜像查看分层
Docker 镜像优化从1.16GB到22.4MB目录
- 第一步优化:使用轻量化基础镜像
- 第二步优化:多阶段构建
Docker 是一个供软件开发人员和系统管理员使用容器构建、运行和与分享应用程序的平台。容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统是使用 docker 镜像构建的。镜像中包含运行应用程序所需的一切(编译后的代码、依赖项、库等等)。镜像使用 Dockerfile 文件定义。
术语 dockerization 或 containerization 通常用于定义创建 Docker 容器的过程。
因为容器具备如下优点,所以很受欢迎:
- 灵活性:即使是最复杂的应用程序也可以容器化。
- 轻量化:容器共享主机内核,使得它们远比虚拟机高效。
- 便携性:可以做到本地编译,到处运行。
- 松耦合:容器自我封装,一个容器被替换或升级不会打断别的容器。
- 安全性:容器对进程进行了严格的限制和隔离,而无需用户进行任何配置。
在这篇文章中,我将重点讨论如何优化 Docker 镜像以使其轻量化。
让我们从一个示例开始,在该示例中,我们构建了一个 React 应用程序并将其容器化。运行 npx 命令并创建 Dockerfile 之后,我们得到了如图 1 所示的文件结构。
npx create-react-app app --template typescript
图 1:文件结构
如果我们构建一个基础的 Dockerfile(如下所示),我们最终会得到一个 1.16 GB 的镜像:
FROM node:10 WORKDIR /appCOPY app /appRUN npm install -g webserver.localRUN npm install && npm run build EXPOSE 3000CMD webserver.local -d ./build
图 2:镜像的初始大小为 1.16GB
第一步优化:使用轻量化基础镜像
在 Docker Hub(公共 Docker 仓库)中,有一些镜像可供下载,每个镜像都有不同的特征和大小。
通常,相较于基于其他 Linux 发行版(例如 Ubuntu)的镜像,基于 Alpine 或 BusyBox 的镜像非常小。这是因为 Alpine 镜像和类似的其他镜像都经过了优化,其中仅包含最少的必须的软件包。在下面的图片中,你可以看到 Ubuntu、Alpine、Node 和基于 Alpine 的 Node 镜像之间的大小比较。
图 3:基础镜像的不同大小
通过修改 Dockerfile 并使用 Alpine 作为基础镜像,我们的镜像最终大小为 330MB:
FROM node:10-alpine WORKDIR /appCOPY app /appRUN npm install -g webserver.localRUN npm install && npm run build EXPOSE 3000CMD webserver.local -d ./build
图 4:经过第一步优化后镜像大小为 330MB
第二步优化:多阶段构建
通过多阶段构建,我们可以在 Dockerfile 中使用多个基础镜像,并将编译成品、配置文件等从一个阶段复制到另一个阶段,这样我们就可以丢弃不需要的东西。
在本例中,我们部署 React 应用程序需要的是编译后的代码,我们不需要源文件,也不需要 node_modules 目录和 package.json 文件等。关注公众号 逆锋起笔,回复 pdf,下载你需要的各种学习资料。
通过将 Dockerfile 修改为如下内容,我们最终得到的镜像大小为 91.5MB。请记住,来自第一阶段(第 1-4 行)的镜像不会被自动删除,Docker 将它保存在 cache 中,如果我们在另一个构建镜像过程中执行了相同的阶段,就可以使镜像构建更快。所以你必须手动删除第一阶段镜像。
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
图 5:第二步优化后的镜像大小为 91.5MB
现在我们有了一个 Dockerfile,它有两个阶段:在第一个阶段中,我们编译项目,在第二个阶段中,我们在 web 服务器上部署应用程序。然而,Node 容器并不是提供网页(HTML、CSS 和 JavaScript 文件、图片等)服务的最佳选择,最好的选择是使用像 Nginx 或 Apache 这样的服务。在本例中,我将使用 Nginx。
通过将 Dockerfile 修改为如下内容,我们的镜像最终大小是 22.4MB,如果我们运行这个容器,我们可以看到网页可以正常工作,没有任何问题(图 7)
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;"]
图 6:第三步优化后的镜像大小为 22.4MB
图 7:最终容器的运行结果
到此这篇关于Docker 镜像优化(从1.16GB到22.4MB)的文章就介绍到这了,更多相关Docker 镜像优化 内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- docker端口映射详解(docker 启用多个端口映射命令的操作)
- idea docker使用(最新IDEA快速实现Docker镜像部署运行的过程详解)
- docker和golang哪个好(使用Golang玩转Docker API的实践)
- docker目录映射不起作用(关于dockerfile build过程中报/bin/sh: pip: command not found的解决方法)
- docker nginx 配置详解(Docker 如何安装 Nginx)
- dockervolume迁移工具(Docker中数据卷volume管理的两种方式)
- docker装redis(通过Docker部署Redis 6.x集群的方法)
- docker 搭建gitlab(使用Docker搭建私有GitLab的两种方案)
- docker 命令上传镜像到镜像仓库(Docker 使用国内镜像仓库的方法)
- docker进入容器内部后的命令(Docker部署Consul配置过程解析)
- centosdocker安装教程(centos下docker安装及springboot远程发布docker的方法)
- docker阿里云服务器教程(Docker安装阿里云服务器和在虚拟机安装遇到的坑问题小结)
- 如何增大docker内存使用(docker 内存监控与压测方式)
- docker部署go项目(Gogs+Jenkins+Docker 自动化部署.NetCore的方法步骤)
- docker查看挂载目录(docker-修改容器挂载目录的3种方法小结)
- docker进入容器的方法(在docker容器中安装vi命令的简单操作)
- 金品公司 界界乐中秋限定飞行棋礼盒 露营藤篮礼盒全新上市(界界乐中秋限定飞行棋礼盒)
- 必看 8月,相比七夕,更需要注意的是这些事(必看8月相比七夕)
- 8月23日11时16分将迎处暑,逐渐进入气象意义上的秋天(8月23日11时16分将迎处暑)
- 花不语 下 如果重来一次的话,你还会这么选择吗(花不语下如果重来一次的话)
- 城市记忆之上海 最难忘的是老弄堂里的市井味道(城市记忆之上海)
- 太鸡贼了,这老小区轻松搞定了停车问题(这老小区轻松搞定了停车问题)
热门推荐
- docker容器内查看内存占用(docker 查看进程, 内存, cup消耗的情况)
- mysql 用户权限配置(详解MySQL 用户权限管理)
- 如何估算项目的开发时间
- echarts 高级图表教程(Echarts图例组件的属性与源代码)
- css中分割线的渐变效果(CSS学习笔记之可重复渐变repeating-linear-gradient)
- js中Document
- ASP.NET泛型约束
- sqlserverdate格式比较(sqlserver之datepart和datediff应用查找当天上午和下午的数据)
- sqlserver2008手动备份方法(MSSQL 2008 自动备份数据库的设置方法)
- set statistics profile on的用法
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9