基础镜像

所有 Dockerfile 都从一个基础镜像开始。 基础镜像是你的镜像所扩展的镜像。 它指的是 Dockerfile 中的 FROM 指令的内容。

FROM debian

在大多数情况下,您无需创建自己的基础镜像。Docker Hub 包含大量适合用作构建基础镜像的 Docker 镜像。 Docker 官方镜像 特别设计为一组加固且经过实战考验的镜像,支持各种平台、语言和框架。此外还有 Docker 验证发布者镜像 ,由受信任的发布合作伙伴创建,并由 Docker 验证。

创建基础镜像

如果你需要完全控制镜像的内容,你可以从你选择的 Linux 发行版创建你自己的基础镜像,或者使用特殊的 FROM scratch 基础镜像:

FROM scratch

scratch 镜像通常用于创建仅包含应用程序所需内容的最小镜像。参见 使用 scratch 创建最小基础镜像

要创建一个发行版基础镜像,您可以使用一个打包为tar文件的根文件系统,并使用docker import将其导入到Docker中。创建您自己的基础镜像的过程取决于您想要打包的Linux发行版。请参阅 使用tar创建完整镜像

使用 scratch 创建最小基础镜像

预留的最小 scratch 镜像作为构建容器的起点。使用 scratch 镜像会向构建过程发出信号,表示您希望 Dockerfile 中的下一个命令成为镜像中的第一个文件系统层。

虽然 scratch 出现在 Docker 的 Docker Hub 上的仓库, 但你不能拉取、运行或使用名称 scratch 标记任何镜像。 相反,你可以在 Dockerfile 中引用它。 例如,使用 scratch 创建一个最小的容器:

# syntax=docker/dockerfile:1
FROM scratch
ADD hello /
CMD ["/hello"]

假设在构建上下文的根目录下存在一个名为 hello 的可执行Binaries。 您可以使用以下 docker build 命令构建此 Docker 镜像:

$ docker build --tag hello .

要运行您的新镜像,请使用 docker run 命令:

$ docker run --rm hello

此示例镜像只有在 hello Binaries没有任何运行时依赖项的情况下才能成功执行。计算机程序往往依赖于运行时环境中存在某些其他程序或资源。例如:

  • 编程语言运行时
  • 动态链接的 C 库
  • CA 证书

在构建基础镜像或任何镜像时,这是一个需要考虑的重要方面。这就是为什么使用 FROM scratch 创建基础镜像可能很困难,除非是针对小型、简单的程序。另一方面,在镜像中只包含你需要的内容也很重要,以减小镜像大小和攻击面。

使用 tar 创建完整镜像

一般来说,从一台正在运行的机器开始,该机器运行着您希望作为基础镜像的发行版,尽管对于像 Debian 的 Debootstrap 这样的工具来说并非必需,您也可以使用它来构建 Ubuntu 镜像。

例如,创建一个Ubuntu基础镜像:

$ sudo debootstrap focal focal > /dev/null
$ sudo tar -C focal -c . | docker import - focal

sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3

$ docker run focal cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"

Moby GitHub 仓库中可以找到更多用于创建基础镜像的示例脚本。

更多资源

有关构建镜像和编写 Dockerfile 的更多信息,请参阅: