程序員筆記——如何編寫優雅的Dockerfile

      網友投稿 1298 2022-05-29

      導讀

      Kubernetes要從容器化開始,而容器又需要從Dockerfile開始,本文將介紹如何寫出一個優雅的Dockerfile文件。

      文章主要內容包括:

      Docker容器

      Dockerfile

      使用多階構建

      感謝公司提供大量機器資源及時間讓我們可以實踐,感謝在此專題上不斷實踐的部分項目及人員的支持。

      一、Docker容器

      1.1 容器的特點

      我們都知道容器就是一個標準的軟件單元,它有以下特點:

      隨處運行:容器可以將代碼與配置文件和相關依賴庫進行打包,從而確保在任何環境下的運行都是一致的。

      高資源利用率:容器提供進程級的隔離,因此可以更加精細地設置CPU和內存的使用率,進而更好地利用服務器的計算資源。

      快速擴展:每個容器都可作為單獨的進程予以運行,并且可以共享底層操作系統的系統資源,這樣一來可以加快容器的啟動和停止效率。

      1.2 Docker容器

      目前市面上的主流容器引擎有Docker、Rocket/rkt、OpenVZ/Odin等等,而獨霸一方的容器引擎就是使用最多的Docker容器引擎。

      Docker容器是與系統其他部分隔離開的一系列進程,運行這些進程所需的所有文件都由另一個鏡像提供,從開發到測試再到生產的整個過程中,Linux 容器都具有可移植性和一致性。相對于依賴重復傳統測試環境的開發渠道,容器的運行速度要快得多,并且支持在多種主流云平臺(PaaS)和本地系統上部署。Docker容器很好地解決了“開發環境能正常跑,一上線就各種崩”的尷尬。

      Docker容器的特點:

      輕量:容器是進程級的資源隔離,而虛擬機是操作系統級的資源隔離,所以Docker容器相對于虛擬機來說可以節省更多的資源開銷,因為Docker容器不再需要GuestOS這一層操作系統了。

      快速:容器的啟動和創建無需啟動GuestOS,可以實現秒級甚至毫秒級的啟動。

      可移植性:Docker容器技術是將應用及所依賴的庫和運行時的環境技術改造包成容器鏡像,可以在不同的平臺運行。

      自動化:容器生態中的容器編排工作(如:Kubernetes)可幫助我們實現容器的自動化管理。

      二、Dockerfile

      Dockerfile是用來描述文件的構成的文本文檔,其中包含了用戶可以在使用行調用以組合Image的所有命令,用戶還可以使用Docker build實現連續執行多個命令指今行的自動構建。

      通過編寫Dockerfile生磁鏡像,可以為開發、測試團隊提供基本一致的環境,從而提升開發、測試團隊的效率,不用再為環境不統一而發愁,同時運維也能更加方便地管理我們的鏡像。

      Dockerfile的語法非常簡單,常用的只有11個:

      2.1 編寫優雅地Dockerfile

      編寫優雅的Dockerfile主要需要注意以下幾點:

      Dockerfile文件不宜過長,層級越多最終制作出來的鏡像也就越大。

      構建出來的鏡像不要包含不需要的內容,如日志、安裝臨時文件等。

      盡量使用運行時的基礎鏡像,不需要將構建時的過程也放到運行時的Dockerfile里。

      只要記住以上三點就能寫出不錯的Dockerfile。

      為了方便大家了解,我們用兩個Dockerfile實例進行簡單的對比:

      我們看第一個Dockerfile,乍一看條理清晰,結構合理,似乎還不錯。再看第二個Dockerfile,緊湊,不易閱讀,為什么要這么寫?

      第一個Dockerfile的好處是:當正在執行的過程某一層出錯,對其進行修正后再次Build,前面已經執行完成的層不會再次執行。這樣能大大減少下次Build的時間,而它的問題就是會因層級變多了而使鏡像占用的空間也變大。

      第二個Dockerfile把所有的組件全部在一層解決,這樣做能一定程度上減少鏡像的占用空間,但在制作基礎鏡像的時候若其中某個組編譯出錯,修正后再次Build就相當于重頭再來了,前面編譯好的組件在一個層里,得全部都重新編譯一遍,比較消耗時間。

      從下表可以看出兩個Dockerfile所編譯出來的鏡像大?。?/p>

      呃…. 好像并沒有特別的效果,但若Dockerfile非常長的話可以考慮減少層次,因為Dockerfile最高只能有127層。

      三、使用多階構建

      Docker在升級到Docker 17.05之后就能支持多階構建了,為了使鏡像更加小巧,我們采用多階構建的方式來打包鏡像。在多階構建出現之前我們通常使用一個Dockerfile或多個Dockerfile來構建鏡像。

      3.1單文件構建

      在多階構建出來之前使用單個文件進行構建,單文件就是將所有的構建過程(包括項目的依賴、編譯、測試、打包過程)全部包含在一個Dockerfile中之下:

      這種的做法會帶來一些問題:

      Dockerfile文件會特別長,當需要的東西越來越多的時候可維護性指數級將會下降;

      鏡像層次過多,鏡像的體積會逐步增大,部署也會變得越來越慢;

      程序員筆記——如何編寫優雅的Dockerfile

      代碼存在泄漏風險。

      以Golang為例,它運行時不依賴任何環境,只需要有一個編譯環境,那這個編譯環境在實際運行時是沒有任務作用的,編譯完成后,那些源碼和編譯器已經沒有任務用處了也就沒必要留在鏡像里。

      上表可以看到,單文件構建最終占用了312MB的空間。

      3.2 多文件構建

      在多階構建出來之前有沒有好的解決方案呢?有,比如采用多文件構建或在構建服務器上安裝編譯器,不過在構建服務器上安裝編譯器這種方法我們就不推薦了,因為在構建服務器上安裝編譯器會導致構建服務器變得非常臃腫,需要適配各個語言多個版本、依賴,容易出錯,維護成本高。所以我們只介紹多文件構建的方式。

      多文件構建,其實就是使用多個Dockerfile,然后通過腳本將它們進行組合。假設有三個文件分別是:Dockerfile.run、Dockerfile.build、build.sh。

      Dockerfile.run就是運行時程序所必須需要的一些組件的Dockerfile,它包含了最精簡的庫;

      Dockerfile.build只是用來構建,構建完就沒用了;

      build.sh的功能就是將Dockerfile.run和Dockerfile.build進行組成,把Dockerfile.build構建好的東西拿出來,然后再執行Dockerfile.run,算是一個調度的角色。

      Dockerfile.build

      Dockerfile.run

      Build.sh

      執行build.sh完成項目的構建。

      從上表可以看到,多文件構建大大減小了鏡像的占用空間,但它有三個文件需要管理,維護成本也更高一些。

      3.3 多階構建

      最后我們來看看萬眾期待的多階構建。

      完成多階段構建我們只需要在Dockerfile中多次使用FORM聲明,每次FROM指令可以使用不同的基礎鏡像,并且每次FROM指令都會開始新的構建,我們可以選擇將一個階段的構建結果復制到另一個階段,在最終的鏡像中只會留下最后一次構建的結果,這樣就可以很容易地解決前面提到的問題,并且只需要編寫一個Dockerfile文件。這里值得注意的是:需要確保Docker的版本在17.05及以上。下面我們來說說具體操作。

      在Dockerfile里可以使用as來為某一階段取一個別名”build-env”:

      然后從上一階段的鏡像中復制文件,也可以復制任意鏡像中的文件:

      看一個簡單的例子:

      執行docker build -t –rm hello3 .后再執行docker images ,然后我們來看鏡像的大小:

      多階構建給我們帶來很多便利,最大的優勢是在保證運行鏡像足夠小的情況下還減輕了Dockerfile的維護負擔,因此我們極力推薦使用多階構建來將你的代碼打包成Docker 鏡像。

      本文轉載自異步社區。

      軟件開發 Web應用防火墻 WAF

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:劍指Offer——搜狐暢游筆試題+知識點總結
      下一篇:智聯生活行業加速器熱門FAQ:物聯網企業該如何與華為云合作?
      相關文章
      国产区图片区小说区亚洲区| 亚洲福利在线播放| 亚洲国产精品无码久久久不卡| 色综合久久精品亚洲国产| 亚洲欧美日韩一区二区三区 | 亚洲av无码乱码在线观看野外| 亚洲avav天堂av在线网毛片| 亚洲高清有码中文字| 亚洲日本va一区二区三区| 亚洲午夜无码毛片av久久京东热| 亚洲一卡2卡3卡4卡国产网站| 亚洲男女性高爱潮网站| 亚洲午夜成激人情在线影院| 91亚洲自偷在线观看国产馆| 国产精品亚洲专区在线观看| 中文字幕亚洲码在线| 亚洲欧洲免费无码| 日韩在线视精品在亚洲| 亚洲国产婷婷综合在线精品| 亚洲午夜激情视频| 国产精品亚洲w码日韩中文| 国产av无码专区亚洲av果冻传媒| 中文字幕精品亚洲无线码一区| 亚洲色精品vr一区二区三区| 亚洲成av人片在线观看无码不卡| 亚洲av一综合av一区| 91亚洲导航深夜福利| 亚洲婷婷天堂在线综合| 亚洲伦理中文字幕| 亚洲国产日韩a在线播放| 四虎亚洲国产成人久久精品| 久久亚洲国产精品五月天婷| 亚洲欧洲日产国码无码久久99| 亚洲男人都懂得羞羞网站| 亚洲精品中文字幕乱码影院| 亚洲欧洲日韩国产一区二区三区| 亚洲av无码专区青青草原| 亚洲精品国产综合久久一线| 亚洲中文字幕无码中文字在线 | 亚洲国产精品无码专区在线观看| 亚洲精品视频在线|