Docker镜像瘦身大小从1.43 GB减少到22.4MB

 更新时间:2023年06月13日 15:38:38   作者:沃趣数据库管理平台  
本文主要介绍了 Docker镜像瘦身大小从1.43 GB减少到22.4MB,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

 如果你正在从事 Web 开发,那么你可能已经了解过容器化的概念以及它的优点。

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

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

这些技巧将会展示给 ReactJS,但它同样适用于任何 NodeJS 应用程序。

步骤1:创建您的项目

把你的终端打开,输入以下命令:

npx create-react-app docker-image-test

然后create-react-app将为您提供基本的 React 应用程序。

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

cd docker-image-testyarn installyarn start

然后转到http://localhost:3000查看您的应用程序是否已启动并正在运行。

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

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

FROM node:12
WORKDIR /app
COPY package.json ./
RUN yarn install
COPY . .
EXPOSE 3000
CMD ["yarn", "start"]

请注意,我们正在从 docker hub 获取基本映像 node:12,安装依赖项并运行基本命令。(这里不深入docker命令的细节)

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

docker build -t docker-image-test .

Docker 将构建您的映像。完成后,您可以使用此命令查看您的图像。

docker images

列表顶部是我们新创建的图像,在最右侧,我们可以看到图像的大小。现在是1.43GB 。

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

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

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

步骤3:更改基础图像

在之前的配置中,我们使用node:12作为基础镜像。但传统上,节点图像是基于Ubuntu的,这对于我们简单的React应用程序来说是不必要的沉重。

从 DockerHub(官方 docker image registry)可以看出,基于 Alpine 的镜像比基于 Ubuntu 的镜像要小得多,而且它们只打包了最小的依赖。

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

 现在我们将使用node:12-alpine作为我们的基础镜像,看看会发生什么。

FROM node:12-alpine
WORKDIR /app
COPY package.json ./
RUN yarn install
COPY . .
EXPOSE 3000
CMD ["yarn", "start"]

然后我们像以前一样构建图像并查看大小。

 哇!我们的图像大小只减少到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

在第一阶段,我们安装依赖项并构建我们的项目。

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

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

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

 现在我们的图像大小只有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;"]

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

然后我们使用当前配置构建我们的镜像。

 图像大小仅减少到22.4MB!

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

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

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

请注意,我们将容器的 80 端口暴露给外部,因为默认情况下,Nginx将在容器内的端口 80 上可用。

这些是您可以应用于任何NodeJS项目的一些简单技巧,可以大幅减小图像大小。现在您的容器确实更加便携和高效。

到此这篇关于 Docker镜像瘦身大小从1.43 GB减少到22.4MB的文章就介绍到这了,更多相关 Docker镜像瘦身内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker限制容器的内存使用大小的实战指南

    Docker限制容器的内存使用大小的实战指南

    在使用 Docker 部署服务时,如果不加限制,某个容器可能因为内存泄漏或负载过高,导致主机内存被耗尽,拖垮其他容器甚至整个系统,所以本文给大家介绍了Docker如何限制容器的内存使用大小,需要的朋友可以参考下
    2026-02-02
  • Docker部署Nginx 及Nginx的基本使用最佳实践

    Docker部署Nginx 及Nginx的基本使用最佳实践

    Nginx是一个高性能的HTTP和反向代理服务器,广泛应用于Web服务、负载均衡和静态资源托管等领域,这篇文章主要介绍了Docker部署Nginx 以及Nginx的基本使用,需要的朋友可以参考下
    2025-04-04
  • docker-compose部署MySQL适用于所有版本

    docker-compose部署MySQL适用于所有版本

    本文主要介绍了docker-compose部署MySQL,需要准备一个docker-compose.yml文件,通过运行docker-compose up命令启动容器,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • 在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法

    在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法

    这篇文章主要介绍了在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法,需要的的朋友参考下吧
    2017-01-01
  • Docker network自定义网络方式

    Docker network自定义网络方式

    这篇文章主要介绍了Docker network自定义网络方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Docker 部署 RocketMQ 5.1.0 踩坑指南从超时到 Console 连不上的完整解决方案

    Docker 部署 RocketMQ 5.1.0 踩坑指南从超时到 C

    最近在项目中引入RocketMQ作为消息中间件,选择使用Docker容器化部署以简化环境搭建,本文给大家介绍Docker 部署 RocketMQ 5.1.0 踩坑指南从超时到 Console 连不上的完整解决方案,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • docker离线安装并导入镜像过程

    docker离线安装并导入镜像过程

    这篇文章主要介绍了docker离线安装并导入镜像过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Linux执行Docker命令提示Get Permission Denied的解决方案

    Linux执行Docker命令提示Get Permission Denied的解决方案

    这篇文章主要介绍了Linux执行Docker命令提示Get Permission Denied的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • 如何快速清理 docker 资源的方法

    如何快速清理 docker 资源的方法

    这篇文章主要介绍了如何快速清理 docker 资源,具体点说就是删除那些无用的 镜像、容器、网络和数据卷,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • jenkins如何进行自动化部署

    jenkins如何进行自动化部署

    这篇文章主要介绍了jenkins如何进行自动化部署问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论