之前我們介紹過通過容器建立鏡像以及通過模闆建立鏡像,除了這兩種方式之外,我們還可以通過Dockerfile去建立鏡像。
Dockerfile是由一系列指令和參數構成的腳本,這些指令應用于基礎鏡像并最終建立一個新的鏡像。它們簡化了從頭到尾的流程并極大的簡化了部署工作。Dockerfile從FROM指令開始,緊接着跟随者各種方法,指令和參數。其産出為一個新的可以用于建立容器的鏡像。
Dockerfile 文法
在我們深入讨論Dockerfile之前,讓我們快速過一下Dockerfile的文法和它們的意義。
什麼是文法?
非常簡單,在程式設計中,文法意味着一個調用指令,輸入參數去讓應用執行程式的文法結構。這些文法被規則或明或暗的限制。程式員遵循文法規範以和計算機 互動。如果一段程式文法不正确,計算機将無法識别。Dockerfile使用簡單的,清楚的和幹淨的文法結構,極為易于使用。這些文法可以自我釋義,支援注釋。
Dockerfile 文法示例:
Dockerfile文法由兩部分構成,注釋和指令+參數:
一個簡單的例子:
Dockerfile指令
Dockerfile有十幾條指令可用于建構鏡像,下文将簡略介紹這些指令:
1.FROM,該指令指定基于哪個基礎鏡像,因為你要指定一個基礎鏡像才能基于這個鏡像之上進行其他操作,因為你不可能憑空建立出一個鏡像吧,如果基礎鏡像沒有被發現,Docker将試圖從Docker image index來查找該鏡像,而且DockerFile第一條必須為From指令。如果同一個DockerFile建立多個鏡像時,可使用多個From指令(每個鏡像一次):
格式:
<code>FROM &lt;image&gt; 或者 FROM &lt;image&gt;:&lt;tag&gt;</code>
例如:
2.MAINTAINER,指定作者資訊:
<code>MAINTAIN &lt;name&gt;</code>
3.RUN,鏡像操作指令:
<code>RUN &lt;command&gt; 或者 RUN ["executable", "param1", "param2"]</code>
4.CMD ,有三種格式:
RUN和CMD看起來挺像,但是CMD隻能用來指定容器啟動時用到的指令,是以隻能有一條。例如:
5.EXPOSE ,這個是用來暴露端口的:
例如,我要将22、80、8443端口暴露出來:
這個用來指定要映射出去的端口,比如容器内部我們啟動了sshd和nginx,是以我們需要把22和80端口暴漏出去。這個需要配合-P(大寫)來工作,也就是說在啟動容器時,需要加上-P,讓它自動配置設定。如果想指定具體的端口,也可以使用-p(小寫)來指定。
6.ENV ,是用于定義環境變量的:
它主要是為後續的RUN指令提供一個環境變量,我們也可以定義一些自定義的變量:
7.ADD,可以将本地的一個檔案或目錄拷貝到容器的某個目錄裡。 其中src為Dockerfile所在目錄的相對路徑,它也可以是一個url:
8.COPY , 格式同ADD,文法格式和ADD一樣,不同的是,它不支援url。
9.ENTRYPOINT ,格式類似CMD:
容器啟動時要執行的指令,它和CMD很像,也是隻有一條生效,如果寫多個隻有最後一條有效。和CMD不同是:
CMD 是可以被 docker run 指令覆寫的,而ENTRYPOINT不能覆寫。比如,容器名字為test,我們在Dockerfile中指定如下CMD:
啟動容器的指令是 <code>docker run test</code> 這樣會輸出 testOne
假如啟動容器的指令是 <code>docker run -it test /bin/bash</code> 則什麼都不會輸出,因為 /bin/bash 把 /bin/echo testOne 給覆寫了。
而 ENTRYPOINT 則不會被覆寫,并且會比CMD或者docker run指定的指令要靠前執行:
則會輸出 testOne 123 ,這相當于要執行指令 echo testOne 123
10.VOLUME,這個是用來指定挂載點的:
VOLUME指令将建立一個可以從本地主機或其他容器挂載的挂載點,與我們之前使用的-v選項是一樣的。
11.USER , 指定運作容器的使用者:
12.WORKDIR ,指定指令的工作目錄:
為後續的RUN、CMD或者ENTRYPOINT執行的指令指定一個工作目錄。
以上簡單介紹了一下Dockerfile的一些指令以及格式,下面我們來實踐一下Dockerfile,通過Dockerfile來建立一個nginx的鏡像。
首先我這裡之前拉取了一個centos7的基礎鏡像,我就基于這個鏡像上來建立一個nginx環境的鏡像。
1.建立Dockerfile,編輯内容如下:
如果你本地的主控端上,已經有nginx配置檔案了,則可以把ADD更改為使用COPY來進行拷貝:
編輯完Dockerfile之後就可以通過Dockerfile來建立鏡像了:
2.建立鏡像:
指令說明:
build -t 指定通過Dockerfile來建立鏡像
centos_nginx 則是新鏡像的名稱
. 表示在目前路徑尋找Dockerfile
3.建立完成後,檢視一下我們建立的鏡像:
4.然後我們再把該容器的80端口映射到本地的81端口,這樣在外部也可以通路該容器的nginx服務了:
5.最後使用curl來測試一下是否能通過通路主控端的81端口來通路到容器的nginx服務:
<code>[root@server ~]# curl localhost:81</code>
<code></code>
<code>本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/2069879,如需轉載請自行聯系原作者</code>