最近實驗室項目需要使用Docker鏡像部署安裝tensorflow畔派,為理解其原理,學習了Dockerfile指令相關知識。這里對學習筆記進行整理記錄速兔。
1.什么是Dockerfile
使用Docker容器之前要先有鏡像坛怪,既可以通過Docker pull從官方遠程倉庫下載他人創(chuàng)建并上傳的鏡像淤齐,也可以自定義鏡像。Dockerfile就是用來自定義鏡像的描述性文件袜匿。編寫好Dockerfile后更啄,通過Dokcer bulid命令便可將其創(chuàng)建為一個鏡像。
2.Dockerfile基本結構
Dokcerfile文件由一行行命令組成居灯,通常一個Dokcerfile文件可以分為四個部分:指定基礎鏡像祭务、指定維護者信息、指定對鏡像執(zhí)行的命令穆壕,以及指定容器啟動時執(zhí)行的命令待牵。
3.Dockerfile指令
注釋:Dockerfile支持以#開頭的注釋語句。
FROM:用于指定基礎鏡像喇勋,必須在其他指令出現(xiàn)之前指定缨该。比如FROM ubuntu 指定了ubuntu鏡像為基礎鏡像。除了可以指定官方遠程倉庫中的鏡像川背,也可以指定位于本地倉庫中的鏡像贰拿。
MAINTAINER:指定該Dockerfile的維護者信息。
RUN:用于對當前鏡像執(zhí)行命令熄云。(主要用于安裝軟件膨更,所指定的命令必須被基礎鏡像所支持)可選的格式有RUN<command>和RUN [“executable”, “param1”,“param2”]。前者指定的命令會默認在shell終端中運行缴允,后者可以比較靈活地指定在其他終端上運行命令荚守。每條指令會在當前鏡像基礎上珍德,覆蓋新的一層。當命令較長時可以使用“\”來換行矗漾。
CMD:指定容器啟動時執(zhí)行的命令锈候。若用戶啟動容器時已經指定用來運行的命令,則會覆蓋掉CMD指定的命令敞贡。另外泵琳,如果在Dockerfile中通過CMD指定了多條命令,只有最后一條命令會被執(zhí)行誊役。
EXPOSE:指定Docker容器對外暴露的端口获列。比如EXPOSE 80命令表示該Docker容器對外暴露80端口。在運行容器時蛔垢,可以通過-P參數(shù)來為該端口綁定一個隨機分配的外部主機端口击孩,也可以通過-p參數(shù)來具體指定一個外部主機端口與之綁定。當Docker內部端口與外部主機端口綁定后啦桌,便可通過該外部主機端口訪問Docker內部的服務溯壶。
ENV:指定環(huán)境變量。格式為ENV<key><value>甫男,指定的環(huán)境變量會被后續(xù)RUN指令使用且改。
ADD:格式為ADD<src><dest>,該指令表示將復制指定的<src>到容器中的<dest>板驳。其中<src>可以是Dockerfile所在目錄的一個相對路徑(文件或目錄)又跛;也可以是一個URL;或者是一個tar文件(自動解壓為目錄)若治。
COPY:格式為格式為COPY<src><dest>慨蓝,與ADD指令相比,這里的<src>只能是Dokcerfile所在目錄的相對路徑(文件或目錄)端幼。
ENTRYPOINT:和CMD指令一樣礼烈,指定容器啟動后執(zhí)行的命令。唯一的不同是這里指定的命令不會被docker run提供的參數(shù)覆蓋婆跑?
VOLUME:格式為VOLUME [“/data”]此熬,該指令為容器創(chuàng)建一個數(shù)據(jù)卷,可被從本地主機目錄或文件掛載滑进,也可將該容器作為數(shù)據(jù)卷容器犀忱,直接被其他容器掛載,從而實現(xiàn)兩個容器之間的數(shù)據(jù)共享扶关。
USER:格式為USER daemon阴汇,該指令指定運行容器時的用戶名或UID,后續(xù)的RUN指令也會使用指定用戶节槐。
WORKDIR:格式為WORKDIR /path/to/workdir搀庶,該指令為后續(xù)的RUN拐纱、CMD、ENTRYPOINT指令配置工作目錄哥倔〈撩担可以連續(xù)使用多個WORKDIR指令,后續(xù)命令如果參數(shù)是相對路徑未斑,則會基于之前命令指定的路徑。
ONBUILD:格式為ONBUILD [INSTRUCTION]币绩。當另外一個鏡像以當前鏡像為基礎鏡像編寫Dockerfile文件蜡秽,并創(chuàng)建新鏡像時,該指令指定的命令會運行缆镣。
4.創(chuàng)建鏡像
編寫完成Dockerfile文件后芽突,可以使用dokcer build命令將該Dockerfile文件創(chuàng)建為鏡像《埃基本格式為docker build [選項] 路徑寞蚌。
5.Dockerfile技巧
1.合并命令
Dockerfile 中的每一個命令都會創(chuàng)建一個新的 layer,而一個容器能夠擁有的最多 layer 數(shù)是有限制的钠糊。所以應該在權衡可讀性的基礎上挟秤,盡量將邏輯上連貫的命令進行合并。比如可以將EXPOSE 80 和 EXPOSE 8080兩句命令合并為EXPOSE 80 8080抄伍,或者使用“&&”將多句RUN命令進行合并艘刚。
2.使用.dockerignore
當使用docker build命令創(chuàng)建鏡像時,該命令會讀取指定路徑下(包括子目錄)的Dokcerfile截珍。為提高讀取效率攀甚,除了可將Dockerfile放置在空目錄下之外,也可以使用.dockerignore文件來讓Docker忽略路徑下指定的目錄和文件岗喉。
參考資料
《Dokcer技術入門與實戰(zhàn)》
http://blog.csdn.net/qinyushuang/article/details/43342553