如何在Docker中使用多級版本來創建較小,更安全的圖像?
如何在Docker中使用多級版本來創建較小,更安全的圖像?
Docker中的多級版本是一項功能,它允許您使用Dockerfile中的FROM
中的多個。每個FROM
都可以啟動構建過程的新階段,您可以將工件從一個階段複製到另一個階段。該方法對於通過將構建環境與運行時環境區分開來創建較小,更安全的Docker圖像特別有用。
這是您可以使用多階段構建來實現這一目標的方法:
-
定義構建階段:首先定義一個構建階段,在該階段中,您可以編譯應用程序或準備工件。例如,您可以使用
golang
圖像來編譯GO應用程序。<code class="Dockerfile">FROM golang:1.16 as builder WORKDIR /app COPY . . RUN go build -o myapp</code>
登入後複製 -
定義運行時階段:在構建階段之後,用最小的基本圖像定義運行時階段。僅將構建階段的必要工件複製到此運行時階段。
<code class="Dockerfile">FROM alpine:3.14 COPY --from=builder /app/myapp /myapp CMD ["/myapp"]</code>
登入後複製
通過使用多階段構建,您最終獲得了最終圖像,該圖像僅包含運行您的應用程序所需的內容,該應用程序要小得多,並且與用於構建的圖像相比,它具有更少的潛在漏洞。
在多階段碼頭版中組織代碼的最佳實踐是什麼?
在多階段的Docker構建中有效地組織代碼可以大大提高您的Dockerfile的效率和清晰度。以下是一些最佳實踐:
-
單獨的問題:將不同的階段用於不同的目的(例如,建築物,測試和部署)。這種關注的分離使您的Dockerfile更容易理解和維護。
<code class="Dockerfile"># Build stage FROM node:14 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # Test stage FROM node:14 as tester WORKDIR /app COPY --from=builder /app . RUN npm run test # Runtime stage FROM node:14-alpine WORKDIR /app COPY --from=builder /app/build /app/build CMD ["node", "app/build/index.js"]</code>
登入後複製 -
最小化層的數量:在可能的情況下組合運行命令以減少圖像中的層數。這種練習不僅加快了構建過程,而且還使結果圖像較小。
<code class="Dockerfile">RUN apt-get update && \ apt-get install -y some-package && \ rm -rf /var/lib/apt/lists/*</code>
登入後複製 -
使用
.dockerignore
:創建一個.dockerignore
文件,以排除不必要的文件被複製到Docker構建上下文中。這加快了構建過程並降低圖像大小。 -
優化複製操作:僅複製每個階段所需的文件。例如,在node.js應用程序的構建階段中,您可以首先複製
package.json
,運行npm install
,然後復制應用程序的其餘部分。 - 使用名稱階段:在您的階段給出有意義的名稱,以使Dockerfile易於閱讀和維護。
如何優化多階段Docker構建中的緩存以改善構建時間?
在多階段碼頭版中優化緩存可以大大減少構建時間。以下是實現這一目標的幾種策略:
-
操作順序:將經常更改的命令放在Dockerfile的盡頭。 Docker將從Dockerfile的開頭緩存層,從而加快後續構建。
<code class="Dockerfile">FROM node:14 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build</code>
登入後複製在此示例中,
npm install
更改可能性較小,因此已放置在COPY . .
命令。 - 使用多階段構建:每個階段都可以獨立緩存。這意味著您可以在每個階段利用構建緩存,從而節省後續版本的時間。
-
Leverage BuildKit :Docker BuildKit提供了改進的構建緩存機制。通過設置環境變量
DOCKER_BUILDKIT=1
啟用buildKit,然後使用新的RUN --mount
命令來安裝緩存目錄。<code class="Dockerfile"># syntax=docker/dockerfile:experimental FROM golang:1.16 as builder RUN --mount=type=cache,target=/root/.cache/go-build \ go build -o myapp</code>
登入後複製 -
最小化Docker構建上下文:使用
.dockerignore
文件將不必要的文件從構建上下文中排除。較小的上下文意味著更少的數據傳輸和更快的構建。 - 使用特定的基本圖像:使用輕質和穩定的基本圖像減少在構建過程中拉動基層所需的時間。
與單級版本相比,多階段碼頭版提供哪些安全益處?
與單級版本相比,多階段的Docker Build提供了一些安全優勢:
- 較小的圖像大小:通過僅將必要的工件從構建階段複製到運行時階段,多階段的構建會導致更小的最終圖像。較小的圖像具有降低的攻擊表面,因為它們包含較少的組件可能脆弱。
- 減少漏洞:由於最終圖像不包括構建工具或依賴性僅在構建過程中所需的依賴性,因此攻擊者在這些工具中利用漏洞的機會更少。
- 構建和運行時環境的隔離:多階段構建使您可以使用不同的基本圖像來構建和運行應用程序。構建環境可以更具允許性,並包括編譯或包裝所需的工具,而運行時環境可以更限制和優化安全性。
- 更容易的合規性:較小,更集中的圖像更容易掃描漏洞並確保遵守安全策略,從而更容易維護安全的環境。
- 限制秘密暴露:由於敏感數據(例如構建過程中使用的API密鑰)不需要包含在最終圖像中,因此多階段構建可以幫助防止在運行時環境中揭示秘密。
通過利用多階段構建,您可以顯著增強Docker圖像的安全姿勢,同時還可以優化其大小和性能。
以上是如何在Docker中使用多級版本來創建較小,更安全的圖像?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

退出 Docker 容器的四種方法:容器終端中使用 Ctrl D 快捷鍵容器終端中輸入 exit 命令宿主機終端中使用 docker stop <container_name> 命令宿主機終端中使用 docker kill <container_name> 命令(強制退出)

Docker 中將文件拷貝到外部主機的方法:使用 docker cp 命令:執行 docker cp [選項] <容器路徑> <主機路徑>。使用數據卷:在主機上創建目錄,在創建容器時使用 -v 參數掛載該目錄到容器內,實現文件雙向同步。

可以通過以下步驟查詢 Docker 容器名稱:列出所有容器(docker ps)。篩選容器列表(使用 grep 命令)。獲取容器名稱(位於 "NAMES" 列中)。

Docker 容器啟動步驟:拉取容器鏡像:運行 "docker pull [鏡像名稱]"。創建容器:使用 "docker create [選項] [鏡像名稱] [命令和參數]"。啟動容器:執行 "docker start [容器名稱或 ID]"。檢查容器狀態:通過 "docker ps" 驗證容器是否正在運行。

重啟 Docker 容器的方法:獲取容器 ID(docker ps);停止容器(docker stop <container_id>);啟動容器(docker start <container_id>);驗證重啟成功(docker ps)。其他方法:Docker Compose(docker-compose restart)或 Docker API(參考 Docker 文檔)。

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

在 Docker 中創建容器: 1. 拉取鏡像: docker pull [鏡像名] 2. 創建容器: docker run [選項] [鏡像名] [命令] 3. 啟動容器: docker start [容器名]
