[Docker] 客製化Docker Image

客製化屬於自己的Docker Image

前言

前一篇分享如何下載雲端的Image檔案,並且將它注入到Container執行。但有些特殊的情境,雲端上的模板沒辦法百分之百符合需求,就必須要客製化屬於自己的Image檔案,本篇要點如下

  • 使用Pull 的方式建立Image
  • 使用Dockerfile方式建立Image
  • Image的基本相關操作

 

站在前人的肩膀上向前邁進 (Pull)

利用Pull指令建立Image,這觀念跟Git有異曲同工之妙。透過Git開發新功能時,第一個動作就是先Pull新版的檔案,然後做一些更改之後,Commit變更,並加入註解和作者資訊。如果對Git操作已經很熟悉的話,以Pull的方式建立Image將會感到異常地親切。

那就來實作看看吧,打開PowerShell 輸入以下指令

docker run -t -i training/sinatra /bin/bash

畫面會停留在等待輸入指令列的狀態,此時我們試著更新Ruby。

apt-get install -y ruby2.0-dev

這裡會出現詳細的執行情形,要稍微等一下,等到它跳到等待命令的狀態時,再輸入exit跳出,就完成了更新Container的動作。接下來要把變更後的Container內容封裝成Image,這裡需要Container ID,可透過docker ps指令取得

將Container ID複製起來,等會會用到,接著透過commit指令建立Image,指令可參考下方

docker commit -m "Update Ruby" -a "Hank Chen" eadc80cf90f1 hank\sinatra:v2

上面指令在commit之後可分為四個區塊

  • -m "Update Ruby" =>代表是註解資訊
  •  -a "Hank Chen" =>代表是作者資訊
  • eadc80cf90f1 => Container ID 透過docker ps 取得
  • hank/sinatra : v2  冒號前半段是Repository名稱,後半段是tag

Image建立完成之後,可透過docker images指令檢查

如果有出現剛剛建立的Image,就大功告成嚕。

 

Dockerfile客製化Image

第二種要介紹透過Dockerfile來客製化Image,透過Pull的確可以很快速建立起自己的Image,但因為有很多設定都是繼承而來的,所以多少還是會有無法掌控所有細節的感覺,而且繼承來的東西都是黑箱,難免會藏污納垢,唯有將所有內容都攤在陽光下,才能確保沒有魔鬼藏在細節裡。

使用Dockerfile,因為所有設定都是來自設定檔,因此彈性是最大的。那接下來就來實作一個簡單的dockerfile範例。

首先,先建立一個新資料夾,在資料夾內新增一個名為Dockerfile的檔案,並且把命令列目錄移到該資料夾。

Dockerfile檔案不可有任何附檔名。

檔案新增完成後如下圖所示。

命令列目錄移到該資料夾

接著打開Dockerfile檔案,可以直接用筆記本打開,貼上下列指令,按存檔。

FROM ubuntu:14.04
MAINTAINER Hank Chen <Hank@example.com>
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra
Dockerfile的內容格式 : 指示詞( FROM 、MAINTAINER、RUN etc....)必須要大寫  +  陳述式 

上方範例,Image來自(FROM) ubuntu ,維護人(MAINTAINER)是Hank Chen,並執行(RUN)兩個指令碼。

接著輸入指令

 docker build -t hank/sinatra:v3 .


此段指令分為兩個區塊,第一個參數"-t " 代表識別這個Image檔案是屬於hank/sinatra:v3,第二個" . "是代表在當前資料夾搜尋Dockerfile,所以前面才需要將命令列目錄移到Dockerfile所在的資料夾,當然也可以自行指定路徑。

執行完畢後,透過docker images指令確認是否成功建立Image,如出現下圖內容,代表已建立完成。

同場加映

為Image新增tag

docker tag 5db5f8471261 hank/sinatra:v5

移除建立的Image

docker tag 5db5f8471261 hank/sinatra:v3

由上圖可發現本來有v3和v5版本,現在只剩下v5。

 

將建立好的Image 推送到雲端

docker push hank/sinatra

這個跟git指令幾乎一樣,就不贅述。

 

結論

本篇談到如何建立起屬於自己的Image檔案,以及一些常用的Image操作。而Pull和Dockerfile產生Image的選擇,主要還是看需求而定,如果只是要簡單擴充既有的Image,利用Pull的方式可以很輕易達到;反過來說,假設要完全客製化的Image檔案,建議還是使用Dockfiler,可以完全掌控所有細節,且彈性也是最高的。

下一篇將談論Network container的設定。