什么是多阶段 Docker 镜像?

介绍

让我们从基础开始

码头工人!这是一个很棒的工具,可以让您在这些简洁的小容器中创建、部署和运行应用程序。将它们想象成微型虚拟机,但只有足够的资源来运行您的应用程序。这太棒了,因为这意味着您可以在任何平台上运行您的应用程序,从笔记本电脑到云!

Docker 镜像的力量

Docker 镜像是使 Docker 如此强大的关键元素之一。这些是预构建、预配置的包,其中包括您的应用程序执行所需的一切 - 代码、库和依赖项。它们就像用于开发和分发应用程序的终极乐高积木套装!

但是如果 Docker 镜像变得更好呢?

这就是多阶段 Docker 镜像的用武之地。它们就像 Docker 世界的超级英雄 - 能够通过分离构建和运行时环境来创建更小、更快、更高效的镜像。使用多阶段 Docker 映像,您可以节省磁盘空间、减少构建时间,甚至提高安全性!

多阶段 Docker 镜像的魔力

什么是多阶段 Docker 镜像?

您是否厌倦了创建需要永远构建和部署的臃肿 Docker 镜像?多阶段 Docker 镜像来拯救!这些 Docker 世界的超级英雄让您可以通过分离构建和运行时环境来创建更小、更快和更安全的镜像。

假设您正在构建一个使用 Node.js 作为运行时环境的 TypeScript 应用程序。使用传统的 Docker 镜像,您必须将所有内容包含在同一个镜像中,从而导致镜像大小更大。但是,使用多阶段 Docker 映像,您可以创建一个精简而简单的映像,仅包含必要的内容。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># First stage: build environment</span>
FROM node:14-alpine as build
WORKDIR /app
COPY package<span style="color:var(--syntax-declaration-color)">*</span>.json ./
RUN npm <span style="color:var(--syntax-text-color)">install
</span>COPY <span style="color:var(--syntax-text-color)">.</span> <span style="color:var(--syntax-text-color)">.</span>
RUN npm run build

<span style="color:var(--syntax-comment-color)"># Second stage: runtime environment</span>
FROM node:14-alpine
WORKDIR /app
COPY <span style="color:var(--syntax-error-color)">--from</span><span style="color:var(--syntax-error-color)">=</span>build /app/dist ./dist
COPY package<span style="color:var(--syntax-declaration-color)">*</span>.json ./
RUN npm <span style="color:var(--syntax-text-color)">install</span> <span style="color:var(--syntax-error-color)">--only</span><span style="color:var(--syntax-error-color)">=</span>production
CMD <span style="color:var(--syntax-error-color)">[</span><span style="color:var(--syntax-string-color)">"npm"</span>, <span style="color:var(--syntax-string-color)">"start"</span><span style="color:var(--syntax-error-color)">]</span>
</code></span></span>

传统与多阶段 Docker 镜像

传统的 Docker 镜像使用单一阶段来构建和打包应用程序,这意味着镜像包括构建和运行时环境。这会使图像更大且效率更低。

另一方面,多阶段 Docker 镜像允许您通过分离构建和运行时环境来创建更小、更高效的镜像。多阶段 Docker 镜像中的每个阶段都可以有自己的基础镜像、依赖项和构建指令。您可以使用 COPY 命令在各个阶段之间复制文件,最后一个阶段用于创建将要部署的最终映像。

让我们考虑上面的Typescript应用程序示例,您要将其部署到 AWS Lambda 等无服务器平台。使用传统的 Docker 镜像,您会将构建环境和运行时环境都包含在单个镜像中,这会导致更大的镜像大小。这会减慢部署时间并降低应用程序的响应速度。以下是带有传统图像的 TypeScript 应用程序的 Dockerfile 示例:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># Tradional Docker image</span>
FROM node:14-alpine
WORKDIR /app
COPY package<span style="color:var(--syntax-declaration-color)">*</span>.json ./
RUN npm <span style="color:var(--syntax-text-color)">install 
</span>COPY <span style="color:var(--syntax-text-color)">.</span> <span style="color:var(--syntax-text-color)">.</span>
RUN npm run build
CMD <span style="color:var(--syntax-error-color)">[</span><span style="color:var(--syntax-string-color)">"npm"</span>, <span style="color:var(--syntax-string-color)">"start"</span><span style="color:var(--syntax-error-color)">]</span>
</code></span></span>

如您所见,我们不仅安装了所有依赖项,无论生产环境是否需要它们,而且我们还拥有 TypeScript 代码和转译后的 JavaScript,从而生成相同代码的两个副本。

而对于多阶段 Docker 映像,您可以通过将构建和运行时环境分为不同的阶段来保持 Docker 映像的大小较小。以下是使用多阶段 Docker 映像的 TypeScript 应用程序的 Dockerfile 示例:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># Build stage</span>
FROM node:14 AS build
WORKDIR /app
COPY package<span style="color:var(--syntax-declaration-color)">*</span>.json ./
RUN npm <span style="color:var(--syntax-text-color)">install
</span>COPY <span style="color:var(--syntax-text-color)">.</span> <span style="color:var(--syntax-text-color)">.</span>
RUN npm run build

<span style="color:var(--syntax-comment-color)"># Runtime stage</span>
FROM node:14-alpine
WORKDIR /app
COPY <span style="color:var(--syntax-error-color)">--from</span><span style="color:var(--syntax-error-color)">=</span>build /app/dist ./dist
COPY package<span style="color:var(--syntax-declaration-color)">*</span>.json ./
RUN npm <span style="color:var(--syntax-text-color)">install</span> <span style="color:var(--syntax-error-color)">--only</span><span style="color:var(--syntax-error-color)">=</span>production
CMD <span style="color:var(--syntax-error-color)">[</span> <span style="color:var(--syntax-string-color)">"npm"</span>, <span style="color:var(--syntax-string-color)">"run"</span>, <span style="color:var(--syntax-string-color)">"start"</span> <span style="color:var(--syntax-error-color)">]</span>
</code></span></span>

揭秘多阶段 Docker 镜像

多阶段 Docker 镜像像一个协调良好的团队一样工作,每个阶段执行特定任务。在第一阶段,您可以使用 TypeScript 基础映像并包含您的源代码和构建工具。此阶段编译您的 TypeScript 代码并创建构建工件。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>FROM node:14 AS build
WORKDIR /app
COPY package<span style="color:var(--syntax-declaration-color)">*</span>.json ./
RUN npm <span style="color:var(--syntax-text-color)">install
</span>COPY <span style="color:var(--syntax-text-color)">.</span> <span style="color:var(--syntax-text-color)">.</span>
RUN npm run build
</code></span></span>

在下一阶段,您可以使用 Node.js 基础映像并仅复制运行前一阶段的应用程序所需的运行时依赖项。通过将运行时环境分开,您可以创建更小、更高效的 Docker 映像。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>FROM node:14-alpine
WORKDIR /app
COPY <span style="color:var(--syntax-error-color)">--from</span><span style="color:var(--syntax-error-color)">=</span>build /app/dist ./dist
COPY package<span style="color:var(--syntax-declaration-color)">*</span>.json ./
RUN npm <span style="color:var(--syntax-text-color)">install</span> <span style="color:var(--syntax-error-color)">--only</span><span style="color:var(--syntax-error-color)">=</span>production
CMD <span style="color:var(--syntax-error-color)">[</span> <span style="color:var(--syntax-string-color)">"npm"</span>, <span style="color:var(--syntax-string-color)">"run"</span>, <span style="color:var(--syntax-string-color)">"start"</span> <span style="color:var(--syntax-error-color)">]</span>
</code></span></span>

最后阶段可以创建可供部署的最终映像。最好的部分是什么?通过这种方法,您可以显着减小 Docker 映像的大小,从而更快、更轻松地部署 TypeScript 应用程序。

结论

多阶段 Docker 镜像的好处

它们具有许多优点,包括更小的图像尺寸、更快的构建、减少攻击面和提高可维护性。通过分离构建环境和运行时环境,您可以创建更精简、更高效的 Docker 映像,这些映像非常适合容器化您的应用程序。

最后的想法

多阶段 Docker 镜像对于具有复杂构建过程或大量依赖项的应用程序特别有用,例如 TypeScript 应用程序。它们在部署到 AWS Lambda或 Kubernetes 集群等无服务器平台时也表现出色,可实现轻松快速的管理。

猜你喜欢

转载自blog.csdn.net/jascl/article/details/131325637