Docker 提供了兩種構(gòu)建鏡像的方法:
docker commit 命令
過程:運行容器——修改容器——保存為新的鏡像
docker commit oldname newname
Dockerfile 構(gòu)建鏡像
Dockerfile 是一個文本文件饰豺,記錄了鏡像構(gòu)建的所有步驟。
1.當(dāng)前目錄為/root
2.編寫Dockerfile文件
3.編譯鏡像
docker build -t ubuntu-with-vi-dockerfile .
運行 docker build 命令冤吨,-t 將新鏡像命名為 ubuntu-with-vi-dockerfile,命令末尾的 . 指明 build context 為當(dāng)前目錄漩蟆。Docker 默認(rèn)會從 build context 中查找 Dockerfile 文件垒探,我們也可以通過 -f 參數(shù)指定 Dockerfile 的位置。
從這步開始就是鏡像真正的構(gòu)建過程圾叼。 首先 Docker 將 build context 中的所有文件發(fā)送給 Docker daemon。build context 為鏡像構(gòu)建提供所需要的文件或目錄捺癞。
Dockerfile 中的 ADD夷蚊、COPY 等命令可以將 build context 中的文件添加到鏡像髓介。此例中,build context 為當(dāng)前目錄 /root唐础,該目錄下的所有文件和子目錄都會被發(fā)送給 Docker daemon呜笑。
所以,使用 build context 就得小心了叫胁,不要將多余文件放到 build context凰慈,特別不要把 /驼鹅、/usr 作為 build context微谓,否則構(gòu)建過程會相當(dāng)緩慢甚至失敗输钩。
Step 1:執(zhí)行 FROM,將 ubuntu 作為 base 鏡像买乃。
ubuntu 鏡像 ID 為20c44cd7596f姻氨。
Step 2:執(zhí)行 RUN剪验,安裝 vim。啟動 ID 為09888f68d9e3 的臨時容器功戚,在容器中通過 apt-get 安裝 vim娶眷。
安裝成功后啸臀,將容器保存為鏡像届宠,其 ID 為 4cffcab53eda.
刪除臨時容器 09888f68d9e3 ,鏡像構(gòu)建成功豌注。
查看鏡像分層結(jié)構(gòu)
ubuntu-with-vi-dockerfile 是通過在 base 鏡像的頂部添加一個新的鏡像層而得到的。
這個新鏡像層的內(nèi)容由 RUN apt-get update && apt-get install -y vim 生成灯萍。這一點我們可以通過 docker history 命令驗證。
docker history 會顯示鏡像的構(gòu)建歷史竟稳,也就是 Dockerfile 的執(zhí)行過程属桦。
鏡像的緩存特性
之前已經(jīng)運行過相同的 RUN 指令他爸,這次直接使用緩存中的鏡像層 4cffcab53eda。
在 ubuntu-with-vi-dockerfile 鏡像上直接添加一層就得到了新的鏡像 ubuntu-with-vi-dockerfile-2诊笤。
調(diào)試 Dockerfile
Dockerfile 中每一個指令都會創(chuàng)建一個鏡像層,上層是依賴于下層的巾陕。無論什么時候讨跟,只要某一層發(fā)生變化,其上面所有層的緩存都會失效晾匠。
也就是說茶袒,如果我們改變 Dockerfile 指令的執(zhí)行順序,或者修改或添加指令薪寓,都會使緩存失效。
可通過docker run -it 出錯鏡像id 進(jìn)行調(diào)試