容器基礎(chǔ)鏡像的編寫及最佳實(shí)踐_第1頁(yè)
容器基礎(chǔ)鏡像的編寫及最佳實(shí)踐_第2頁(yè)
容器基礎(chǔ)鏡像的編寫及最佳實(shí)踐_第3頁(yè)
容器基礎(chǔ)鏡像的編寫及最佳實(shí)踐_第4頁(yè)
容器基礎(chǔ)鏡像的編寫及最佳實(shí)踐_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

容器始于鏡像,在容器作為云原生架構(gòu)上的工作負(fù)載發(fā)揮其應(yīng)用價(jià)值之前,它以鏡像的形式存在并流轉(zhuǎn)。相比于攻擊生命周期較短的容器,聰明的攻擊者往往會(huì)選擇投毒鏡像,這樣不管是基于該鏡像運(yùn)行容器抑或是生成新的鏡像,全部都將含有惡意成分。不夠了解鏡像,就無(wú)法建立對(duì)鏡像的管理體系。鏡像有哪些種類?鏡像里有哪些內(nèi)容?鏡像該由誰(shuí)來(lái)構(gòu)建又如何構(gòu)建?通過(guò)本內(nèi)容學(xué)習(xí)您將清楚了解到容器鏡像的基本概念,容器鏡像在容器云平臺(tái)系統(tǒng)組成中的位置,鏡像主要特點(diǎn)以及容器鏡像和虛擬機(jī)鏡像的區(qū)別。基于以上基本概念了解的前提下,本文延伸講解容器鏡像的分類,各類鏡像如何在企業(yè)業(yè)務(wù)中使用,維護(hù)。其中最重要部分是給大家講解各類鏡像的構(gòu)建方式以及鏡像構(gòu)建的最佳實(shí)踐。最后簡(jiǎn)要總結(jié)如何通過(guò)自動(dòng)化的方式進(jìn)行鏡像創(chuàng)建管理。具體實(shí)踐中每個(gè)容器云平臺(tái)的實(shí)現(xiàn)方式不同,大家可以在工作中根據(jù)業(yè)務(wù)需要進(jìn)一步豐富。鏡像是容器之源,在文末介紹了從鏡像到容器運(yùn)行起來(lái)的過(guò)程,結(jié)合操作系統(tǒng)核心技術(shù)解釋了如何通過(guò)其中涉及的各類技術(shù)實(shí)現(xiàn)容器的虛擬化??傊?,通過(guò)本內(nèi)容的學(xué)習(xí)可以零基礎(chǔ)了解鏡像的基本概念,同時(shí)逐步掌握鏡像的構(gòu)建原理以及鏡像構(gòu)建方面的企業(yè)最佳實(shí)踐,為大家在以后工作中創(chuàng)建鏡像奠定技術(shù)基礎(chǔ)。1基本概念1.1Docker系統(tǒng)組成整體Docker的系統(tǒng)包括以下主要組成部分,包括Dockerclient、Dockerdaemon、Dockerregistry、Docker鏡像、Docker容器,他們之間的關(guān)系如下圖:Docker架構(gòu)主要分為客戶端和服務(wù)端,客戶端負(fù)責(zé)發(fā)起請(qǐng)求,服務(wù)端負(fù)責(zé)接受,解析和處理請(qǐng)求,圖示中的DockerClient即為Docker客戶端的一個(gè)命令行工具,用戶通過(guò)DockerClient與DockerDaemon進(jìn)行通信并返回結(jié)果給用戶。也可以使用其他工具通過(guò)DockerApi與DockerDaemon通信。拿一個(gè)簡(jiǎn)單的拉取鏡像并運(yùn)行容器的過(guò)程舉例便于大家更好的理解容器系統(tǒng)架構(gòu)。從上圖中我們可以看到,當(dāng)daemon接收到由client發(fā)起的dockerrun等運(yùn)行容器指令時(shí),docker系統(tǒng)先會(huì)由registry(本地鏡像倉(cāng)庫(kù))中拉取鏡像,圖示中拉取了ubuntu:14.04鏡像。當(dāng)由ubuntu:14.04鏡像啟動(dòng)容器時(shí),ubuntu:14.04鏡像的鏡像層layer內(nèi)容將作為容器的rootfs;而ubuntu:14.04鏡像的yaml文件(json格式),會(huì)由Dockerdaemon解析成為該docker運(yùn)行起來(lái)后的各項(xiàng)配置,并提取出其中的容器執(zhí)行入口CMD信息,以及容器進(jìn)程的環(huán)境變量ENV信息,最終初始化容器進(jìn)程。當(dāng)然,容器進(jìn)程的執(zhí)行入口來(lái)源于鏡像提供的rootfs。在傳統(tǒng)的Linux操作系統(tǒng)內(nèi)核啟動(dòng)時(shí),首先掛載一個(gè)只讀的rootfs,當(dāng)系統(tǒng)檢測(cè)其完整性之后,再將其切換為讀寫模式。而在Docker架構(gòu)中,當(dāng)Dockerdaemon為Docker容器掛載rootfs時(shí),沿用了Linux內(nèi)核啟動(dòng)時(shí)的做法,即將rootfs設(shè)為只讀模式。但docker運(yùn)行的下一步產(chǎn)生了與傳統(tǒng)linux的差別,這里要特別注意,在掛載完畢之后,docker系統(tǒng)利用聯(lián)合掛載(unionmount)技術(shù)在已有的只讀rootfs上再掛載一個(gè)讀寫層??勺x寫的層處于Docker容器文件系統(tǒng)的最頂層,其下可能聯(lián)合掛載了多個(gè)只讀的層,只有在Docker容器運(yùn)行過(guò)程中文件系統(tǒng)發(fā)生變化時(shí),才會(huì)把變化的文件內(nèi)容寫到可讀寫層,并如同photoshop中的多層覆蓋一樣,由最頂層的新的文件內(nèi)容覆蓋掉只讀層中的舊版本文件(舊版本文件依舊存在只是被蓋住了)。1.2Docker鏡像Docker鏡像是一個(gè)只讀的Docker容器模板,含有啟動(dòng)Docker容器所需的文件系統(tǒng)結(jié)構(gòu)及其內(nèi)容,是啟動(dòng)一個(gè)Docker容器的基礎(chǔ),但是需要重點(diǎn)注意鏡像中不包括系統(tǒng)內(nèi)核,在下文也會(huì)講述這是容器與虛擬機(jī)最關(guān)鍵的區(qū)別之一。Docker鏡像的文件內(nèi)容(rootfs)以及一些運(yùn)行Docker容器的配置文件組成了Docker容器的靜態(tài)運(yùn)行環(huán)境??梢赃@么理解,Docker鏡像是Docker容器的靜態(tài)視角,Docker容器是Docker鏡像的運(yùn)行狀態(tài)。鏡像是容器之源,如果大家熟悉java,鏡像和容器的關(guān)系類似class文件和java對(duì)象的關(guān)系。1.3Docker鏡像特點(diǎn)-分層Docker鏡像是采用分層的方式構(gòu)建的,每個(gè)鏡像都由一系列的"鏡像層"組成。分層結(jié)構(gòu)是Docker鏡像如此輕量的重要原因。當(dāng)需要修改容器鏡像內(nèi)的某個(gè)文件時(shí),只對(duì)處于最上方的讀寫層進(jìn)行變動(dòng),不覆寫下層已有文件系統(tǒng)的內(nèi)容,已有文件在只讀層中的原始版本仍然存在,但會(huì)被讀寫層中的新版本所隱藏。當(dāng)使用dockercommit提交這個(gè)修改過(guò)的容器文件系統(tǒng)為一個(gè)新的鏡像時(shí),保存的內(nèi)容僅為最上層讀寫文件系統(tǒng)中被更新過(guò)的文件。分層達(dá)到了在不同的容器鏡像之間共享鏡像層的效果。-寫時(shí)復(fù)制(不變性)Docker鏡像使用了寫時(shí)復(fù)制(copy-on-write)的策略。如果要在多個(gè)容器之間共享鏡像,每個(gè)容器在啟動(dòng)的時(shí)候并不需要單獨(dú)復(fù)制一份鏡像文件,而是將所有鏡像層以只讀的方式掛載到一個(gè)掛載點(diǎn),再在上面覆蓋一個(gè)可讀寫的容器層。在未更改文件內(nèi)容時(shí),所有容器等于共享同一份數(shù)據(jù),只有在Docker容器運(yùn)行過(guò)程中文件系統(tǒng)發(fā)生變化時(shí),才會(huì)把變化的文件內(nèi)容寫到可讀寫層,并隱藏只讀層中的老版本文件。寫時(shí)復(fù)制配合分層機(jī)制減少了鏡像對(duì)磁盤空間的占用和容器啟動(dòng)時(shí)間。-內(nèi)容尋址在Docker1.10版本后,Docker鏡像經(jīng)歷了較大的改動(dòng),其中最重要的特性便是引入了內(nèi)容尋址存儲(chǔ)(content-addressablestorage)的機(jī)制,根據(jù)文件的內(nèi)容來(lái)索引鏡像和鏡像層。與之前版本對(duì)每個(gè)鏡像層隨機(jī)生成一個(gè)UUID不同,新模型對(duì)鏡像層的內(nèi)容計(jì)算校驗(yàn)和,生成一個(gè)內(nèi)容哈希值,并以此哈希值代替之前的UUID作為鏡像層的唯一標(biāo)識(shí)。該機(jī)制主要提高了鏡像的安全性,并在pull、push、load和save操作后檢測(cè)數(shù)據(jù)的完整性。另外,基于內(nèi)容哈希來(lái)索引鏡像層,在一定程度上減少了ID的沖突并且增強(qiáng)了鏡像層的共享。對(duì)于來(lái)自不同構(gòu)建的鏡像層,只要擁有相同的內(nèi)容哈希,也能被不同的鏡像共享。-聯(lián)合掛載通俗地講,聯(lián)合掛載技術(shù)可以在一個(gè)掛載點(diǎn)同時(shí)掛載多個(gè)文件系統(tǒng),將掛載點(diǎn)的原目錄與被掛載內(nèi)容進(jìn)行整合,使得最終可見(jiàn)的文件系統(tǒng)將會(huì)包含整合之后的各層的文件和目錄。實(shí)現(xiàn)這種聯(lián)合掛載技術(shù)的文件系統(tǒng)通常被稱為聯(lián)合文件系統(tǒng)(unionfilesystem)。docker依靠此技術(shù)實(shí)現(xiàn)鏡像本身的只讀層與生成容器以后產(chǎn)生的讀寫層的整合。1.4Docker鏡像和虛擬機(jī)鏡像區(qū)別容器是一個(gè)應(yīng)用層抽象,用于將代碼和依賴資源打包在一起。多個(gè)容器可以在同一臺(tái)機(jī)器上運(yùn)行,共享底層操作系統(tǒng)內(nèi)核,但各自作為獨(dú)立的進(jìn)程在用戶空間中運(yùn)行。因?yàn)閯冸x了相對(duì)沉重的操作系統(tǒng),所以與虛擬機(jī)相比,容器占用的空間較少(容器鏡像大小通常只有幾十兆),瞬間就能完成啟動(dòng)。虛擬機(jī)(VM)是一個(gè)物理硬件層抽象,用于將一臺(tái)服務(wù)器變成多臺(tái)服務(wù)器。管理程序允許多個(gè)VM在一臺(tái)機(jī)器上運(yùn)行。每個(gè)VM都包含一整套操作系統(tǒng)、一個(gè)或多個(gè)應(yīng)用、必要的二進(jìn)制文件和庫(kù)資源,因此占用大量空間。而且VM啟動(dòng)也十分緩慢。需要理解的是,容器和虛擬化并不是一項(xiàng)沖突的技術(shù),現(xiàn)實(shí)環(huán)境中在資源允許的情況下,可先通過(guò)虛擬化技術(shù)獲得多臺(tái)VM,再在VM上運(yùn)行容器。1.5容器和虛擬機(jī)區(qū)別2鏡像分類根據(jù)實(shí)際容器鏡像管理的經(jīng)驗(yàn),結(jié)合鏡像的來(lái)源,鏡像的用途以及鏡像制作參與人員的不同將鏡像分為4類:-官方操作系統(tǒng)鏡像此鏡像是操作系統(tǒng)廠商給出的OS的最基礎(chǔ)版本,比如ubuntu,suse12sp3,centos,redhat,alpine,windowsNanoServer、WindowsServerCore和windowsinsider等鏡像,其中開(kāi)源的鏡像比如apline鏡像可以通過(guò)Dockerhub官方網(wǎng)站下載,如使用suse12sp3鏡像需要請(qǐng)求SUSE官方支持獲得。為了便于維護(hù),此類型鏡像的版本需要盡量少,并且盡量簡(jiǎn)單。-公司操作系統(tǒng)鏡像此鏡像是在原廠鏡像的基礎(chǔ)上安裝了經(jīng)過(guò)公司內(nèi)部os運(yùn)維人員審核過(guò)的工具包形成的鏡像,此鏡像的構(gòu)建基于官方操作系統(tǒng)鏡像。其中常見(jiàn)的工具包括必要的診斷、編輯工具等構(gòu)建的符合行內(nèi)規(guī)范的操作系統(tǒng)鏡像。此部分鏡像不區(qū)分應(yīng)用運(yùn)行環(huán)境,由容器云平臺(tái)運(yùn)維人員進(jìn)行維護(hù)。-公司基礎(chǔ)鏡像此鏡像是在公司操作系統(tǒng)鏡像基礎(chǔ)上安裝了符合公司版本規(guī)范的基礎(chǔ)軟件的鏡像,比如安裝了JDK,Tomcat,Apache,Nginx,Weblogic,Mysql等,此部分鏡像不區(qū)分應(yīng)用運(yùn)行環(huán)境,由容器云平臺(tái)運(yùn)維人員進(jìn)行運(yùn)維。-公司應(yīng)用鏡像此鏡像是用于公司業(yè)務(wù)運(yùn)行的鏡像,構(gòu)建于公司操作系統(tǒng)鏡像或者公司基礎(chǔ)鏡像之上,一般為開(kāi)發(fā)人員和運(yùn)維人員共同構(gòu)建,并且構(gòu)建完畢以后隨帶一篇多個(gè)環(huán)境(開(kāi)放/測(cè)試/生產(chǎn))的部署說(shuō)明,參數(shù)配置文件說(shuō)明。注意,不建議直接下載第三方甚至Dockerhub上的基礎(chǔ)鏡像直接使用,比如nginx,tomcat鏡像,理由:1)安全可控的目的,防止有“毒”鏡像。2)未融入公司的軟件配置規(guī)范、未進(jìn)行性能優(yōu)化以及安全加固。3)未融入公司軟件基線管理體系,未引入持續(xù)構(gòu)建機(jī)制,定期更新以及漏洞修復(fù)。3鏡像制作根據(jù)鏡像不同分類,鏡像的制作方式也不盡相同,其中對(duì)于第一類鏡像,即官方操作系統(tǒng)鏡像。一般直接從廠商獲得,比如ubuntu,centos,suse,alpine等,并且從廠商獲得的形式也不盡相同,比如rpm,minibootfs,鏡像tar包。但是對(duì)于特殊發(fā)行軟件,比如busybox,官方只提供了一個(gè)二進(jìn)制文件,因此需要通過(guò)自己構(gòu)建rootfs進(jìn)行構(gòu)建。第一類鏡像的構(gòu)建屬于基礎(chǔ)鏡像構(gòu)建范疇,一般情況有原廠制作,本著知其然也要知其所以然的目的,本文也準(zhǔn)備特定章節(jié)進(jìn)行闡述。對(duì)于第二、三、四類鏡像需要遵循一定鏡像制作規(guī)范,通過(guò)命令或者自動(dòng)化工具進(jìn)行持續(xù)構(gòu)建,此部分是常規(guī)的鏡像構(gòu)建過(guò)程,也是本文容器鏡像構(gòu)建闡述的重點(diǎn),正如上面容器鏡像分類說(shuō)明的那樣,第二、第三類鏡像一般由容器云平臺(tái)建設(shè)者進(jìn)行構(gòu)建,并提供維護(hù),第四類是應(yīng)用開(kāi)發(fā)和應(yīng)用運(yùn)維負(fù)責(zé)人進(jìn)行構(gòu)建并維護(hù)。綜上所述,鏡像構(gòu)建主要分為兩大類,基礎(chǔ)鏡像構(gòu)建和公司專屬鏡像構(gòu)建。其中公司專屬鏡像構(gòu)建的鏡像是上面所述的第二、三、四類鏡像。3.1基礎(chǔ)鏡像構(gòu)建3.1.1基本概念在進(jìn)行基礎(chǔ)鏡像構(gòu)建介紹之前,首先幾個(gè)相關(guān)概念,這里需要說(shuō)明的是此處的概念也適用于公司專屬鏡像構(gòu)建。3.1.2rootfsRootFileSystem,簡(jiǎn)稱為rootfs,中文翻譯是根文件系統(tǒng),是特定的操作系統(tǒng)的文件組織架構(gòu)的一種實(shí)現(xiàn)的形式,具體表現(xiàn)為系統(tǒng)中存在哪些特定的文件夾,文件夾之間的關(guān)系。比如Linux中的rootfs是包括根文件目錄“/”.系統(tǒng)相關(guān)的配置文件目錄“/etc”,存放系統(tǒng)啟動(dòng)相關(guān)配置的“/etc/init”,存放系統(tǒng)相關(guān)的工具/sbin,存在用戶的工具/usr/bin等等,以及用戶的家目錄“home”,root用戶的家目錄“/root”等諸如此類的文件夾和文件,對(duì)應(yīng)的,對(duì)于Windows,從Windows95/98/XP/Win7,這些版本的windows系統(tǒng),有很多系統(tǒng)相關(guān)的文件夾和文件。比如(假設(shè)系統(tǒng)安裝在C盤)C:Windows用于存放,系統(tǒng)相關(guān)的文件C:Windowssystem32其中很多可執(zhí)行文件(工具),都是系統(tǒng)相關(guān)的工具C:ProgramFiles默認(rèn)的軟件安裝目錄,比如辦公軟件MicrosoftOfficeC:Users(Win7以后出現(xiàn),其他版本的windows也有類似目錄)用于存儲(chǔ)用戶相關(guān)數(shù)據(jù)和配置。綜上,諸如此類的操作系統(tǒng)對(duì)于文件系統(tǒng)都有相關(guān)的規(guī)定,規(guī)定規(guī)范了操作系統(tǒng)運(yùn)行需要的必須文件,以及系統(tǒng)啟動(dòng)過(guò)程中文件的依賴關(guān)系。容器的基礎(chǔ)鏡像也應(yīng)用了相同的概念,因此容器鏡像,特別是基礎(chǔ)鏡像就是來(lái)源于一個(gè)rootfs系統(tǒng)。即最基礎(chǔ)的容器鏡像的初始輸入是rootfs,這里需要說(shuō)明的是rootfs的獲得主要有以下幾種:1、根據(jù)rootfs的規(guī)范自己創(chuàng)建和組織一個(gè)文件目錄,2、從原廠獲得rootfs,3、根據(jù)運(yùn)行的系統(tǒng)中獲得,4、使用原廠提供基礎(chǔ)鏡像制作命令獲取。其中對(duì)于第一種,以busybox操作系統(tǒng)的rootfs制作舉例:對(duì)于第二種,以alpine操作系統(tǒng)的rootfs制作舉例:對(duì)于第三種,以centos系統(tǒng)制作舉例:對(duì)于第四種,以opensuse、ubuntu、centos舉例:這樣一個(gè)完整的rootfs就誕生了。另外需要明確的是rootfs只是一個(gè)操作系統(tǒng)所包含的文件、配置和目錄,并不包括操作系統(tǒng)的內(nèi)核(bootfs包含了BootLoader和Kernel),在Linux操作系統(tǒng)中,這兩部分是分開(kāi)存放的,操作系統(tǒng)只有在開(kāi)機(jī)啟動(dòng)時(shí)才會(huì)加載指定版本的內(nèi)核。所以說(shuō),rootfs只包括了操作系統(tǒng)的“軀殼”,并沒(méi)有包括操作系統(tǒng)的“靈魂”。3.1.3chrootchroot,即changerootdirectory(更改root目錄)。在linux系統(tǒng)中,系統(tǒng)默認(rèn)的目錄結(jié)構(gòu)都是以

/,即是以根(root)開(kāi)始的。而在使用chroot之后,系統(tǒng)的目錄結(jié)構(gòu)將以指定的位置作為

/

位置。如下圖所示:

在經(jīng)過(guò)chroot之后,系統(tǒng)讀取到的目錄和文件將不再是舊系統(tǒng)根下的而是新根下(即被指定的新的位置)的目錄結(jié)構(gòu)和文件,它帶來(lái)的好處大致有以下3個(gè):1、增加了系統(tǒng)的安全性,限制了用戶的權(quán)力;2、建立一個(gè)與原系統(tǒng)隔離的系統(tǒng)目錄結(jié)構(gòu),方便用戶的開(kāi)發(fā);3、切換系統(tǒng)的根目錄位置,引導(dǎo)Linux系統(tǒng)啟動(dòng)以及急救系統(tǒng)等。為了更好的理解chroot發(fā)揮的作用,我們嘗試指定一個(gè)特定的位置進(jìn)行根目錄切換。在經(jīng)過(guò)chroot之后,系統(tǒng)讀取到的系統(tǒng)相關(guān)目錄將不再是舊系統(tǒng)根目錄下的,而是切換后新根下的目錄結(jié)構(gòu)和文件,具體例子參照上節(jié):rootfs的第一種制作樣例。3.1.4DockerfileDockerfile是一個(gè)Docker鏡像的描述文件,里面內(nèi)容是容器構(gòu)建引擎執(zhí)行的操作步驟,像執(zhí)行預(yù)案一樣,順序執(zhí)行A、B、C、D…的步驟。Dockerfile內(nèi)部包含了一條條的指令,每一條指令構(gòu)建鏡像的一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。Dockerfile規(guī)范如下:由上可知,Dockerfile結(jié)構(gòu)大致分為四個(gè)部分:(1)基礎(chǔ)鏡像信息,指FROM部分(2)維護(hù)者信息,指MAINTAINER部分(3)鏡像操作指令,包括USER、ENV、COPY、EXPOSE、WORKDIR和RUN等(4)容器啟動(dòng)時(shí)執(zhí)行指令,指CMD部分,DockerFile規(guī)范中提供了ENTRYPOINT指令或CMD指令用于制定Docker默認(rèn)的運(yùn)行命令,二者功能類似,DockerFile定義中必有其一,但是二者有細(xì)微的差別,CMD指令可以被dockerrun命令中的執(zhí)行命令參數(shù)覆蓋,但是ENTRYPPOINT必須通過(guò)--entrypoint進(jìn)行覆蓋。Dockerfile每行支持一條指令,每條指令可帶多個(gè)參數(shù),支持使用以#號(hào)開(kāi)頭的注釋。詳細(xì)命令的介紹,參照Docker官方文檔。3.1.5生成方式基礎(chǔ)鏡像構(gòu)建目前主要有兩種方式,第一種是基于tar包import構(gòu)建,另外一種是Fromscratch構(gòu)建,但是構(gòu)建之前都需要準(zhǔn)備好基礎(chǔ)鏡像的rootfs文件系統(tǒng)。通過(guò)tar包import步驟一:獲得基礎(chǔ)鏡像的rootfs文件系統(tǒng),以alpine的minirootfs為例步驟二、構(gòu)建鏡像步驟三、確認(rèn)鏡像步驟四、測(cè)試鏡像通過(guò)dockerbuild即Fromscratch步驟一、編寫Dockerfile文件步驟二、dockerbuild構(gòu)建基礎(chǔ)鏡像步驟三、鏡像測(cè)試以上即為主流的制作基礎(chǔ)鏡像的方法,但是一般情況下基礎(chǔ)鏡像是操作系統(tǒng)原廠制作,實(shí)際生產(chǎn)運(yùn)維過(guò)程中自行維護(hù)的并不多,此處介紹的主要目的是給大家介紹清楚鏡像從0到1的原理,解決From某某鏡像的第一個(gè)鏡像由來(lái)原理問(wèn)題。3.2公司專屬鏡像構(gòu)建公司專屬鏡像構(gòu)建是基于操作系統(tǒng)基礎(chǔ)鏡像按照公司鏡像管理規(guī)范進(jìn)行鏡像構(gòu)建的過(guò)程,此過(guò)程主要包括以下幾個(gè)工作,按照公司鏡像制作管理規(guī)范設(shè)計(jì)公司鏡像構(gòu)建的技術(shù)構(gòu)成和流程管理規(guī)定,其中技術(shù)構(gòu)成包括公司專屬鏡像的技術(shù)規(guī)范,以及鏡像的層次組織架構(gòu),此部分通過(guò)制定公司的Dockerfile管理規(guī)范和容器運(yùn)行參數(shù)規(guī)范實(shí)現(xiàn);流程管理規(guī)定包括制定公司操作系統(tǒng)鏡像,公司基礎(chǔ)鏡像,公司應(yīng)用鏡像的生成,更新以及銷毀的流程,此部分主要通過(guò)自動(dòng)化實(shí)現(xiàn)。因此此部分主要的工作(刪除)包括設(shè)計(jì)Dockerfile編寫規(guī)范,Dokcer鏡像版本管理規(guī)范(tag規(guī)范),Docker運(yùn)行參數(shù)規(guī)范,以及自動(dòng)化實(shí)現(xiàn)規(guī)范。其中自動(dòng)化部分在自動(dòng)構(gòu)建章節(jié)介紹。3.2.1公司鏡像庫(kù)規(guī)范公司Docker鏡像統(tǒng)一提交到公司統(tǒng)一的鏡像倉(cāng)庫(kù),并對(duì)鏡像倉(cāng)庫(kù)進(jìn)行授權(quán)管理,推薦使用的鏡像如harbor,JFrogArtifactory,DTR等。3.2.2公司鏡像Dockerfile規(guī)范1、禁止依賴(From)來(lái)源不明的基礎(chǔ)鏡像,所有鏡像均基于公司內(nèi)部標(biāo)準(zhǔn)基礎(chǔ)軟件鏡像。建議利用第二類和第三類公司基礎(chǔ)鏡像作為公共的基礎(chǔ)鏡像,同時(shí)(刪除)應(yīng)用據(jù)自身的需求可以建立本應(yīng)用系統(tǒng)的公共的基礎(chǔ)鏡像,用于優(yōu)化鏡像分發(fā)和管理。2、應(yīng)用鏡像基于公共的基礎(chǔ)鏡像制作,并且Docker鏡像應(yīng)該是自包含的,應(yīng)該包括應(yīng)用所需基礎(chǔ)鏡像,應(yīng)用依賴和標(biāo)準(zhǔn)配置模板,不允許出現(xiàn)運(yùn)行過(guò)程中安裝軟件的現(xiàn)象。3、不允許在鏡像內(nèi)保存應(yīng)用源代碼、Dockerfile、構(gòu)建應(yīng)用腳本等,防止信息泄露。不允許在鏡像內(nèi)保存安全憑證、密碼,建議使用環(huán)境變量或者配置文件方式在dockerrun時(shí)候指定。4、Docker鏡像內(nèi)容應(yīng)該是不可變的,不要將需要持久化的數(shù)據(jù)存放在容器內(nèi)。建議將持久化數(shù)據(jù)保存在Volume數(shù)據(jù)卷上5、利用Dockerfile鏡像制作時(shí),盡量較少鏡像層數(shù),合并RUN、EXPOSE、ENV指令;優(yōu)化指令順序,將相對(duì)變化較少的指令及指令執(zhí)行耗時(shí)較長(zhǎng)的,放在靠前位置執(zhí)行。6、Docker鏡像應(yīng)該是自描述的,在Dockerfile中利用a)EXPOSE顯式定義暴露的端口b)VOLUME顯式定義所有數(shù)據(jù)卷c)ENV顯式初始化容器的環(huán)境變量設(shè)置d)利用LABEL提供鏡像的元數(shù)據(jù)管理規(guī)范7、內(nèi)部進(jìn)程的監(jiān)控可以通過(guò)init.d,Supervisor或其他進(jìn)程監(jiān)控軟件來(lái)完成8、Dockerfile必須通過(guò)版本管理工具進(jìn)行管理,比如gitlib系統(tǒng),同時(shí)Dockefile版本(tag)與鏡像版本(tag)一致。3.2.3公司鏡像版本管理規(guī)范所有Docker鏡像必須利用tag進(jìn)行版本管理;引用Docker鏡像必須指明versiontag;不允許利用缺省latesttag作為默認(rèn)tag。Dockerfile必須利用源代碼管理系統(tǒng)進(jìn)行管理,建議每次代碼提交后自動(dòng)重新構(gòu)建鏡像,建議利用CI工具構(gòu)建鏡像,推薦利用代碼版本號(hào)作為鏡像tag一部分,便于代碼回溯追蹤。3.2.4公司鏡像參數(shù)規(guī)范1、Docker鏡像內(nèi)容應(yīng)該是不可變的,不要將需要持久化的數(shù)據(jù)存放在容器內(nèi)。同時(shí)容器本身每次啟動(dòng)的行為應(yīng)該是一致的,保證容器應(yīng)該可隨時(shí)進(jìn)行停止、銷毀或者更新替換2、鏡像應(yīng)該是可以配置的,可以采用如下方式;a)通過(guò)環(huán)境變量的方式或者env-file提供b)通過(guò)配置文件的方式:對(duì)于k8s環(huán)境,利用ConfigMap方式映射到容器中c)對(duì)于敏感信息如密碼、證書應(yīng)該通過(guò)文件方式傳遞,在k8s環(huán)境下,可以利用Secret的方式進(jìn)行支持3.3公司鏡像構(gòu)建過(guò)程規(guī)范-鏡像生成方式規(guī)范所有Docker鏡像必須采用Dockerfile方式進(jìn)行構(gòu)建,應(yīng)禁止手工修改運(yùn)行中的容器并提交為鏡像,否則無(wú)法保證鏡像內(nèi)容的可追溯性。鏡像生成方式一:Dockerbuild支持且僅推薦此種方式從零開(kāi)始來(lái)創(chuàng)建一個(gè)新的鏡像。為此,我們需要?jiǎng)?chuàng)建一個(gè)Dockerfile文件,其中包含一組指令來(lái)告訴Docker如何構(gòu)建我們的鏡像。使用dockerbuild命令進(jìn)行。鏡像生成方式二、Dockercommit創(chuàng)建鏡像不推薦鏡像生成方式三、Dockerexport/import創(chuàng)建鏡像不推薦-.dockerignore使用規(guī)范鏡像構(gòu)建系統(tǒng)中必須明確編寫鏡像忽略文件(.dockerignore)用于指定那些文件不能存在于構(gòu)建的鏡像中,.dockerignore文件用來(lái)定義忽略鏡像構(gòu)建過(guò)程中不需要的文件。此方式可以有效防止信息泄露。.dockerignore有兩種使用方式:推薦采用包含法。常規(guī)的做法-排除法(黑名單)與.gitignore的常規(guī)做法一樣,排除不需要的文件或文件夾最佳實(shí)踐-包含法(白名單)實(shí)際構(gòu)建過(guò)程中,上下文需要的文件或文件夾只占整個(gè)項(xiàng)目所有文件或文件夾中的一小部分,尤以java項(xiàng)目突出,構(gòu)建時(shí),上下文只需要一個(gè)jar或war包即可。所以我們建議:.dockerignore中配置只包含需要的文件或文件夾即可,更為簡(jiǎn)潔、方便。舉例:3.3.3鏡像多級(jí)構(gòu)建規(guī)范在實(shí)際構(gòu)建鏡像的場(chǎng)景中,生成鏡像的過(guò)程往往是首先源碼的獲取,然后編譯和生成應(yīng)用制品,最終才構(gòu)建為應(yīng)用鏡像。但是這樣做的劣勢(shì)在于:不得不在容器中安裝構(gòu)建程序所必須的運(yùn)行時(shí)環(huán)境;不得不在同一個(gè)容器中,獲取程序的源碼和構(gòu)建所需的一些生態(tài)工具;構(gòu)建出的鏡像甚至包含了程序源碼和一些不必要的文件,導(dǎo)致容器鏡像尺寸偏大。在最新的容器版本(Docker17.05)以后提供了一種稍微優(yōu)雅的解決方式,即多階段構(gòu)建(multi-stagebuild)方案。所謂多階段構(gòu)建,也即將構(gòu)建過(guò)程分為多個(gè)階段,在同一個(gè)Dockerfile中,通過(guò)不同的階段來(lái)構(gòu)建和生成所需要的應(yīng)用文件,最終將這些應(yīng)用文件添加到一個(gè)release的鏡像中。這樣做能完全規(guī)避上面所遇到的一系列問(wèn)題。實(shí)現(xiàn)多階段構(gòu)建,主要依賴于新提供的關(guān)鍵字:from和as。下面舉個(gè)例子:第一階段:拷貝源文件到鏡像中,通過(guò)maven進(jìn)行編譯生成用于生產(chǎn)環(huán)境需要的springboot的jar文件第二階段:?jiǎn)?dòng)一個(gè)openjdk8的容器,運(yùn)行第一階段的jar文件多階段構(gòu)建的Dockerfile看起來(lái)像是把兩個(gè)或者更多的Dockerfile合并在了一起,這也即多階段的意思。as關(guān)鍵字用來(lái)為構(gòu)建階段賦予一個(gè)別名,這樣,在另外一個(gè)構(gòu)建階段中,可以通過(guò)from關(guān)鍵字來(lái)引用和使用對(duì)應(yīng)關(guān)鍵字階段的構(gòu)建輸出,并打包到容器中。在多階段構(gòu)建完成之后,輸出的鏡像僅僅包含了最終輸出的springboot工程的jar文件,沒(méi)有其他的源碼文件和第三方源碼包,非常的干凈和簡(jiǎn)潔。因?yàn)閎uild-env階段只是一個(gè)構(gòu)建的中間過(guò)程而已,因此通過(guò)多階段構(gòu)建,既可以很方便地將多個(gè)彼此依賴的項(xiàng)目通過(guò)一個(gè)Dockerfile就可輕松構(gòu)建出期望的容器鏡像,并且不用擔(dān)心鏡像太大、源碼泄露等風(fēng)險(xiǎn)。因此推薦在類似場(chǎng)景中使用多階段構(gòu)建技術(shù)。4自動(dòng)構(gòu)建對(duì)于簡(jiǎn)單的鏡像構(gòu)建可以使用手動(dòng)實(shí)現(xiàn),但是同時(shí)存在多個(gè)項(xiàng)目開(kāi)發(fā)的大公司,并行開(kāi)發(fā)的項(xiàng)目很多,并且每天都會(huì)面臨新功能的提交,因此對(duì)于大規(guī)模的應(yīng)用構(gòu)建手動(dòng)實(shí)現(xiàn)已經(jīng)力不從心,通過(guò)CI工具進(jìn)行自動(dòng)持續(xù)構(gòu)建是鏡像制作的必經(jīng)之路。實(shí)現(xiàn)自動(dòng)構(gòu)建的方式很多,下面以基于JenkinsCI工具基礎(chǔ)簡(jiǎn)單實(shí)現(xiàn)一個(gè)鏡像構(gòu)建的過(guò)程。前提:已安裝好Docker和Jenkins(2.138.1)。1、在Jenkins中創(chuàng)建項(xiàng)目輸入項(xiàng)目名:選擇構(gòu)建一個(gè)流水線的軟件項(xiàng)目2、級(jí)項(xiàng)目配置定義:PipelinescriptfromSCM腳本路徑:Jenkinsfile3、編寫Jenkinsfilepipeline{agentanytools{maven'maven3.6.0'jdk'jdk1.8'}environment{registryUrl="127.0.0.1:5000"artifactId=readMavenPom().getArtifactId().toLowerCase()image_tag=readMavenPom().getVersion()image_repository="${registryUrl}/${artifactId}"}stages{stage('prepare'){steps{echo"registryUrl:${registryUrl},image_repository:${image_repository},image_tag:${image_tag}"}}stage('Buildproject'){steps{sh'mvncleanpackage-DskipTests'}}stage('Build&PushImage'){steps{dir('target'){script{defapp=docker.build('${image_repository}:${image_tag}')app.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論