编程语言Docker 镜像优化:从 1.16 GB 到 22.4MB!怎么做到的??

来源:http://blog.csdn.net/update7

Docker简介

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

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

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

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

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

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

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

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

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

优化过程

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

npx create-react-app app --template typescript

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

FROM node:10
WORKDIR /app
COPY app /app
RUN npm install -g webserver.local
RUN npm install && npm run build
EXPOSE 3000
CMD webserver.local -d ./build

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

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

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

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

FROM node:10-alpine
WORKDIR /app
COPY app /app
RUN npm install -g webserver.local
RUN npm install && npm run build
EXPOSE 3000
CMD webserver.local -d ./build

第二步优化:多阶段构建

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

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

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

FROM node:10-alpine AS build
WORKDIR /app
COPY app /app
RUN npm install && npm run build
FROM node:10-alpineWORKDIR /app
RUN npm install -g webserver.local
COPY --from=build /app/build ./build
EXPOSE 3000
CMD webserver.local -d ./build

现在我们有了一个 Dockerfile,它有两个阶段:在第一个阶段中,我们编译项目,在第二个阶段中,我们在 web 服务器上部署应用程序。然而,Node 容器并不是提供网页(HTML、CSS 和 JavaScript 文件、图片等)服务的最佳选择,最好的选择是使用像 Nginx 或 Apache 这样的服务。

在本例中,我将使用 Nginx。另外,Nginx 系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。

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

FROM node:10-alpine AS build
WORKDIR /app
COPY app /app
RUN npm install && npm run build
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
(0)

相关推荐

  • 看完这篇,Docker你就入门了

    素小暖OSC OSC开源社区 昨天 在计算机技术日新月异的今天, Docker在国内发展的如火如荼,特别是在一线互联网公司,Docker的使用是十分普遍的,在理解docker之前,我们先熟悉两个概念, ...

  • Docker学习笔记之--借助Docker Compose进行多容器部署(环境:centos7)

    接下来演示借助Docker Compose进行多容器部署. 前边的章节演示尽管可以实现需求功能,但是在生产环境当中,维护起来显然很麻烦,所以下边演示借助Docker Compose功能,实现一键部署! ...

  • Docker 制作Nginx镜像

    参考文章:https://www.jianshu.com/p/dc4cd0547d1e 镜像的制作方式有两种,一种是下载别人的镜像之后再制作成自己的镜像,一种是从头开始制作自己的镜像 第一种,下载别人 ...

  • 是时候跟Docker说再见了

    在容器的远古时代 (差不多就是 4 年前),Docker 是这场游戏的唯一玩家.但现在情况已经不一样了,Docker 不再是唯一玩家,而只是一个容器引擎而已.我们可以用 Docker 构建.运行.拉取 ...

  • 一步步把 SAP UI5 应用部署到 SAP BTP Kyma 运行环境中去

    这是 Jerry 2021 年的第 40 篇文章,也是汪子熙公众号总共第 317 篇原创文章. Jerry 2018年曾经写过两篇文章,介绍了如何在 Kubernetes 这个容器编排平台上运行一个包 ...

  • Docker 镜像优化:从 1.16GB 到 22.4MB

    来源:架构头条(ID:ArchFront) Docker 是一个供软件开发人员和系统管理员使用容器构建.运行和与分享应用程序的平台.容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统是 ...

  • 群晖入门到进阶系列(七):自用Docker镜像推荐与配置 | Alliot''s blog

    前面我们已经讲完了 Docker 的安装与镜像加速器的配置,本文将介绍一些 Alliot 常用的镜像以及相关的配置. 前言 命令行与群晖的 Docker 套件面板操作,各有优劣,因此,下文的内容有综合 ...

  • 构建自己的docker镜像

    今天玩一下怎么构建一个我们自己的docker镜像,然后我们试试将本地的springboot项目打包成一个镜像,然后发送到远程服务器的docker中,最后我们运行这个docker镜像成功访问: 提前须知 ...

  • Odoo14 官方新版docker镜像跑起来网站页面异常 元素 '<xpath expr="//*[hasclass('o_footer_copyright_name')]">' 在母级视图中没有找到

    异常如下: 经查明在中文语言下才会报以上异常,在后台设置网站加上其他语言如en,然后页面访问 http://xxx/en 即正常 这里不得不吐槽下Odoo的中文翻译,过往因为翻译处理不当导致程序逻辑异 ...

  • 剥茧抽丝:反向工程Docker镜像

    现在越来越多的企业基于容器和云来构建自己的基础架构,管理的容器越来越多,时而会遇到一些容器镜像不知道是干嘛的?容器运行时参数是什么?容器跑的应用是什么?针对这些疑问今天就是学习如何剖析在线的容器及其镜 ...

  • SAP ABAP Platform 1909最新版的 docker 镜像

    SAP ABAP Platform, 开发者版本,最新的 1909 Docker 镜像,感兴趣的朋友可以在自己机器上安装试试.安装步骤: https://hub.docker.com/_/sap-ab ...

  • Docker 镜像的推送(六)

    一.为镜像命名 无论采用何种方式保存和分发镜像,首先都得给镜像命名. 当我们执行 docker build 命令时已经为镜像取了个名字,例如前面: ubuntu_with_apache_dockerf ...

  • Docker镜像的内部结构(四)

    一.base镜像 base 镜像简单来说就是不依赖其他任何镜像,完全从0开始建起,其他镜像都是建立在他的之上,可以比喻为大楼的地基,docker镜像的鼻祖. base 镜像有两层含义:(1)不依赖其他 ...

  • Docker镜像的使用

    相关概念 镜像运行起来就是容器,镜像是文件,容器是进程 1.列出镜像列表 docker images REPOSITORY:表示镜像的仓库源 TAG:镜像的标签 IMAGE ID:镜像ID CREAT ...