最近實驗室項目需要使用Docker鏡像部署安裝tensorflow,為理解其原理,學習了Dockerfile指令相關知識。這里對學習筆記進行整理記錄。
1.什么是Dockerfile
使用Docker容器之前要先有鏡像,既可以通過Docker pull從官方遠程倉庫下載他人創建并上傳的鏡像,也可以自定義鏡像。Dockerfile就是用來自定義鏡像的描述性文件。編寫好Dockerfile后,通過Dokcer bulid命令便可將其創建為一個鏡像。
2.Dockerfile基本結構
Dokcerfile文件由一行行命令組成,通常一個Dokcerfile文件可以分為四個部分:指定基礎鏡像、指定維護者信息、指定對鏡像執行的命令,以及指定容器啟動時執行的命令。
3.Dockerfile指令
注釋:Dockerfile支持以#開頭的注釋語句。
FROM:用于指定基礎鏡像,必須在其他指令出現之前指定。比如FROM ubuntu 指定了ubuntu鏡像為基礎鏡像。除了可以指定官方遠程倉庫中的鏡像,也可以指定位于本地倉庫中的鏡像。
MAINTAINER:指定該Dockerfile的維護者信息。
RUN:用于對當前鏡像執行命令。(主要用于安裝軟件,所指定的命令必須被基礎鏡像所支持)可選的格式有RUN<command>和RUN [“executable”, “param1”,“param2”]。前者指定的命令會默認在shell終端中運行,后者可以比較靈活地指定在其他終端上運行命令。每條指令會在當前鏡像基礎上,覆蓋新的一層。當命令較長時可以使用“\”來換行。
CMD:指定容器啟動時執行的命令。若用戶啟動容器時已經指定用來運行的命令,則會覆蓋掉CMD指定的命令。另外,如果在Dockerfile中通過CMD指定了多條命令,只有最后一條命令會被執行。
EXPOSE:指定Docker容器對外暴露的端口。比如EXPOSE 80命令表示該Docker容器對外暴露80端口。在運行容器時,可以通過-P參數來為該端口綁定一個隨機分配的外部主機端口,也可以通過-p參數來具體指定一個外部主機端口與之綁定。當Docker內部端口與外部主機端口綁定后,便可通過該外部主機端口訪問Docker內部的服務。
ENV:指定環境變量。格式為ENV<key><value>,指定的環境變量會被后續RUN指令使用。
ADD:格式為ADD<src><dest>,該指令表示將復制指定的<src>到容器中的<dest>。其中<src>可以是Dockerfile所在目錄的一個相對路徑(文件或目錄);也可以是一個URL;或者是一個tar文件(自動解壓為目錄)。
COPY:格式為格式為COPY<src><dest>,與ADD指令相比,這里的<src>只能是Dokcerfile所在目錄的相對路徑(文件或目錄)。
ENTRYPOINT:和CMD指令一樣,指定容器啟動后執行的命令。唯一的不同是這里指定的命令不會被docker run提供的參數覆蓋?
VOLUME:格式為VOLUME [“/data”],該指令為容器創建一個數據卷,可被從本地主機目錄或文件掛載,也可將該容器作為數據卷容器,直接被其他容器掛載,從而實現兩個容器之間的數據共享。
USER:格式為USER daemon,該指令指定運行容器時的用戶名或UID,后續的RUN指令也會使用指定用戶。
WORKDIR:格式為WORKDIR /path/to/workdir,該指令為后續的RUN、CMD、ENTRYPOINT指令配置工作目錄。可以連續使用多個WORKDIR指令,后續命令如果參數是相對路徑,則會基于之前命令指定的路徑。
ONBUILD:格式為ONBUILD [INSTRUCTION]。當另外一個鏡像以當前鏡像為基礎鏡像編寫Dockerfile文件,并創建新鏡像時,該指令指定的命令會運行。
4.創建鏡像
編寫完成Dockerfile文件后,可以使用dokcer build命令將該Dockerfile文件創建為鏡像。基本格式為docker build [選項] 路徑。
5.Dockerfile技巧
1.合并命令
Dockerfile 中的每一個命令都會創建一個新的 layer,而一個容器能夠擁有的最多 layer 數是有限制的。所以應該在權衡可讀性的基礎上,盡量將邏輯上連貫的命令進行合并。比如可以將EXPOSE 80 和 EXPOSE 8080兩句命令合并為EXPOSE 80 8080,或者使用“&&”將多句RUN命令進行合并。
2.使用.dockerignore
當使用docker build命令創建鏡像時,該命令會讀取指定路徑下(包括子目錄)的Dokcerfile。為提高讀取效率,除了可將Dockerfile放置在空目錄下之外,也可以使用.dockerignore文件來讓Docker忽略路徑下指定的目錄和文件。
參考資料
《Dokcer技術入門與實戰》
http://blog.csdn.net/qinyushuang/article/details/43342553