基础镜像

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

FROM debian

在大多数情况下,您无需创建自己的基础镜像。Docker 中心 包含适合用作基础的庞大 Docker 镜像库 image 中。Docker 官方镜像是专门设计为一组经过强化、经过实战检验的镜像,这些镜像 支持各种平台、语言和框架。还有 Docker Verified Publisher 镜像,由受信任的发布合作伙伴创建,并由 Docker 验证。

创建基础镜像

如果您需要完全控制镜像的内容,您可以创建 您自己的基础镜像,或使用 特殊基地:FROM scratch

FROM scratch

该镜像通常用于创建仅包含的最小镜像 正是应用程序所需要的。请参阅使用 scratch 创建最小基础镜像scratch

要创建分发基础镜像,您可以使用打包为 一个文件,然后使用 .流程 创建自己的基础镜像取决于要创建的 Linux 发行版 包。请参阅使用 tar 创建完整镜像tardocker import

使用 scratch 创建最小基础镜像

保留的最小镜像作为 构建容器。将镜像信号用于构建过程 您希望 中的下一个命令成为第一个文件系统 图层。scratchscratchDockerfile

虽然出现在 Docker Hub 上的 Docker 存储库中, 您无法提取它、运行它或标记名称为 . 相反,您可以在 . 例如,要使用 :scratchscratchDockerfilescratch

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

假设 build 上下文的根目录下存在名为 的可执行二进制文件。 您可以使用以下命令构建此 Docker 镜像:hellodocker build

$ docker build --tag hello .

要运行新镜像,请使用以下命令:docker run

$ docker run --rm hello

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

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

在构建基础镜像或任何镜像时,这是 考虑。这就是为什么使用 can 创建 base 镜像的原因 困难,除了小而简单的程序之外的任何事物。另一方面 在镜像中仅包含您需要的内容也很重要,以便 减小镜像大小和攻击面。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 的更多信息,请参阅: