編寫Dockerfile的最佳實踐
如果你想構建一個新的容器映象,你需要在一個名為Dockerfile的單獨文件中指定指令。這將允許開發者建立一個執行環境,並幫助他自動化流程並使其可重複。它提供了靈活性和可讀性,提高了問責制,並有助於輕鬆進行專案的版本控制。
毫無疑問,編寫Dockerfile是包含使用docker進行開發的專案中最重要的方面之一。但是,如果你要大規模部署專案,那麼編寫Dockerfile的方式可能會對專案的效能產生重大影響。
在我們深入分析如何高效地建立Dockerfile以幫助你提升專案效能之前,需要注意的是,任何docker映象的架構都可以被認為是一個分層結構,它包含一些可能從dockerhub拉取的基礎映象,以及在此基礎上對基礎映象的一些修改或新增新的映象。這種架構允許使用者重用拉取的docker映象,允許高效利用磁碟儲存,並允許快取docker構建過程。

因此,這裡有一些最佳實踐,可以幫助你提升docker專案的效能。
語句的順序很重要。
你需要以一種方式來排序你的步驟,使變化最少的語句先出現。這是因為當你更改或修改Dockerfile中的一行並使其快取失效時,後續行將由於這些更改而中斷。因此,你需要儘可能將變化最頻繁的行放在最後。
請看下面的例子。
FROM python:3 #set working directory WORKDIR /usr/src/myapp #copying all the files in the container COPY . . RUN apt-get -y update RUN apt-get -y install vim #specify the port number to be exposed EXPOSE 8887 # run the command CMD ["python3", "./file.py"]
這可以修改為 -
FROM python:3 #set working directory WORKDIR /usr/src/myapp RUN apt-get -y update RUN apt-get -y install vim #copying all the files in the container COPY . . #specify the port number to be exposed EXPOSE 8887 # run the command CMD ["python3", "./file.py"]
構建快取。
當你構建docker映象時,docker將嘗試逐一執行Dockerfile中的指令。在每個指令執行中,它都會在快取中查詢任何現有的映象層,如果不存在,它將建立一個新的映象層。現在,如果我們將build命令中的--no-cache選項設定為true,docker根本不使用快取,因此,對於每個指令,它都會嘗試構建一個新的映象層。
儘量避免安裝不必要的軟體包。
安裝不必要的軟體包只會增加構建時間並降低整體效能。因此,儘量只指定和安裝專案中實際需要的軟體包。一種有用的方法是透過在一個單獨的requirements.txt檔案中指定軟體包來安裝它們,然後執行以下命令。
RUN pip3 install -r requirements.txt
這有助於以更單獨和更精確的方式跟蹤你安裝的軟體包。
始終使用.dockerignore檔案。
類似於.gitignore,docker為其開發者提供了一個建立.dockerignore檔案的選項,該檔案有助於排除該檔案中提到的某些檔案或目錄。這有助於提高構建效能。
嘗試包含更具體的COPY語句。
你應該始終嘗試只將從你的目錄到docker容器中實際需要的檔案複製進去。這有助於避免快取失效。因為你在構建映象後對複製語句所做的任何更改都會破壞快取語句。
嘗試將所有可快取單元連結起來。
每個RUN語句都可以被認為是一個可快取單元。嘗試將所有RUN語句連結到單個語句中。此外,請確保連結過多語句很容易導致快取失效。
例如:
RUN apt-get -y update RUN apt-get -y install vim
可以寫成
RUN apt-get update \ && apt-get -y install vim
儘量避免不需要的軟體包依賴項。
在構建映象之前,嘗試刪除所有未使用的軟體包或依賴項。你可以使用--no-install-recommends標誌來實現這一點,該標誌將配置apt包管理器以不安裝冗餘包。
因此,這些是在建立Dockerfile時可以採取的一些措施,這些措施可以提高專案的效能,並幫助以更高的效率和靈活性的管理專案,同時允許開發者在多個專案中多次重用程式碼。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP