如何用分层来改善Docker镜像的大小
在这篇文章中,我们将讨论用层来改善Docker镜像大小的各种方法和技术,包括多阶段构建、使用最小的基础镜像,以及使用带有预装包或预建二进制文件的基础镜像。通过遵循这些最佳实践,我们可以创建更小、更高效的Docker镜像,并对性能和可扩展性进行优化。
带层的Docker镜像的大小可以通过下面给出的各种方法来改善。
方法
- 使用最小的基础图像
-
使用带有预建二进制文件的基本图像
-
使用多阶段构建
-
使用带有预装包的基础镜像
让我们用例子来讨论这些方法。
使用最小的基础图像
通过选择一个只包含必要的库和依赖性的基础图像,可以减少图像的整体尺寸。例如,利用阿尔卑斯山的图片作为基础图像,而不是像Ubuntu那样的全功能基础图像,可以减少最终图像的大小。
示例
第1步 – 为你的项目创建一个新的目录,并导航到该目录 —
$ mkdir directoryname
$ cd directoryname
第2步 在这个新的目录中,有以下内容 –
FROM alpine:latest
RUN apk add --no-cache curl
CMD ["curl", "-s", ["http://example.com"](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.js应用程序而不必从源代码中创建它们,”node “镜像提供了 “node “和 “npm “可执行文件的预建版本。
示例
第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可执行文件的预建版本。
使用多阶段构建
通过多阶段构建,你可以通过在你的Docker文件中使用各种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)相比,明显要小。
使用带有预装包的基础镜像
一些基础镜像可能包含了一组预装包,这可以帮助最小化镜像的层数和总大小。为了创建Go应用程序而不必手动安装这些软件包,例如,golang镜像包含了各种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,其中包括预装的Go软件包和来自golang镜像的库。
结论
在这篇文章中,我们探索了一些使用层来减少Docker镜像的大小的方法。我们可以通过使用多阶段构建、挑选最小的基础镜像、使用带有预装包的基础镜像以及使用带有预建二进制文件的基础镜像,来产生更小的Docker镜像,并对性能和效率进行优化。