基础镜像
所有 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 noble noble > /dev/null
$ sudo tar -C noble -c . | docker import - noble
sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3
$ docker run noble cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.2 LTS"在Moby GitHub 存储库中有更多创建基础镜像的示例脚本。
更多资源
有关构建镜像和编写 Dockerfile 的更多信息,请参阅: