作者 | The Agile Crafter

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

如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/

第二步优化:多阶段构建

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

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

通过将 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 buildFROM nginx:stable-alpineCOPY --from=build /app/build /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "daemon off;"]

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

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

往期推荐

缓存核心知识小抄,面试必备,赶紧收藏!

Java 17正式发布, Oracle宣布免费提供!“版本任你发,我用Java 8”或成历史?

Spring Boot 中使用@Async实现异步调用,加速任务执行!

一个SpringMVC接口能返回JSON又能返回XML? 安排!

帮你朋友进来看看:色情片伤害人体的全过程

技术交流群

最近有很多人问,有没有读者交流群,想知道怎么加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群“,即可免费加入我们的高质量技术交流群!

点击阅读原文,直达教程目录

Docker 镜像优化:从 1.16GB 到 22.4MB相关推荐

  1. 【20210205期AI简报】联发科发布二代5G基带芯片发布、超强镜像优化从1.16GB到22.4MB!...

    导读:本期为 AI 简报 20210205 期,将为您带来 9 条相关新闻,祝各位小年吉祥.阖家团圆~ 本文一共 4000 字,通篇阅读结束需要 8~13 分钟 1. 华为天才少年自制B站百大Up奖杯 ...

  2. Docker镜像优化

    Docker镜像优化 原文:Docker镜像优化 前言 上篇博文说到使用Visual Studio Tools for Docker帮助我们生成Dockerfile,现在我们讨论下生成的Dockerf ...

  3. Docker 镜像优化与最佳实践

    云栖TechDay41期,阿里云高级研发工程师御坂带来Docker镜像优化与最佳实践.从Docker镜像存储的原理开始,针对镜像的存储.网络传输,介绍如何在构建中对这些关键点进行优化.并介绍Docke ...

  4. docker镜像创建与优化

    1 . 创建镜像 有两种方法构建镜像: docker commit :将运行的容器保存成镜像 Dockerfile:自动构建 使用docker commit 创建镜像分为三步: 运行容器 修改容器 将 ...

  5. 前端 Docker 镜像体积优化

    如果 2019 年技术圈有十大流行词,容器化肯定占有一席之地,随着 Docker 的风靡,前端领域应用到 Docker 的场景也越来越多,本文主要来讲述下开源的分布式图数据库 Nebula Graph ...

  6. docker之nginx镜像优化4

    系列文章目录 docker之nginx镜像优化4 docker 系列文章目录 一.镜像优化的意义及方法 二.使用多阶段构建 一.镜像优化的意义及方法 镜像的优化可以减少客户端下载时候的带宽 已经选择了 ...

  7. #####Docker镜像结构和镜像优化######

    ###Docker镜像的分层结构#### 共享宿主机的kernel(内核) base镜像提供的是最小的Linux发行版 同一docker主机支持运行多种linux发行版 采用分层结构的最大好处:共享资 ...

  8. 优化 ASP.NET Core Docker 镜像的大小

    在这容器化的世界里,我们已经很少直接通过文件发布来运行asp.net core程序了.现在大多数情况下,我们都会使用docker来运行程序.在使用docker之前,我们往往需要打包我们的应用程序.as ...

  9. 优化Docker镜像大小方案 2017年12月10日 17:54:46 阅读数:1774 标

    2019独角兽企业重金招聘Python工程师标准>>> 优化Docker镜像大小方案 2017年12月10日 17:54:46 阅读数:1774 标签: Docker 更多 个人分类 ...

最新文章

  1. 算法基础知识科普:8大搜索算法之二分搜索
  2. R语言ggplot2可视化设置不同的图像主题(theme):使用各种不同的主题(theme)可视化数据、单的黑白主题theme_bw主题(theme)、默认的主题(theme)可视化数据
  3. php程序的安全要素
  4. 用PHP代码实现简单的工厂模式,用PHP代码实现简单的工厂模式
  5. java call back_java中Callback简单使用总结
  6. yum源 php7.2,云服务器:CentOS7 yum安装PHP7.2的操作方法
  7. 【iOS开发】什么是Bundle,每个iOS应用实际上是一个Bundle
  8. android实用测试方法之Monkey与MonkeyRunner
  9. c语言加密字母向右移两位,C语言二进制除法用左右移位来表示
  10. 电子设计大赛-仪器仪表类题目分析
  11. 01 超级搜索术——信息搜索:全面、快速查找全网你想要的任何信息、情报
  12. Owlet for Mac(3D光线追踪渲染软件) 破解版
  13. Python语言程序设计——实验五
  14. 如何通过外包平台承接IT项目
  15. 网络安全基础(十四)
  16. T1商贸宝加密狗相关配置
  17. Scala为什么是大数据第一高薪语言
  18. 幸存者偏差(survivorship bias)
  19. 运维自动化之---ansilbe运维自动化和ansible架构介绍(1)
  20. 在opencv2.4.x版本中处理图像EXIF orientation不统一的问题

热门文章

  1. 30天敏捷生活(8): 生成你的20/80待做事项列表
  2. linux ls 按 文件名 大小 时间 排序
  3. linux 设备事件管理服务 systemd-udevd.service 简介
  4. 区块链 重放攻击 简介
  5. 编写 Debugging Tools for Windows 扩展,第 2 部分:输出 (windbg 插件 扩展)
  6. Win7最高权限问题
  7. error: Upgrade DB using Essex release first.
  8. OpenStack-MitakaCentos7.2双节点搭建--(六)Dashboard服务
  9. linux在文档中查找内容,【Linux】用grep在文档中查找内容
  10. linux svn磁盘空间满,Linux svn checkout时候总报设备上没有空间