D&K 課程筆記10 Create Image
前面使用了幾個Container:
- hello-world
- busybox
- 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大寫
第二步:如前面所述,編輯出以下內容後儲存:
最後一步:執行建立docker image的指令docker build .
執行後就會得到一個image id:
此時就可以透過這個image id起一個redis-server的Container了
docker run {上述id}
以下說明上面透過Dockerfile完成的事項
首先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 .”這個指令做了什麼
上面這步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