0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

重点讨论如何优化Docker镜像以使其轻量化

马哥Linux运维 来源:The Agile Crafter 2023-02-25 16:06 次阅读

Docker简介

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

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

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

灵活性:即使是最复杂的应用程序也可以容器化。

轻量化:容器共享主机内核,使得它们远比虚拟机高效。

便携性:可以做到本地编译,到处运行。

耦合:容器自我封装,一个容器被替换或升级不会打断别的容器。

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

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

优化过程

让我们从一个示例开始,在该示例中,我们构建了一个 React 应用程序并将其容器化。

运行 npx 命令并创建 Dockerfile 之后,我们得到了下图所示的文件结构。

npxcreate-react-appapp--templatetypescript

49b81568-b392-11ed-bfe3-dac502259ad0.png

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

FROMnode:10
WORKDIR/app
COPYapp/app
RUNnpminstall-gwebserver.local
RUNnpminstall&&npmrunbuild
EXPOSE3000
CMDwebserver.local-d./build

49cbd4ea-b392-11ed-bfe3-dac502259ad0.png

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

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

通常,相较于基于其他 Linux 发行版(例如 Ubuntu)的镜像,基于 Alpine 或 BusyBox 的镜像非常小。

这是因为 Alpine 镜像和类似的其他镜像都经过了优化,其中仅包含最少的必须的软件包。

在下面的图片中,你可以看到 Ubuntu、Alpine、Node 和基于 Alpine 的 Node 镜像之间的大小比较。

49e40650-b392-11ed-bfe3-dac502259ad0.png

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

FROMnode:10-alpine
WORKDIR/app
COPYapp/app
RUNnpminstall-gwebserver.local
RUNnpminstall&&npmrunbuild
EXPOSE3000
CMDwebserver.local-d./build

4a188df8-b392-11ed-bfe3-dac502259ad0.png

第二步优化:多阶段构建

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

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

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

FROMnode:10-alpineASbuild
WORKDIR/app
COPYapp/app
RUNnpminstall&&npmrunbuild
FROMnode:10-alpineWORKDIR/app
RUNnpminstall-gwebserver.local
COPY--from=build/app/build./build
EXPOSE3000
CMDwebserver.local-d./build

4a28ce7a-b392-11ed-bfe3-dac502259ad0.png

现在我们有了一个 Dockerfile,它有两个阶段:在第一个阶段中,我们编译项目,在第二个阶段中,我们在 web 服务器上部署应用程序。

然而,Node 容器并不是提供网页(HTML、CSS 和 JavaScript 文件、图片等)服务的最佳选择,最好的选择是使用像 Nginx 或 Apache 这样的服务。在本例中,我将使用 Nginx。

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

FROMnode:10-alpineASbuild
WORKDIR/app
COPYapp/app
RUNnpminstall&&npmrunbuild
FROMnginx:stable-alpine
COPY--from=build/app/build/usr/share/nginx/html
EXPOSE80
CMD["nginx","-g","daemonoff;"]

4a3cc7cc-b392-11ed-bfe3-dac502259ad0.png

4a63688c-b392-11ed-bfe3-dac502259ad0.png






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Ubuntu系统
    +关注

    关注

    0

    文章

    84

    浏览量

    3787
  • Docker
    +关注

    关注

    0

    文章

    437

    浏览量

    11609
  • docker容器
    +关注

    关注

    0

    文章

    28

    浏览量

    3288

原文标题:Docker镜像优化:从1.16GB到22.4MB!

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    怎么构建docker镜像仓库软件

    Docker Registry】用docker registry 镜像搭建私有测试仓库
    发表于 08-13 11:03

    汽车轻量化采用3D打印

    轻量化制造简单而言是在不牺牲零部件性能的前提下,减轻零部件重量的制造方式。重量的减轻带来能耗的降低,在全球范围控制碳排放的趋势下,轻量化制造越来越受到重视,是未来制造的方向之一。除了合金以外,近些年
    发表于 09-27 09:12

    客车车身轻量化分析

    以某车型为例, 分别从优化流程、优化分析模型、分析工况等方面研究车身轻量化方法, 提出一套切实可行的技术路线。关键词: 车身; 结构; 轻量化;
    发表于 07-27 10:09 12次下载

    常见的轻量化材料的分类与汽车轻量化材料的应用

    主要有三种手段:轻量化结构设计及优化、先进轻量化材料应用、先进轻量化制造技术应用。采用新型材料是汽车轻量化最直接有效的方法。 汽车的
    发表于 09-15 16:53 6次下载
    常见的<b class='flag-5'>轻量化</b>材料的分类与汽车<b class='flag-5'>轻量化</b>材料的应用

    Docker上的Alpine Linux镜像建立

    如何建立你自己的Docker镜像2016-03-18 14:33 Alpine Linux的什么是Docker社区所钟爱?轻量级容器意味着更多的计算资源。Alpine Linux的确是轻型
    发表于 10-12 11:52 0次下载

    浅析Docker镜像本地存储机制及容器启动原理

    Docker 镜像不是一个单一的文件,而是有多层构成。我们可通过 docker images 获取本地的镜像列表及对应的元信息, 接着可通过dock
    发表于 10-19 14:17 2346次阅读

    瑞德丰如何实现动力电池轻量化

    陆宾林介绍,瑞德丰通过结构设计优化、制造工艺创新、材料轻量化三大维度,在保证安全的大前提下来实现轻量化
    的头像 发表于 12-31 09:10 3174次阅读

    go项目怎么让docker镜像体积减小

    go 项目怎么让 docker 镜像体积减小?本文做了详细介绍。
    的头像 发表于 06-23 10:49 971次阅读

    Docker镜像的详细讲解

    本文是对 Docker 镜像的详细讲解,讲解了如何安装 Docker、配置 Docker 镜像加速以及操作
    的头像 发表于 08-02 10:00 1828次阅读

    减少docker镜像大小的方法

    Docker 是一种容器引擎,可以在容器内运行一段代码。Docker 镜像是在任何地方运行您的应用程序而无需担心应用程序依赖性的方式。
    的头像 发表于 05-15 11:13 586次阅读
    减少<b class='flag-5'>docker</b><b class='flag-5'>镜像</b>大小的方法

    docker 搜索镜像,docker查看镜像详细信息(docker下载镜像命令)

    Docker Hub是集中管理的Docker镜像注册中心。通过Docker 用户可以在注册中心搜索、下载和使用CLI命令行工具中的镜像。以下
    的头像 发表于 07-19 09:46 1127次阅读

    最新专利深入“轻量化”!华为这样做?

    具体来看,汽车轻量化的实现途径主要有两方面:一是轻量化材料,使用比强度更高或密度更小的高强度钢、铝合金、镁合金、碳纤维复合材料,对传统普通钢结构进行替代;二是轻量化设计,通过开发全新的汽车架构实现
    的头像 发表于 08-16 14:41 408次阅读
    最新专利深入“<b class='flag-5'>轻量化</b>”!华为这样做?

    Docker镜像国内加速的几种方法

    在国内,拉取 Docker 镜像速度慢/时不时断线/无账号导致限流等,比较痛苦. 这里提供加速/优化的几种方法。
    的头像 发表于 10-19 10:02 955次阅读
    <b class='flag-5'>Docker</b><b class='flag-5'>镜像</b>国内加速的几种方法

    如何在Windows系统上设置Docker镜像

    在使用 Docker 进行镜像下载和构建时,由于众所周知的原因,国内用户可能会遇到下载速度慢或者无法连接的问题。为了解决这个问题,我们可以使用国内的镜像源来加速下载速度。本文将介绍如何
    的头像 发表于 10-24 16:55 1702次阅读

    构建docker镜像应该遵循哪些原则

    构建 Docker 镜像时,应遵循以下原则: 单一职责:每个镜像应只包含一个应用或服务,避免将多个应用或服务放在同一个镜像中。这样可以确保镜像
    的头像 发表于 11-23 09:41 469次阅读