Contents

您應該了解的 8 個 Docker 最佳實踐

要點

使用官方認可的 Docker 鏡像可以提供增強的安全性和性能,而構建自定義鏡像可能會導致配置不理想並延長構建時間。

為了緩解與不可預見的行為和依賴衝突相關的潛在問題,建議通過基於指定版本拉取和構建 Docker 映像的特定實例來使用它們。

使用“docker scan”命令對 Docker 鏡像進行全面分析,以確定其安全級別並確保它們滿足您的應用程序的要求。

Docker 已成為廣泛採用的容器化應用程序工具;然而,如果個人未能遵守既定的最佳實踐,其功效可能會受到影響。忽視此類準則可能會使系統面臨潛在的安全風險並影響整體性能。

為了有效利用 Docker 的功能,同時確保最佳安全性並創建組織良好的容器配置文件,請考慮實施這些推薦的策略。通過遵循這些最佳實踐,您將增強 Docker 的整體體驗並最大限度地減少應用程序中的潛在漏洞。

使用官方 Docker 鏡像

在容器化環境中部署應用程序時,必須使用 Docker 映像。有兩個主要選項可用於創建此映像-通過製作定製配置或利用 Docker 本身提供的預先存在的映像。

構建定制的視覺效果需要承擔處理所有相關配置的全部責任。舉例來說,在製作要與 Node.js 應用程序一起部署的映像時,有必要獲取並安裝 Node.js 和任何相關的必備組件。雖然這項工作可能很費力,並且可能導致設置不完整或錯誤,但它仍然提供了對最終產品的高度靈活性和控制。

Docker 建議您使用官方的 Node.js 鏡像,它附帶了所有正確的依賴項。 Docker鏡像具有更好的安全措施,輕量級,並且經過了各種環境的測試。您可以在 Docker 官方鏡像 頁面找到官方鏡像。

/bc/images/docker-official-images-page-1.jpg

使用特定版本的 Docker 鏡像

一般來說,拉取權威圖像需要獲取最新的標籤,該標籤表示該圖像的當前迭代。因此,使用此映像構建容器的每個實例都將導致前一個容器的獨特變體。

在應用程序的開發過程中使用各種不同的 Docker 鏡像迭代可能會導致不可預見的功能,因為這些不同的版本可能與補充要求發生衝突,並最終導致程序出現故障。

Docker 建議使用特定版本的鏡像進行拉取和構建,因為官方鏡像包含全面的文檔並迎合流行的應用場景。

不應執行諸如“docker pull alpine”之類的通用命令,這可能會導致使用未定義或不受支持的版本,而應指定特定版本,例如“docker pull alpine:3.18”。通過利用已知且受支持的映像版本,可以確保一致性並減少後續構建過程中的潛在問題。要獲取有關可用映像及其相應 Dockerfile 鏈接的信息,請參閱官方 Docker 映像存儲庫以了解更多詳細信息。

/bc/images/docker-images-various-tags-1.jpg

掃描圖像以查找安全漏洞

確保數字映像(例如 Docker 容器)不存在安全漏洞的一種方法是對其內容進行徹底掃描。此過程可以通過使用“docker scan”命令來完成,該命令利用特定語法來正確執行。

 docker scan [IMAGE] 

為了對Docker容器鏡像進行安全漏洞評估,需要對Docker平台進行認證和連接。

 docker login 

然後,通過使用 QR 碼掃描或在應用程序界面的相應字段中輸入其 URL,選擇您想要分析的特定圖像。

 docker scan ubuntu:latest 

/bc/images/results-of-scanning-a-docker-image.jpg

名為 Synk 的工具會掃描圖像,根據嚴重程度列出所有漏洞。您可以查看漏洞的類型以及相關信息的鏈接,包括如何修復它。您可以從掃描中判斷圖像對於您的應用程序來說是否足夠安全。

使用小尺寸 Docker 鏡像

獲取 Docker 映像後,它會附帶一系列預安裝的系統實用程序,這些實用程序會增加包含不必要工具的整體大小。

使用大量 Docker 快照會消耗大量存儲容量,並且由於容器化應用程序的大小增加,可能會降低容器化應用程序的運行效率。此外,這些較大的圖像增加了潛在安全漏洞的可能性。

通過利用基於 Alpine 的鏡像來優化 Docker 容器的尺寸是提高運營效率的可行策略。通過使用這些僅包含必需組件的簡約映像,您可以有效地最小化存儲需求,同時提高應用程序的快速且資源豐富的性能。

在 Docker 上可以找到一系列官方認可的 Alpine 描述,其中包括與 PostgreSQL 相關的示例。下面提供了與 PostgreSQL 相關的 Alpine 迭代的示例表示:

/bc/images/apline-image-versions-for-postgresql.jpg

優化緩存圖像層

Dockerfile 中的每個指令構成圖像圖形表示中的一個層。這些分層包含不同的實際應用並執行一系列任務。通過檢查 Docker Hub 託管的官方認可的存儲庫,人們可以辨別其創建過程中使用的指令。

Dockerfile 包含生成映像所需的所有組件,這是其比傳統虛擬機更受開發人員歡迎的重要原因。

下面展示了典型 Alpine 圖像的圖示,包括以下組件:

/bc/images/alpine-image-layers-1.jpg

當使用圖像作為構建應用程序的基礎時,會在其上引入附加層。在 Dockerfile 中執行命令的過程是從上到下進行的,其中任何更改都需要 Docker 重建後續層。

為了優化容器化過程的效率和一致性,建議以這樣的方式構建 Dockerfile:首先列出最不可變的組件,然後列出可變性較高的組件。因此,靜態配置(例如安裝)應位於文件開頭附近,以便於維護和可重複性。

Docker 利用分層的概念,通過僅從修改的文件構建鏡像來優化構建性能。由於每個層都是在其前一層的基礎上創建的,因此任何未更改的文件都會緩存在圖像之上,從而加快依賴這些未修改元素的後續操作。這種方法不僅減少了冗餘,還提高了施工過程的整體效率。

/bc/images/how-to-arrange-instructions-in-dockerfile.jpg

請觀察上圖中的插圖。在這種情況下,如果對應用程序文件進行更改,Docker 將根據這些更改啟動其構建過程,從而無需額外安裝 npm 包。

與啟動所有後續層的全新重建相比,合併現有圖像作為構建的基礎可以加快整個過程。此外,緩存還提高了處理容器鏡像時在 Docker Hub 上執行拉取和推送操作的速率。

使用.dockerignore 文件

當使用 Dockerfile 構建鏡像時,可以想像,人們可能希望維護與項目相關的特定數據的機密性。某些文件和目錄可能會在工作中佔據顯著位置,但不一定需要在構建階段納入。

使用.dockerignore 文件可以顯著減小映像的大小,因為它僅包含構建階段所需的組件。此外,這種方法可以防止機密密鑰和密碼等敏感信息的無意洩露,從而有助於保護這些信息。

“.dockerignore”文件是一個基於文本的配置文件,與“Dockerfile”位於同一目錄中。與.gitignore 文件類似,它包含文件名或模式列表,指定在構建 Docker 映像時容器化過程中不應包含的文件。

這是一個例子:

/bc/images/contents-of-a-docker-ignorefile.jpg

使用最小特權用戶原則

Docker默認使用root用戶來執行其容器操作的管理權限;然而,堅持這種做法會帶來安全風險。如果容器內存在任何漏洞,未經授權的入侵者可能會獲得對 Docker 主機的訪問權限。

為了防止潛在的安全漏洞,建議建立一個具有特定權限的單獨帳戶來訪問受限數據。通過這樣做,我們可以限制對機密材料的未經授權的訪問,同時保持項目的完整性。此外,如果個人的憑據受到威脅,我們可以靈活地撤銷他們的訪問權限,而不會影響其他用戶或項目。

下面的插圖演示了創建用戶帳戶並指定其訪問權限的過程:

/bc/images/creating-user-and-user-group-in-docker.jpg

某些基本映像具有嵌入其中的傳真用戶,允許使用預安裝的用戶憑據,而不需要通過 root 帳戶及其附帶權限進行訪問。

為什麼您應該採用 Docker 的最佳實踐

實施最佳實踐是最大程度地減少安全漏洞並在 Docker 中生成更精簡、結構良好的代碼的有效方法。多種最佳實踐可以應用於應用程序中使用的 Docker 功能的各個方面。

結構化項目有助於與其他編排平台(例如 Kubernetes)無縫集成。本文中提供的項目計劃大綱可作為您精通 Docker 之旅的起點,允許根據需要進一步擴展和定制。