镜像体积减小_docker镜像从1.16G优化到22M

accc2f8caa3d891dde32b3d533048bb1.png

介绍

太大的 Docker 镜像会使构建和传输到云主机的时间变长。 因此,适合生产的 Docker 镜像应该只安装必需品。

有几种方法可以减小Docker镜像的大小。 首先,这些镜像通常不需要构建工具来运行其应用程序,因此根本不需要添加它们。 其次通过使用多阶段构建 ,可以使用中间镜像来编译和构建代码,安装依赖项,并将所有内容打包到最小,然后将应用程序的最终版本复制到没有构建工具的空镜像。 此外,可以使用 Alpine Linux 。 Alpine 是适合生产的 Linux 发行版,因为它只包含运行应用程序的必需品

在本文中,我将重点介绍优化 Docker 镜像使其更小,更快,更适合生产。

开始

下面我将构建一个 React 应用并容器化,在运行 npx 命令并创建 Dockerfile 后,会有如下所示的文件结构

npx create-react-app app --template typescript

39ac81da3ce1306e3f5a1bc2505ff41f.png

如果我们构建一个基本的 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

0dedb881d7f6ceba5327cebf8e0c46b2.png

第一项优化:使用轻量级镜像

在 Docker Hub(公共Docker存储库)中,有几个可供下载的镜像,每个镜像具有不同的特征和大小。 通常,与基于其他 Linux 发行版(例如 Ubuntu )的镜像相比,基于 Alpine 或 BusyBox 的镜像的体积非常小。 这是因为 Alpine 已经做过优化,只包含最小和必备软件包。 在下图中,可以看到 Ubuntu,Alpine,Node和基于 Alpine 的 Node 之间的大小比较。

5c0756fa3d8d95fedee33649c0ef972c.png

通过修改 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

f76946c888dc4a5d6d2cb09dd2cae430.png

第二次优化:多阶段构建

通过多阶段构建,我们可以在 Dockerfile 中使用多个基础镜像,并将编译后的代码,配置文件等从一个阶段复制到另一个阶段,以便我们可以去掉不需要的内容。

在这个例子中,我们需要部署 React 应用程序的是编译后的代码。 我们不需要源文件,也不需要 node_modules 目录,也不需要 package.json 等。 通过修改 Dockerfile ,我们的镜像的最终大小为 91.5 MB。 请记住,上一阶段(第1-4行)中的镜像不会自动删除,如果我们在另一个构建中使用同一阶段,则 Docker 会将其保留在缓存中以加快运行速度,因此必须手动删除。

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

bf1f33b9cbbbeabf66dd150a43a0e9ff.png

现在,我们有了一个包含两个阶段的 Dockerfile:在第一个阶段中,我们编译项目,在第二个阶段中,我们将应用程序部署在 Web 服务器上。 但是,Node 容器并不是服务网页(HTML,CSS和 JavaScript 文件,图片等)的最佳选择,最佳选择是使用 Nginx 或 Apache 之类的服务器。 在这种情况下,我将使用 Nginx。 通过修改 Dockerfile,我们的镜像的最终大小为22.4 MB。 如果运行该容器,则可以看到网络正常运行

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;"]

aae5102922f10e4bd00c7853bbe20c86.png

adf76fc1d4f5578ce16b3afd64006960.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值