如何利用层优化Docker镜像大小
在本文中,我们将讨论多种利用层改进Docker镜像大小的方法和技术,包括多阶段构建、使用最小化基础镜像以及使用预装包或预构建二进制文件的基础镜像。通过遵循这些最佳实践,我们可以创建更小、更高效的Docker镜像,这些镜像针对性能和可扩展性进行了优化。
Docker分层镜像的大小可以通过以下多种方法改进。
方法
使用最小化基础镜像
使用包含预构建二进制文件的基础镜像
使用多阶段构建
使用包含预安装包的基础镜像
让我们用示例来讨论这些方法。
使用最小化基础镜像
通过选择仅包含必要库和依赖项的基础镜像,可以减小镜像的整体大小。例如,使用alpine镜像作为基础镜像,而不是使用Ubuntu等功能齐全的基础镜像,可以减小最终镜像的大小。
以下是示例的逐步操作方法:
示例
步骤1 - 为您的项目创建一个新目录并导航到它:
$ mkdir directoryname $ cd directoryname
步骤2 - 在这个新目录中创建一个名为“Dockerfile”的文件,内容如下:
FROM alpine:latest RUN apk add --no-cache curl CMD ["curl", "-s", "http://example.com"]
步骤3 - 通过在终端运行以下命令来构建镜像:
$ docker build -t alpine-curl
步骤4 - 要查看最终镜像大小,请在终端中运行以下命令:
$ docker images
使用alpine之类的最小化基础镜像时,最终镜像大小将明显更小,因为它仅包含必要的库和依赖项。
输出
REPOSITORY TAG IMAGE ID CREATED SIZE alpine-curl latest eecb6a9f6ab7 3 minutes ago 5.56MB
在这个示例中,最终镜像大小为5.56MB,这与使用Ubuntu等功能齐全的基础镜像相比要小得多。
使用包含预构建二进制文件的基础镜像
一些基础镜像包含预构建的二进制可执行文件,这对于无需从头开始构建即可运行应用程序可能很有用。例如,“node”镜像提供了“node”和“npm”可执行文件的预构建版本,以便无需从源代码构建即可运行Node.js应用程序。
以下是示例的逐步操作方法:
示例
步骤1 - 为您的项目创建一个新目录并导航到它:
$ mkdir directoryname $ cd directoryname
步骤2 - 在这个新目录中创建一个名为“Dockerfile”的文件,内容如下:
FROM node:latest WORKDIR /app COPY . . RUN npm install CMD ["node", "index.js"]
步骤3 - 通过在终端运行以下命令来构建镜像:
$ docker build -t node-app .
步骤4 - 要查看最终镜像大小,请在终端中运行以下命令:
$ docker images
使用包含预构建二进制文件的基础镜像可以减少层数和镜像的整体大小,因为您无需从源代码构建可执行文件。
输出
REPOSITORY TAG IMAGE ID CREATED SIZE node-app latest c9f6a1be6ee1 3 minutes ago 961MB
在这个示例中,最终镜像大小为961MB,其中包括node和npm可执行文件的预构建版本。
使用多阶段构建
通过多阶段构建,您可以通过在Dockerfile中使用多个FROM命令来创建具有不同层集的多个中间镜像。然后,您可以仅使用最终应用程序所需的层来构建最终镜像,从而减小整体镜像大小。
以下是逐步操作示例:
示例
步骤1 - 为您的项目创建一个新目录并导航到它。
步骤2 - 在这个新目录中创建一个名为“Dockerfile”的文件,内容如下:
FROM golang:latest as builder WORKDIR /app COPY . . RUN go build -o main . FROM alpine:latest RUN apk add --no-cache ca-certificates COPY --from=builder /app/main /app/main CMD ["/app/main"]
步骤3 - 通过在终端运行以下命令来构建镜像:
$ docker build -t multi-stage-build .
步骤4 - 要查看最终镜像大小,请在终端中运行以下命令:
$ docker images
多阶段构建允许您创建多个具有不同层集的中间镜像,然后仅使用必要的层来构建最终镜像,从而缩小整体镜像大小。
输出
REPOSITORY TAG IMAGE ID CREATED SIZE multi-stage-build latest 0d3b3c0e928f 4 minutes ago 5.57MB
在这个示例中,最终镜像大小为5.57MB,与使用golang等功能齐全的基础镜像的单阶段构建相比要小得多。
使用包含预安装包的基础镜像
一些基础镜像可能包含一组预安装的包,这有助于减少层数和镜像的总大小。例如,golang镜像包含各种Go包和库,以便无需手动安装这些包即可构建Go应用程序。
以下是逐步操作示例:
示例
步骤1 - 为您的项目创建一个新目录并导航到它。
步骤2 - 在这个新目录中创建一个名为“Dockerfile”的文件,内容如下:
FROM golang:latest WORKDIR /app COPY . . RUN go build -o main . CMD ["/app/main"]
步骤3 - 通过在终端运行以下命令来构建镜像:
$ docker build -t golang-app .
步骤4 - 要查看最终镜像大小,请在终端中运行以下命令:
$ docker images
使用包含预安装包的基础镜像可以减少层数和镜像的整体大小,因为您无需手动安装这些包。
输出
REPOSITORY TAG IMAGE ID CREATED SIZE golang-app latest c45a0c0aec2c 4 minutes ago 824MB
在这个示例中,最终镜像大小为824MB,其中包括来自golang镜像的预安装Go包和库。
结论
在本文中,我们探讨了使用层减小Docker镜像大小的多种方法。通过使用多阶段构建、选择最小化基础镜像、使用包含预安装包的基础镜像以及使用包含预构建二进制文件的基础镜像,我们可以创建更小、针对性能和效率优化的Docker镜像。