天天看點

6. Dockerfile詳解

一、Dockerfile 概念

Docker 鏡像是一個特殊的檔案系統,除了提供容器運作時所需的程式、庫、資源、配置等檔案外,還包含了一些為運作時準備的一些配置參數(如匿名卷、環境變量、使用者等)。鏡像不包含任何動态資料,其内容在建構之後也不會被改變。

鏡像的定制實際上就是定制每一層所添加的配置、檔案。如果我們可以把每一層修改、安裝、建構、操作的指令都寫入一個腳本,用這個腳本來建構、定制鏡像,那麼之前提及的無法重複的問題、鏡像建構透明性的問題、體積的問題就都會解決。這個腳本就是 Dockerfile。

Dockerfile 是一個文本檔案,其内包含了一條條的指令(Instruction),每一條指令建構一層,是以每一條指令的内容,就是描述該層應當如何建構。有了 Dockerfile,當我們需要定制自己額外的需求時,隻需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲指令的麻煩。

先來看一下我們最常用的centos的Dockerfile

在hub.docker.com中所有centos

含義:

1. 每條保留字指令都必須為大寫字母且後面要跟随至少一個參數

2. 指令按照順序, 從上到下, 一條指令就是一層

3. #表示注釋

4. 每條指令都會建立一個新的鏡像層, 并對鏡像進行送出

1. docker從基礎鏡像運作一個容器

2. 執行一條指令并對容器修改

3. 執行類似docker commit的操作送出一個新的鏡像層

4. docker在基于剛送出的鏡像運作一個新容器

5. 執行dockerfile中的下一條指令直到所指令都執行完成

6. Dockerfile詳解

 二. Dockerfile案例

  Docker hub中99%的鏡像都是通過在base鏡像中安裝和配置需要的軟體建構出來的.

  最基礎的base鏡像是scratch, 這是所有鏡像的祖先

目标: 練習使用WORKDIR, FROM, EVN, RUN, CMD指令

以centos鏡像為例. 我們看

6. Dockerfile詳解

  1) 設定進入容器的目錄不是根目錄

  2) 為centos安裝vim和ifconfig指令

下面來詳細看看其含義

這個指令可以查詢鏡像建構的各個層

6. Dockerfile詳解

檢視tomcat的dockerfile. 

最後一行是啟動tomcat的指令. 是以, 我們運作tomcat鏡像的時候, 會啟動tomcat

6. Dockerfile詳解

下面, 我們在指令行中使用其他CMD指令. 按照規則, docker run中最後的參數将替換dockerfile中的參數

運作結果:

6. Dockerfile詳解

 沒有啟動tomcat,而是進入了檢視目前目錄的檔案.

我們來看一個案例, curl http://ip.cn 是查詢目前網絡資訊

第一步: 編寫一個dockerfile

第二步: 建構dockerfile

6. Dockerfile詳解

第三步: 運作容器

運作結果

第四步: 我們還想檢視header. 于是追加一個參數-i即可

如果使用CMD就會以docker run中的指令替換dockerfile, 這時我們應該使用ENTRYPOINT.

重新build, 然後在docker run啟動的時候增加 -i指令

檔案名叫Dockerfile. 固定叫法

檔案内容如下

domo-docker: 是生成的新的docker鏡像的名字. 

. 表示的是檔案生成在目前目錄

建構的時候, 首先會判斷基礎鏡像是否存在, 如果不存在, 則下載下傳

6. Dockerfile詳解
6. Dockerfile詳解

 我們看到生産了一個64.2M的鏡像. 版本定義了一個最新版本

6. Dockerfile詳解

 運作鏡像, 列印輸出hello docker

以上我們就自己定義了一個dockerfile,并運作起來了.

6. Dockerfile詳解
6. Dockerfile詳解

練習COPY ADD指令

 按照如下操作執行

touch c.txt

apache-tomcat-9.0.8.tar.gz

jdk.tar.gz

其中後兩個檔案是tomcat和jdk的壓縮包, 我們提前下載下傳好,放到檔案夾裡即可. 如下圖所示:

6. Dockerfile詳解

繼續閱讀