使用 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 可能不包含預設入口點,或者可能使用與您熟悉的原始映象不同的入口點。請檢查映象配置並相應地更新您的 CMD 或 ENTRYPOINT 指令。 |
多階段構建 | 對於框架,請始終使用多階段構建:一個 -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" ]
這種模式將構建環境與執行時環境分開,透過從最終映象中移除不必要的工具,有助於減小映象大小並提高安全性。