敞开生长之旅!这是我参加「日新方案 12 月更文应战」的第25天,点击检查活动详情

什么是Docker

Docker是一个开源的虚拟化平台,能够让开发人员将应用程序和依靠项打包在轻量级容器中,然后能够轻松地在任何环境中运转。这样,开发人员能够将容器作为独立的可移植单元在不同的环境中布置和运转应用程序,而不用担心环境的差异会对应用程序的行为产生影响。例如,您能够运用Docker在开发环境中测验应用程序,然后将容器布置到出产环境中运转。总归,Docker能够让开发人员更轻松地创立、布置和运转应用程序。

  • 灵活性:即使是最复杂的应用程序也能够容器化。
  • 轻量化:容器共享主机内核,使得它们远比虚拟机高效。
  • 便携性:能够做到本地编译,到处运转。松耦合:容器自我封装,一个容器被替换或升级不会打断其他容器。
  • 安全性:容器对进程进行了严格的限制和阻隔,而无需用户进行任何配置。

在这篇文章中,我将要点评论怎么优化 Docker 镜像以使其轻量化。

优化进程

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

npxcreate-react-appapp--templatetypescript

如何把优化Docker镜像大小

假如咱们构建一个根底的 Dockerfile(如下所示),咱们终究会得到一个 1.16 GB 的镜像:

FROMnode:10
WORKDIR/app  
COPYapp/app  
RUNnpminstall-gwebserver.local  
RUNnpminstall&&npmrunbuild  
EXPOSE3000  
CMDwebserver.local-d./build

如何把优化Docker镜像大小

第一步优化:运用轻量化根底镜像

在 Docker Hub(公共 Docker 库房)中,有一些镜像可供下载,每个镜像都有不同的特征和巨细。
一般,相较于根据其他 Linux 发行版(例如 Ubuntu)的镜像,根据 Alpine 或 BusyBox 的镜像非常小。这是因为 Alpine 镜像和相似的其他镜像都经过了优化,其间仅包括最少的有必要的软件包。
在下面的图片中,你能够看到 Ubuntu、Alpine、Node 和根据 Alpine 的 Node 镜像之间的巨细比较。

如何把优化Docker镜像大小
经过修正 Dockerfile 并运用 Alpine 作为根底镜像,咱们的镜像终究巨细为 330MB:

FROMnode:10-alpine
WORKDIR/app  
COPYapp/app  
RUNnpminstall-gwebserver.local  
RUNnpminstall&&npmrunbuild  
EXPOSE3000  
CMDwebserver.local-d./build

如何把优化Docker镜像大小

第二步优化:多阶段构建

经过多阶段构建,咱们能够在 Dockerfile 中运用多个根底镜像,并将编译成品、配置文件等从一个阶段复制到另一个阶段,这样咱们就能够丢掉不需求的东西。
咱们布置 React 应用程序需求的是编译后的代码,咱们不需求源文件,也不需求 node_modules 目录和 package.json 文件等。
经过将 Dockerfile 修正为如下内容,咱们终究得到的镜像巨细为 91.5MB。请记住,来自第一阶段(第 1-4 行)的镜像不会被主动删去,Docker 将它保存在 cache 中,假如咱们在另一个构建镜像进程中执行了相同的阶段,就能够使镜像构建更快。所以你有必要手动删去第一阶段镜像。

FROMnode:10-alpineASbuild
WORKDIR/app  
COPYapp/app  
RUNnpminstall&&npmrunbuild  
FROMnode:10-alpineWORKDIR/app  
RUNnpminstall-gwebserver.local  
COPY--from=build/app/build./build  
EXPOSE3000  
CMDwebserver.local-d./build

如何把优化Docker镜像大小

现在咱们有了一个 Dockerfile,它有两个阶段:在第一个阶段中,咱们编译项目,在第二个阶段中,咱们在 web 服务器上布置应用程序。
但是,Node 容器并不是供给网页(HTML、CSS 和 JavaScript 文件、图片等)服务的最佳挑选,最好的挑选是运用像 Nginx 或 Apache 这样的服务。在本例中,我将运用 Nginx。
经过将 Dockerfile 修正为如下内容,咱们的镜像终究巨细是 22.4MB,假如咱们运转这个容器,咱们能够看到网页能够正常作业,没有任何问题。

FROMnode:10-alpineASbuild
WORKDIR/app  
COPYapp/app  
RUNnpminstall&&npmrunbuild  
FROMnginx:stable-alpine  
COPY--from=build/app/build/usr/share/nginx/html  
EXPOSE80  
CMD["nginx","-g","daemonoff;"]

终究容器的运转成果

如何把优化Docker镜像大小

总结:

您能够运用多种方法来优化Docker镜像巨细。这儿列举几种常用的方法:

  1. 运用根底镜像:挑选一个较小的根底镜像来作为您的应用程序的镜像。这样,您的镜像就不会包括剩余的文件和依靠项。
  2. 运用多个镜像:将您的应用程序拆分红多个镜像,每个镜像只包括一个特定的功用。这样,您就能够在运转时动态加载镜像,而不需求在每个镜像中都包括一切功用。
  3. 紧缩镜像:运用紧缩工具对镜像进行紧缩,能够节省镜像的空间。
  4. 整理无用文件:在构建镜像时,保证只包括必需的文件和依靠项。在构建进程中,能够运用指令来整理缓存和无用的文件。
  5. 运用 alpine 版别的镜像:alpine 版别的镜像比普通版别的镜像要小得多,因为它们只包括基本的 Linux 系统功用。因此,您能够运用 alpine 版别的镜像来构建您的应用程序。
  6. 删去不必要的依靠项:在构建镜像时,保证只装置必需的依靠