基础镜像

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

FROM debian

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

创建基础镜像

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

FROM scratch

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

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

使用 scratch 创建最小基础镜像

矜持的、最小的scratchimage 作为 构建容器。使用scratch向构建过程发出镜像信号 您希望Dockerfile成为第一个文件系统 图层。

scratch出现在 Docker Hub 上的 Docker 存储库中, 您无法拉取、运行它或标记具有 name 的任何镜像scratch. 相反,您可以在Dockerfile. 例如,要使用scratch:

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

假设名为hello存在于 build 上下文的根目录中。 您可以使用以下内容构建此 Docker 镜像docker build命令:

$ docker build --tag hello .

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

$ docker run --rm hello

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

  • 编程语言运行时
  • 动态链接的 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 的更多信息,请参阅: