D&K 課程筆記10 Create Image

Create Docker Images

ZONGRU Li
Oct 26, 2020

前面使用了幾個Container:

  1. hello-world
  2. busybox
  3. redis

以上幾個的image都是別人建立好放在公開的docker hub

而要自建立自己的image則需要先撰寫=>Dockerfile

透過Dockerfile轉交給docker client

docker client會將dockerfile提交給docker server

docker server再依據dockerfile的內容(i.e.Configuration)建立image

其中Dockerfile內容大致如下

首先自己建立一個可以起redis-server的image起來當作一個目標

第一步:先建立擺放Dockerfile的目錄叫redis-server,並切換到該目錄下

使用vi指令編輯一個Dockerfile,記得頭文字D大寫

第二步:如前面所述,編輯出以下內容後儲存:

alpine是個Linux系統環境

最後一步:執行建立docker image的指令docker build .

執行後就會得到一個image id:

此時就可以透過這個image id起一個redis-server的Container了

docker run {上述id}

以下說明上面透過Dockerfile完成的事項

基本拆解三個docker動作FROM,RUN,CMD

首先FROM告知要使用的基底(Base)的image

此處使用的Base image為alpine,裡面就是一個完整的Linux的系統環境

就好比要安裝各種應用程式軟體我們會需要window或Mac作業系統一樣

裡面提供各種預設執行程式,後面RUN中的apk指令就是包含在apline內

apk(Alpine Linux package manager)而並不是docker的內建指令

透過apline環境執行apk那行指令完成下載安裝redis

(好比你在隨身碟內有一個chrome.exe檔,你沒有作業系統的話根本執行不了)

有以上概念後回頭來看看”docker build .”這個指令做了什麼

1/3步完成下載apline的image
2/3步執行apk指令,過程中看到一個Container ID,後來這個ID的Container被移除

上面這步RUN看到在極短的時間內建立了一個臨時的Container,並立刻移除

更加細部的來說,是先起了一個alpine的Container

並執行完apk add --update redis (下載及安裝redis)後

(亦即此時這個alpine內才存在redis相關檔案在內)

完成這個含有redis檔案的Container的snapshot為一個暫時的image Id

才消滅這個Container

最後一步

一樣透過2/3完成的臨時的image id(86fce6219457)

起一個Container Id是acde91f76f52

最後將執行redis-server的命令設置到這個Container

再依據這個Container取snapshot後移除這個Container

上述snapshot拿到的就是最終image Id:b125b71d0cb9

簡單總結怎麼建image:

就是拿別的系統快照(snapshot)當基底,

起一個隔絕的獨立系統(Container)

裝你要裝的應用系統

再將其快照(snapshot)成新的快照

再把上述快照起一個新的隔絕的獨立系統(Container)

設置啟動時要做的命令後

再做成最終快照

最終快照的Id就是最終完成的image id

參考課程

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet