使用 Docker 硬化映像檔 (DHI)

訂閱: Docker 硬化映像檔

您可以像使用 Docker Hub 上的任何其他映像檔一樣使用 Docker 硬化映像檔 (DHI)。DHI 遵循您熟悉的相同使用模式。請使用 docker pull 拉取它們,在 Dockerfile 中參照它們,並使用 docker run 執行容器。

主要區別在於 DHI 是以安全性為中心,並刻意保持簡潔以減少攻擊面。這意味著某些變體不包含 shell 或套件管理器,並且預設情況下可能以非 root 使用者身分執行。

注意

您不需要更改現有的工作流程。無論您是手動拉取映像檔、在 Dockerfile 中參照它們,還是將它們整合到 CI 管線中,DHI 的運作方式都與您現有的映像檔完全相同。

將 DHI 鏡像 (mirror) 到您組織的命名空間後,該映像檔即可使用。若要尋找您的鏡像儲存庫,請前往硬化映像檔目錄中原始映像檔的頁面,然後選擇在儲存庫中檢視 (View in repository),即可顯示鏡像儲存庫的清單。

採用 DHI 時的考量事項

Docker 硬化映像檔刻意保持簡潔以提高安全性。如果您要更新現有的 Dockerfile 或框架以使用 DHI,請記住以下考量事項:

功能詳細資料
無 shell 或套件管理器執行階段映像檔不包含 shell 或套件管理器。請在建置階段使用 -dev-sdk 變體來執行 shell 指令或安裝套件,然後將構件 (artifacts) 複製到簡潔的執行階段映像檔中。
非 root 執行階段執行階段 DHI 預設以非 root 使用者身分執行。請確保您的應用程式不需要特權存取,且所有必要的檔案都可由非 root 使用者讀取和執行。
連接埠在舊版本的 Docker 或某些 Kubernetes 設定中,以非 root 使用者身分執行的應用程式無法繫結至 1024 以下的連接埠。為了相容性,請使用 1024 以上的連接埠。
進入點 (Entry point)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 還包含已簽章的證明 (attestations),例如 SBOM 和來源中繼資料。如果您的工具支援,您可以將這些整合到您的管線中,以支援供應鏈安全、原則檢查或稽核要求。

為了加強您的軟體供應鏈,請考慮在從 DHI 建置映像檔時新增您自己的證明。這可讓您記錄映像檔的建置方式、驗證其完整性,並使用 Docker Scout 等工具啟用下游驗證和原則強制執行

若要了解如何在建置過程中附加證明,請參閱Docker 建置證明

為編譯後的執行檔使用靜態映像檔

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"]

此模式可確保有一個硬化的執行階段環境,其中不包含不必要的元件,將攻擊面降至最低。

為基於框架的應用程式使用開發 (dev) 變體

如果您建置的應用程式所使用的框架需要套件管理器或建置工具(例如 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.