鏡像(Image)是在基礎文件集(root filesystem)之上依次變動的集合,及在容器運行的默認執行參數。docker
鏡像由層(layer)組成。每一層都是若干文件的變動集合。層不包括環境變量或默認參數等元數據。這些元數據是鏡像總體的屬性,而不是特定層的。json
每一個鏡像的ID是其json描述文件的SHA256散列值,用十六進制編碼表示,如sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9
。
因爲JSON文件包含鏡像全部層的散列ID,據此計算出的ImageID,使得能夠對鏡像的即各層按內容尋址(Content Addressable,地址即各層的DiffID)。緩存
Tag是用戶爲ImageID指定的說明文字。Tag中的字符只能是大小寫字母、數字、短線、下劃線和點,即[a-zA-Z0-9_.-],首個字符不能是.或-。Tag不能超過127個字符。網絡
這裏的Repository
是指鏡像全名在冒號:
以前的部分,冒號:
以後的部分是鏡像的標籤(tag),用來區分鏡像的版本。 如名爲my-app:3.1.4
的鏡像,my-app
就是鏡像的 Repository 部分。
Repository又能夠用斜槓/
分隔開,/
以前的部分是可選的DNS格式的主機名。主機名必須符合DNS規則,但 不得 包含下劃線_
字符,主機名能夠有如:8080
格式的端口號。
鏡像名能夠包含小寫字符,數字和分隔符。 分隔符是句點.
,一個或兩個下劃線_
,或一個或多個短橫線-
,鏡像名 不容許 以分隔符開頭或結尾。app
經過Dockerfile能夠製做鏡像,經過優化Dockerfile中的指令,能夠減小鏡像的大小,按照一些規範來製做Dockerfile,能夠增長Dockerfile的可讀性與可維護性。curl
儘可能使用官方鏡像做爲基礎鏡像。post
\
將命令分紅多行。yum update
或apt upgrade
的命令。RUN apt update && apt install -y \
的方式保證每次製做鏡像時,都是安裝的最新的軟件包。...&& yum clean all
CMD指令設置鏡像中的默認啓動命令和參數。容器啓動以後,若是沒有加入任何啓動命令,則默認執行鏡像中的CMD設置的默認的啓動命令。性能
設置啓動命令時,應該儘可能使用json格式,如CMD ["command", "arg1", "arg2"]
.優化
經過ENTRYPOINT指令可設置鏡像的入口程序。當啓動主程序以前還須要執行大量的前置操做時,可將ENTRYPOINT的入口指令設置爲一個腳本entrypoint.sh
.編碼
如postgres的官方用法:
... ENTRYPOINT ["docker-entrypoint.sh"] CMD ["postgres"]
EXPOSE 8800:80
是沒有任何意義的ADD 與 COPY 都是將外部文件拷貝到鏡像內部的指令, 相比之下可能 ADD 的功能更增強大一下, 建議以下:
若是涉及到遠程文件, 建議使用 RUN curl
或 RUN wget
命令替代 ADD。
RUN cd /dir