Docker 鏡像建構之 Dockerfile
在 Docker 中建構鏡像最常用的方式,就是使用 <code>Dockerfile</code>。Dockerfile 是一個用來建構鏡像的文本檔案,文本内容包含了一條條建構鏡像所需的指令和說明。官方文檔:https://docs.docker.com/engine/reference/builder/
引入部分
二、Dockerfile 的保留字指令詳解
1.**FROM**
2.**MAINTAINER**
4.**RUN**
5.**EXPOSE**
6.**WORKDIR**
7.**ENV**
8.**ADD**
9.**COPY**
10.**VOLUME**
11.**CMD** (這個指令需放在最後)
12.ONBUILD
三、建構鏡像
關于 . 了解
四、Dockerfile實踐
五、鏡像建構曆史
六、使用建構的鏡像建立容器
七、Dockerfile 訓練
1.使用 centos7 作為基礎鏡像部署 nginx 服務
2.在容器中編譯安裝 nginx 服務
3.建構以 Centos 為依賴鏡像并安裝 Django 的服務
3.建構以 python 為依賴鏡像并安裝 Django 服務
4.使用 NGINX 代理 Django
什麼是 Dockerfile?
Dockerfile 是用來建構 Docker 鏡像的建構檔案, 是由一系列的指令和參數構成的腳本
通過指令的方式建構鏡像
Dockerfile 主體内容分為四部分:基礎鏡像資訊、 維護者資訊、 鏡像操作指令和容器啟動時執行指令。
建構Dockerfile步驟
編寫 Dockerfile 檔案
docker built 建構鏡像
docker run 建立容器
Dockfile 檔案的注意事項
Docker 以從上到下的順序運作 Dockerfile 的指令。為了指定基本映像,第一條指令必須是 FROM。
每條保留字指令都必須是大寫字母, 并且後面要跟随至少一個參數
指令按照從上到下的順序執行
每條指令可用 # 添加注釋
每條指令都會建立一個新鏡像層, 并對鏡像進行送出
dockerfile的保留字指令
主要保留指令:
<code>FROM</code>
<code>RUN</code>
<code>ADD</code>
<code>COPY</code>
<code>WORKDIR</code>
<code>CMD</code>
一般用以上保留字指令就可以完成容器想要的功能,所有字段如下。
指令
含義
FROM
指定基礎鏡像,必須為第一個指令
MAINTAINER
維護者資訊
RUN
建構鏡像docker build時執行的指令
ADD
将本地檔案添加到容器中,tar 類型檔案會自動解壓(網絡壓縮資源不會被解壓)
COPY
功能類似ADD,但是是不會自動解壓檔案,也不能通路網絡資源
CMD
在docker run時會執行的指令,如果存在多個則僅最後一個生效。
LABEL
用于為鏡像添加中繼資料
ENV
設定環境變量
EXPOSE
指定于外界互動的端口
VOLUME
用于指定持久化目錄
WORKDIR
工作目錄,類似于cd指令
ARG
用于指定傳遞給建構運作時的變量
ONBUILD
用于設定鏡像觸發器
基礎(依賴)鏡像, 就是目前要建立的鏡像是基于那個鏡像
基本文法如下:
指明鏡像維護者及其聯系方式(一般是郵箱位址)。官方說明已過時,推薦使用 LABEL。
3.LABEL
文法:<code>LABEL <key>=<value> <key>=<value> <key>=<value> ...</code>
功能是為鏡像指定标簽或為鏡像添加中繼資料。也可以使用 LABEL 來指定鏡像作者。
容器建構時需要運作的指令
暴露容器運作時的監聽端口給外部,可以指定端口是監聽 TCP 還是 UDP,如果未指定協定,則預設為 TCP。
指定建立容器後, 終端預設處在的工作目錄, 也就是落腳點,為 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 設定工作目錄。
用來在建構鏡像過程中設定環境變量
将主控端目錄下的檔案拷貝到鏡像裡面 (會自動解壓 tar 壓縮包),src 可以是一個本地檔案或者是一個本地壓縮檔案,壓縮檔案會自動解壓。還可以是一個 url,如果把 src 寫成一個 url,那麼 ADD 就類似于 wget 指令,然後自動下載下傳和解壓。
類似 ADD, 拷貝本地檔案到鏡像中 (不會自動解壓)
用于目錄挂載
指定容器啟動時要運作的指令
Dockerfile 檔案編寫好以後,真正建構鏡像時需要通過 <code>docker build</code> 指令。
<code>docker build</code> 指令用于使用 <code>Dockerfile</code> 建立鏡像。
<code>-f</code>:指定要使用的 Dockerfile 路徑;
<code>--tag, -t</code>:鏡像的名字及标簽,可以在一次建構中為一個鏡像設定多個标簽。
我們在使用 <code>docker build</code> 指令去建構鏡像時,往往會看到指令最後會有一個 <code>.</code> 号。它究竟是什麼意思呢?
很多人以為是用來指定 <code>Dockerfile</code> 檔案所在的位置的,但其實 <code>-f</code> 參數才是用來指定 <code>Dockerfile</code> 的路徑的,那麼 <code>.</code> 号究竟是用來做什麼的呢?
<code>Docker</code> 在運作時分為 <code>Docker 引擎(服務端守護程序)</code> 和 <code>用戶端工具</code>,我們日常使用各種 <code>docker 指令</code>,其實就是在使用 <code>用戶端工具</code> 與 <code>Docker 引擎</code> 進行互動。
當我們使用 <code>docker build</code> 指令來建構鏡像時,這個建構過程其實是在 <code>Docker 引擎</code> 中完成的,而不是在本機環境。如果在 <code>Dockerfile</code> 中使用了一些 <code>ADD</code> 等指令來操作檔案,如何讓 <code>Docker 引擎</code> 擷取到這些檔案呢?
這裡就有了一個 <code>鏡像建構上下文</code> 的概念,當建構的時候,由使用者指定建構鏡像時的上下文路徑,而 <code>docker build</code> 會将這個路徑下所有的檔案都打包上傳給 <code>Docker 引擎</code>,引擎内将這些内容展開後,就能擷取到上下文中的檔案了。
舉個栗子:我的主控端 jdk 檔案在 /root 目錄下,Dockerfile 檔案在 /usr/local/dockerfile 目錄下,檔案内容如下:
那麼建構鏡像時的指令就該這樣寫:
再舉個栗子:我的主控端 jdk 檔案和 Dockerfile 檔案都在 /usr/local/dockerfile 目錄下,檔案内容如下:
那麼建構鏡像時的指令則這樣寫:
接下來我們通過基礎鏡像 <code>centos:7</code>,在該鏡像中安裝 jdk 和 tomcat 以後将其制作為一個新的鏡像 <code>mycentos:7</code>。
建立目錄。
編寫 Dockerfile 檔案。
Dockerfile 檔案内容如下:
建構鏡像。

先建立一個 nginx.repo 檔案
建構鏡像
檢視剛剛建構的鏡像, 然後執行個體容器
檢視剛剛執行個體出的容器, 并進入到容器中
檢測 nginx 是否部署成功
編輯 Dockerfile 檔案
檢視是否建構成功,并執行個體出容器
檢視容器是否啟動成功, 并測試 nginx
首先建構一個Dockerfile檔案
檔案 shawn 的建構
檢視并使用鏡像執行個體化出容器
檢視剛開啟的容器,并進入容器啟動 Django 服務
使用浏覽器驗證一下
檔案 app 的建構
使用浏覽器檢驗一下
先建構一個 Django 服務, 步驟與上一個例子相同
改變了一下向外暴露的端口
然後來編寫 nginx 服務以及代理配置