述
上文中,我們使用commit的方式創(chuàng)建了一個本地的鏡像,但是commit方式存在一些問題,比如不夠透明化,無法重復(fù),體積較大,為了解決這些問題,可以使用Dockerfile
Dockerfile是一個文本文件,其內(nèi)包含了一條條的指令(Instruction),每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建.
書寫規(guī)則
Dockerfile的指令是忽略大小寫的,建議使用大寫,使用#作為注釋,每一行只支持一條指令,每條指令可以攜帶多個參數(shù)
示例
先來看一個簡單的例子,首先找個空白目錄創(chuàng)建一個名為Dockerfile的文件,命令如下:
touch Dockerfile
編輯文件內(nèi)容,如下:
FROM nginx
MAINTAINER zhou "xxx@sina.com"
RUN echo 'hello docker!'>/usr/share/nginx/html/index.html
在這個Dockerfile中一共就三行,用到了三個指令,FROM,MAINTAINER和RUN
命令詳解
FROM
指定鏡像,這里表示已nginx為基礎(chǔ),在該鏡像的基礎(chǔ)上構(gòu)建
MAINTAINER
表示鏡像作者的信息,這命令可以不寫
RUN
RUN指令用來修改鏡像,算是使用比較頻繁的一個指令了,該指令可以用來安裝程序、安裝庫以及配置應(yīng)用程序等.
一個RUN指令執(zhí)行會在當(dāng)前鏡像的基礎(chǔ)上創(chuàng)建一個新的鏡像層,接下來的指令將在這個新的鏡像層上執(zhí)行.這里要注意,不要寫很多個RUN,否則會建立很多層,Union FS是有最大層數(shù)限制的,比如AUFS,曾經(jīng)是最大不得超過42層,現(xiàn)在是不得超過 127 層.
可以使用&&將各個所需執(zhí)行的命令串聯(lián)起來,而且Dockerfile 支持 Shell 類的行尾添加 \ 的命令換行方式
RUN語句有兩種不同的形式:shell格式和exec格式,本案例采用的shell格式,shell格式就像linux命令一樣,exec格式則是一個JSON數(shù)組,將命令放到數(shù)組中即可
構(gòu)建鏡像
在剛剛創(chuàng)建的Dockerfile的目錄下執(zhí)行下面的命令去構(gòu)建鏡像:
docker build -t zhou/nginx:v3 .
執(zhí)行結(jié)果如下:
從輸出結(jié)果中,就能清晰的看到鏡像的構(gòu)建過程. 構(gòu)建完成之后就可以用這個鏡像去運行容器了.
這里構(gòu)建命令的-t參數(shù),用來指定鏡像的命名空間,倉庫名以及TAG等信息
命令最后有一個.,指的是鏡像構(gòu)建上下文
官方的描述是這樣的:
Docker采用了C/S架構(gòu),分為Docker客戶端(Docker可執(zhí)行程序)與Docker守護進程,Docker客戶端
通過命令行和API的形式與Docker守護進程進行通信,Docker守護進程則提供Docker服務(wù)。因此,我
們操作的各種docker命令實際上都是由docker?客戶端發(fā)送到docker守護進程上去執(zhí)行。我們在構(gòu)建
一個鏡像時,不可避免的需要將一些本地文件拷貝到鏡像中,例如上文提到的COPY命令,用戶在構(gòu)建
鏡像時,需要指定構(gòu)建鏡像的上下文路徑(即前文的.),docker build在獲得這個路徑之后,會將路
徑下的所有內(nèi)容打包,然后上傳給Docker引擎。