基础镜像
大多数 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` 的可执行二进制文件存在于 构建上下文 的根目录中。您可以使用以下 `docker build` 命令构建此 Docker 镜像
$ 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 的更多信息,请参阅: