Docker鏡像製做規範

Docker鏡像製做規範

鏡像(Image)是在基礎文件集(root filesystem)之上依次變動的集合,及在容器運行的默認執行參數。docker

術語

層(layer)

鏡像由層(layer)組成。每一層都是若干文件的變動集合。層不包括環境變量或默認參數等元數據。這些元數據是鏡像總體的屬性,而不是特定層的。json

ImageID

每一個鏡像的ID是其json描述文件的SHA256散列值,用十六進制編碼表示,如sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9
因爲JSON文件包含鏡像全部層的散列ID,據此計算出的ImageID,使得能夠對鏡像的即各層按內容尋址(Content Addressable,地址即各層的DiffID)。緩存

標籤(tag)

Tag是用戶爲ImageID指定的說明文字。Tag中的字符只能是大小寫字母、數字、短線、下劃線和點,即[a-zA-Z0-9_.-],首個字符不能是.或-。Tag不能超過127個字符。網絡

鏡像名(Repository)

這裏的Repository是指鏡像全名在冒號:以前的部分,冒號:以後的部分是鏡像的標籤(tag),用來區分鏡像的版本。 如名爲my-app:3.1.4的鏡像,my-app就是鏡像的 Repository 部分。
Repository又能夠用斜槓/分隔開,/以前的部分是可選的DNS格式的主機名。主機名必須符合DNS規則,但 不得 包含下劃線_字符,主機名能夠有如:8080格式的端口號。
鏡像名能夠包含小寫字符,數字和分隔符。 分隔符是句點.,一個或兩個下劃線_,或一個或多個短橫線-,鏡像名 不容許 以分隔符開頭或結尾。app

Dockerfile

經過Dockerfile能夠製做鏡像,經過優化Dockerfile中的指令,能夠減小鏡像的大小,按照一些規範來製做Dockerfile,能夠增長Dockerfile的可讀性與可維護性。curl

基本原則

  • 儘可能使用乾淨的目錄去製做精細,避免沒必要要的性能損耗。
  • 只安裝須要的包。爲了減小鏡像的體積和編譯時間,應避免安裝額外的、不須要的包。
  • 每一個容器只運行一個進程。
  • 減小鏡像層。Dockerfile中的指令會生成新的鏡像層,一個鏡像最多127層。
  • 把多個參數排在不一樣的行中,提升可讀性。

FROM指令

儘可能使用官方鏡像做爲基礎鏡像。post

RUN指令

  • 從可讀性的角度考慮,使用RUN命令時,應使用\將命令分紅多行。
  • 避免更新基礎鏡像中的基礎軟件包,避免執行yum updateapt upgrade的命令。
  • 儘可能使用RUN apt update && apt install -y \的方式保證每次製做鏡像時,都是安裝的最新的軟件包。
  • 在安裝命令後,應清理緩存,減小鏡像的大小,執行...&& yum clean all

CMD指令

CMD指令設置鏡像中的默認啓動命令和參數。容器啓動以後,若是沒有加入任何啓動命令,則默認執行鏡像中的CMD設置的默認的啓動命令。性能

設置啓動命令時,應該儘可能使用json格式,如CMD ["command", "arg1", "arg2"].優化

ENTRYPOINT指令

經過ENTRYPOINT指令可設置鏡像的入口程序。當啓動主程序以前還須要執行大量的前置操做時,可將ENTRYPOINT的入口指令設置爲一個腳本entrypoint.sh.編碼

如postgres的官方用法:

...
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]

EXPOSE指令

  • EXPOSE 用來聲明將來容器內須要監聽的端口, 在 bridge 模式下, 這些容器內部的端口會映射到宿主機的端口上, 建議在容器內部不要更改應用原生的端口號
  • EXPOSE 中只能指定將來容器內部須要暴露的端口, 不能指定將來容器外部與內部端口之間的映射關係, 好比設置 EXPOSE 8800:80 是沒有任何意義的

ADD與COPY指令

ADD 與 COPY 都是將外部文件拷貝到鏡像內部的指令, 相比之下可能 ADD 的功能更增強大一下, 建議以下:

  • 儘可能不要拷貝遠程文件, 這樣也就用不着 ADD 的功能, 用 COPY 就能夠了。
  • 若是壓縮包拷貝進鏡像後, 不但願這個壓縮包被自動解壓縮, 用 COPY 就對了. 反之若是但願拷貝進鏡像以後就自動解壓作, 那就用 ADD 拷貝進去。

若是涉及到遠程文件, 建議使用 RUN curlRUN wget 命令替代 ADD。

WORKDIR指令

  • 儘可能使用絕對路徑
  • 切換目錄的時候儘可能使用 WORKDIR, 而不是使用 RUN cd /dir

Dockerfile構建鏡像總結

  • 減小鏡像的層數,儘可能把一些功能上面統一的命令合到一塊兒來作;
  • 注意清理鏡像構建的中間產物,好比一些安裝包在裝完以後就把它刪掉;
  • 注意優化網絡請求,使用yum源的時候,用一些網絡比較好的源站點,可節約時間,減小失敗率;
  • 儘可能去構建緩存,儘可能把一些不變的東西或者變更比較少的東西放在前面,由於不變的東西是能夠被緩存的;
  • 多階段進行鏡像構建。
相關文章
相關標籤/搜索