使用 Docker 强化镜像

订阅: Docker 强化镜像

您可以像使用 Docker Hub 上的任何其他镜像一样使用 Docker 强化镜像 (DHI)。DHI 遵循同样熟悉的使用模式。您可以用 docker pull 拉取它们,在 Dockerfile 中引用它们,并用 docker run 运行容器。

关键区别在于 DHI 以安全为中心,并有意做到最小化以减少攻击面。这意味着某些变体不包含 shell 或包管理器,并且默认可能以非 root 用户身份运行。

注意

您无需更改现有的工作流程。无论您是手动拉取镜像、在 Dockerfile 中引用它们,还是将它们集成到 CI 流水线中,DHI 的工作方式都与您已在使用的镜像完全相同。

在将 DHI 镜像到您组织的命名空间后,该镜像便可供使用。要找到您的镜像仓库,请前往“强化镜像”目录中的原始镜像页面,然后选择在仓库中查看,以显示镜像仓库的列表。

采用 DHI 时的注意事项

Docker 强化镜像有意做到最小化以提高安全性。如果您正在更新现有的 Dockerfile 或框架以使用 DHI,请牢记以下注意事项:

特性详情
无 shell 或包管理器运行时镜像不包含 shell 或包管理器。在构建阶段使用 -dev-sdk 变体来运行 shell 命令或安装软件包,然后将产物复制到最小化的运行时镜像中。
非 root 运行时DHI 运行时默认以非 root 用户身份运行。请确保您的应用程序不需要特权访问,并且所有需要的文件对于非 root 用户都是可读和可执行的。
端口在旧版本的 Docker 或某些 Kubernetes 配置中,以非 root 用户身份运行的应用程序无法绑定到 1024 以下的端口。为确保兼容性,请使用 1024 以上的端口。
入口点DHI 可能不包含默认入口点,或者可能使用与您熟悉的原始镜像不同的入口点。请检查镜像配置并相应地更新您的 CMDENTRYPOINT 指令。
多阶段构建对于框架,请始终使用多阶段构建:一个 -dev 镜像用于构建或安装依赖项,一个最小化的运行时镜像用于最后阶段。
TLS 证书DHI 包含标准的 TLS 证书。您无需手动安装 CA 证书。

如果您正在迁移现有应用程序,请参阅迁移现有应用程序以使用 Docker 强化镜像

在 Dockerfile 中使用 DHI

要将 DHI 用作容器的基础镜像,请在 Dockerfile 的 FROM 指令中指定它:

FROM <your-namespace>/dhi-<image>:<tag>

将镜像名称和标签替换为您要使用的变体。例如,如果您在构建阶段需要 shell 或包管理器,请使用 -dev 标签:

FROM <your-namespace>/dhi-python:3.13-dev AS build

要了解如何浏览可用的变体,请参阅浏览镜像

提示

使用多阶段 Dockerfile 来分离构建和运行时阶段,在构建阶段使用 -dev 变体,在最终阶段使用最小化的运行时镜像。

从 Docker Hub 拉取 DHI

就像 Docker Hub 上的任何其他镜像一样,您可以使用 Docker CLI、Docker Hub Registry API 等工具或在您的 CI 流水线中拉取 Docker 强化镜像 (DHI)。

以下示例展示了如何使用 CLI 拉取 DHI:

$ docker pull <your-namespace>/dhi-<image>:<tag>

您必须有权访问 Docker Hub 命名空间中的镜像。有关更多信息,请参阅镜像一个 Docker 强化镜像

运行 DHI

拉取镜像后,您可以使用 docker run 来运行它。例如,假设仓库已镜像到您组织命名空间中的 dhi-python,启动一个容器并运行一个 Python 命令:

$ docker run --rm <your-namespace>/dhi-python:3.13 python -c "print('Hello from DHI')"

在 CI/CD 流水线中使用 DHI

Docker 强化镜像在您的 CI/CD 流水线中的工作方式与任何其他镜像完全相同。您可以在 Dockerfile 中引用它们,将它们作为流水线步骤的一部分拉取,或在构建和测试期间基于它们运行容器。

与典型的容器镜像不同,DHI 还包括签名的证明,例如 SBOM 和来源元数据。如果您的工具支持,您可以将这些信息整合到您的流水线中,以支持供应链安全、策略检查或审计要求。

为了加强您的软件供应链,请考虑在从 DHI 构建镜像时添加您自己的证明。这使您能够记录镜像是如何构建的,验证其完整性,并使用 Docker Scout 等工具启用下游验证和策略执行

要了解如何在构建过程中附加证明,请参阅 Docker Build Attestations

为已编译的可执行文件使用静态镜像

Docker 强化镜像包含一个 static 镜像仓库,专门用于在极其精简和安全的运行时中运行已编译的可执行文件。

在早期阶段使用 -dev 或其他构建器镜像来编译您的二进制文件,并将输出复制到 static 镜像中。

以下示例展示了一个多阶段 Dockerfile,它构建一个 Go 应用程序并在一个最小化的静态镜像中运行它:

#syntax=docker/dockerfile:1

FROM <your-namespace>/dhi-golang:1.22-dev AS build
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o myapp

FROM <your-namespace>/dhi-static:20230311
COPY --from=build /app/myapp /myapp
ENTRYPOINT ["/myapp"]

这种模式确保了一个强化的运行时环境,没有任何不必要的组件,从而将攻击面减至最低。

为基于框架的应用程序使用开发变体

如果您正在使用需要包管理器或构建工具(例如 Python、Node.js 或 Go)的框架构建应用程序,请在开发或构建阶段使用 -dev 变体。这些变体包含 shell、编译器和包管理器等基本实用程序,以支持本地迭代和 CI 工作流程。

在您的内部开发循环或隔离的 CI 阶段中使用 -dev 镜像,以最大限度地提高生产力。一旦您准备好为生产环境生成产物,请切换到更小的运行时变体,以减少攻击面和镜像大小。

以下示例展示了如何使用 -dev 变体构建 Python 应用程序,并使用更小的运行时变体来运行它:

#syntax=docker/dockerfile:1

FROM <your-namespace>/dhi-python:3.13-alpine3.21-dev AS builder

ENV LANG=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

WORKDIR /app

RUN python -m venv /app/venv
COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

FROM <your-namespace>/dhi-python:3.13-alpine3.21

WORKDIR /app

ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

COPY image.py image.png ./
COPY --from=builder /app/venv /app/venv

ENTRYPOINT [ "python", "/app/image.py" ]

这种模式将构建环境与运行时环境分开,通过从最终镜像中移除不必要的工具,有助于减小镜像大小并提高安全性。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.