淺析Docker鏡像分層的注意事項
前言
我們平常在對程序進行Docker鏡像打包的時候總會有些困惑,到底是將最終的鏡像分層打包最后匯總成程序的鏡像(也就是一層一層的 From )合適,還是說直接將程序從Source code就打包出最終的鏡像更合適呢?其實這里面沒有說那個是對或錯的,要看程序包自身的情況做選擇。
Docker build的注意點
如果接觸過Docker,Docker build大家都清楚怎么用了,但是有幾個容易忽略的注意點:
1、Dockerfile開頭的 From 和 MAINTAINER 其實都是一層鏡像
2、如果 From 和 MAINTAINER 不同,就算是后面的命令語句相同也不會是相同的鏡像。如都是執(zhí)行 RUN echo "hello world" >> test.txt
,如果 MAINTAINER 不同,則生成的這個語句的鏡像層將是不同的。
3、原理上如果每一層對應(yīng)的父層不同,那怕執(zhí)行的命令相同,Docker也會生成一層新的鏡像,如下面兩個Dockerfile文件
Dockerfile 1:
FROM centos:latest MAINTAINER duffqiu@gmail.com RUN echo "test" >> hello.txt RUN echo "hello" > test.txt
Dockerfile 2:
FROM centos:latest MAINTAINER duffqiu@gmail.com RUN echo "hello" > test.txt RUN echo "test" >> hello.txt
這兩個文件的內(nèi)容只是兩個 RUN 語句順序不一樣,但是最后它們生成的image層是不一樣的,可以通過 docker history <image name>
來對比
從這里面也看到一個問題,F(xiàn)rom最好不要用lastest標(biāo)簽,避免不同鏡像的頂層是不同,從而無法復(fù)用。
實踐建議
需要看具體情況,如果有一個包是公用的,且比較大,則最好先將這個包打成Image再給后續(xù)的程序打包使用,這樣使用時占用的機器磁盤空間最小,啟動時如果需要pull的話也最快。
但是如果包本身就是很小,過細(xì)的分層也不利于維護和管理,所以最終還是一個藝術(shù)問題
總結(jié)
以上就是這篇文章的全部內(nèi)容,希望這篇文章的內(nèi)容對大家的學(xué)習(xí)或者工作能有一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
谷歌技術(shù)人員解決Docker鏡像體積太大問題的方法
這篇文章主要介紹了谷歌技術(shù)人員解決Docker鏡像體積太大問題的方法,涉及虛擬機,谷歌docker鏡像構(gòu)建實踐及構(gòu)建工具bazel的介紹等相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。2017-11-11Docker 部署Mysql 服務(wù)和Redis 服務(wù)的方法
這篇文章主要介紹了Docker 部署Mysql 服務(wù)和Redis 服務(wù)的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Dockerfile如何使用alpine系統(tǒng)制作haproxy鏡像
這篇文章主要介紹了Dockerfile如何使用alpine系統(tǒng)制作haproxy鏡像問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05docker安裝elasticsearch和kibana的方法步驟
這篇文章主要介紹了docker安裝elasticsearch和kibana的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06