如何将 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
然后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项目的一些简单技巧,可以大幅减小图像大小。现在您的容器确实更加便携和高效。
作者:Mohammad Faisal
本文由“云原生数据库”小编翻译,更多技术干货请关注“云原生数据库”

相关推荐
详解Docker Registry之删除镜像、垃圾回收
本篇文章主要介绍了详解Docker Registry之删除镜像、垃圾回收,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Windows下Docker安装Mysql8.0.43[代码]
本文详细介绍了在Windows平台下使用Docker Desktop安装Mysql8.0.43的完整步骤。首先需要确保Docker Desktop版本为4.43.2,然后在Docker Hub中搜索并下载官方Mysql镜像。下载完成后,在Image菜单中可以看到Mysql镜像。启动镜像时需要配置容器名称、端口映射等参数,特别注意3306和33060端口是否冲突。启动成功后,在Containers菜单中可以看到运行的Mysql容器。最后使用HeidiSQL工具验证Mysql是否正常运行,输入本机地址和root密码123456即可连接成功。整个过程需要注意Docker镜像源问题和端口冲突问题。
详解nodejs之创建最小docker镜像
主要介绍了详解nodejs之创建最小docker镜像,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Mac帆软生成docker镜像
场景 使用帆软制作报表后,需要将报表系统生成可执行的docker镜像,技术总结如下: 1 测试项目 先测试项目,再打war包 1.1 找到项目,复制项目 打开帆软设计器,打开一个报表,展示的帆软项目位置如下: 然后,将这目录下的这个webroot文件夹复制到tomcat的webapps文件夹中。 1.2 替换tools.jar 如果你的项目能够正常启动,此步骤可省略。 找到java_home下lib/tools.jar,然后复制; 找到tomcat下webapps/webroot/WEB-INF/lib/tools.jar,然后替换。 1.3 启动tomcat sudo sh ./start
云计算Docker从零基础到专家实战教程43-容器连接2 共4页.pptx
【课程大纲】 01-什么是docker 02-Docker在Windows下的安装 03-Docker在MAC下的安装 04-Docker在Linux下的安装1 05-Docker在Linux下的安装2 06-Docker有何用? 07-虚拟化与Docker 08-容器与虚拟机 09-Docker组件 10-什么是镜像? 11-如何获取镜像 12-如何搜寻镜像 13-如何创建镜像 14-如何删除镜像 15-镜像信息的查看 16-镜像的存出与载入 17-写时复制机制 18-什么是docker hub? 19-镜像分发 20-自动化构建镜像 21-注册服务器的创建 22-镜像的上传 23-容器创建实战 24-容器管理实战1 25-容器管理实战2 26-容器管理实战3 27-依附容器 28-容器信息查看1 29-容器信息查看2 30-容器内命令执行实战 31-容器的导入和导出 32-什么是数据卷 33-数据卷的创建 34-挂载 35-数据卷容器 36-数据迁移 37-学会备份 38-通过网络访问容器 39-容器间通信的实现 40-网络配置的查看 41-容器命名 42-容器连接1 43-容器连接2 44-Dockerfile的使用 45-实训项目1--快速创建SSH服务镜像 46-实训项目1--快速创建SSH服务镜像 47-实训项目1--快速创建SSH服务镜像 48-实训项目2--Docker下构建SSH服务镜像 49-实训项目2--Docker下构建SSH服务镜像 50-实训项目2--Docker下构建SSH服务镜像 51-实训项目2--Docker下构建SSH服务镜像


