如何将 Docker 镜像大小从 1.43 GB 缩减到 22.4 MB

2025-06-07

如何将 Docker 镜像大小从 1.43 GB 缩减到 22.4 MB

要阅读更多类似的文章,请访问我的博客

如果您从事 Web 开发工作,那么您可能已经了解容器化的概念以及它的优点等等。

但是使用Docker镜像时,大小是一个大问题。仅从create-react-app获得的样板项目,镜像大小通常就超过 1.43 GB。

今天,我们将容器化一个 ReactJS 应用程序,并学习一些关于如何减小图像大小并同时提高性能的技巧。

这些技巧将针对 ReactJS 进行展示,但它适用于任何 NodeJS 应用程序。

步骤 1.创建您的项目

  • 只需转到您的终端并输入


npx create-react-app docker-image-test


Enter fullscreen mode Exit fullscreen mode
  • 然后create-react-app将为您提供基本的 React 应用程序

  • 然后,进入根目录并运行项目。



cd docker-image-test
yarn install
yarn start


Enter fullscreen mode Exit fullscreen mode

步骤 2. 构建您的第一个图像

  • 在项目的根目录中,创建一个名为Dockerfile的文件并将以下代码粘贴到那里。


FROM node:12

WORKDIR /app

COPY package.json ./

RUN yarn install

COPY . .

EXPOSE 3000

CMD ["yarn", "start"]


Enter fullscreen mode Exit fullscreen mode
  • 请注意,我们正在从 Docker Hub 获取基础镜像节点:12,安装依赖项,并运行基本命令。(这里我们不会详细介绍 Docker 命令)

  • 现在从您的终端为您的容器构建图像。



docker build -t docker-image-test .


Enter fullscreen mode Exit fullscreen mode
  • Docker 将构建你的镜像。完成后,你可以使用此命令查看你的镜像。


docker images


Enter fullscreen mode Exit fullscreen mode

列表顶部是我们新创建的镜像,最右侧可以看到镜像的大小。目前大小为1.43GB 。

我们机器上的 docker 镜像

  • 我们可以使用以下命令运行该图像


docker run --rm -it -p 3000:3000/tcp docker-image-test:latest


Enter fullscreen mode Exit fullscreen mode

您可以转到浏览器并刷新页面以验证它是否仍在运行。

步骤3.更改基础镜像

  • 在之前的配置中,我们使用了node:12作为基础镜像。但传统上,node 镜像是基于Ubuntu的,这对于我们这个简单的React应用程序来说,负担过重

  • 从 DockerHub(官方 Docker 镜像仓库)中我们可以看到,基于 Alpine 的镜像比基于 Ubuntu 的镜像小得多,并且只打包了最少的依赖项。

  • 这些基础图像的大小比较如下所示。

节点:12 与节点:12-alpine

  • 现在我们将使用node:12-alpine作为我们的基础图像并观察会发生什么。


FROM node:12-alpine

WORKDIR /app

COPY package.json ./

RUN yarn install

COPY . .

EXPOSE 3000

CMD ["yarn", "start"]


Enter fullscreen mode Exit fullscreen mode
  • 然后我们构建图像并查看其大小,就像我们之前所做的那样。

带有 node-alpine 的图像

哇!我们的镜像大小缩小到只有580MB。这是一个很大的进步。但我们还能做得更好吗?

步骤 4. 多阶段构建



# STAGE 1

FROM node:12-alpine AS build

WORKDIR /app

COPY package.json ./

RUN yarn  install

COPY . /app

RUN yarn build


# STAGE 2

FROM node:12-alpine

WORKDIR /app

RUN npm install -g webserver.local

COPY --from=build /app/build ./build

EXPOSE 3000

CMD webserver.local -d ./build


Enter fullscreen mode Exit fullscreen mode
  • 在第一阶段,我们安装依赖项并构建我们的项目

  • 在第二阶段,我们复制上一阶段的构建文件夹的内容并使用它来为我们的应用程序提供服务。

  • 这样,我们的最终图像中就没有不必要的依赖和代码。

接下来,我们构建图像并像以前一样从列表中查看图像

多阶段构建的镜像

现在我们的镜像大小只有97.5MB。这多棒啊!

步骤 5.使用 NGINX

  • 我们正在使用节点服务器来提供ReactJS应用程序的静态资产,这不是提供静态内容的最佳选择。

  • 我们可以使用更高效、更轻量级的服务器(如**Nginx **)来服务我们的应用程序,看看它是否能提高我们的性能并减少尺寸。

  • 我们的最终 Docker 配置文件将如下所示。



# STAGE 1

FROM node:12-alpine AS build

WORKDIR /app

COPY package.json ./

RUN yarn  install

COPY . /app

RUN yarn build

# STAGE 2

FROM nginx:stable-alpine

COPY --from=build /app/build /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]


Enter fullscreen mode Exit fullscreen mode
  • 我们正在更改 docker 配置的第二阶段,以使用 Nginx 为我们的应用程序提供服务。

  • 然后我们使用当前配置来构建我们的图像。

最终 Docker 镜像大小

  • 图像大小缩小至仅22.4MB

  • 同时,我们正在使用性能更强大的服务器来为我们出色的应用程序提供服务。

  • 我们可以使用以下命令验证我们的应用程序是否仍在运行。



docker run --rm  -it -p 3000:80/tcp docker-image-test:latest


Enter fullscreen mode Exit fullscreen mode
  • 请注意,我们将容器的 80 端口暴露到外部,因为Nginx默认在容器内的 80 端口上可用。

以上这些简单的技巧可以应用到你的任何NodeJS项目中,大幅缩减镜像大小。现在你的容器真的更加轻便高效了。

今天就到这里。祝你编码愉快!

有话要说吗?

通过LinkedIn与我联系

文章来源:https://dev.to/mohammadfaisal/how-i-reduced-docker-image-size-from-143-gb-to-224-mb-53nc
PREV
在 ASP.NET Core 6.0 中构建自己的 OAuth 2.0 服务器和 OpenId Connect 提供程序
NEXT
打造清洁 React 项目的 21 个最佳实践