版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
虛擬化技術(shù)與應(yīng)用項目教程(微課版)項目5
Docker容器技術(shù)5.1
項目描述隨著信息技術(shù)的飛速發(fā)展,人類進(jìn)入云計算時代,云計算時代孕育出眾多的云平臺。但眾多的云平臺的標(biāo)準(zhǔn)、規(guī)范不統(tǒng)一,每個云平臺都有各自獨立的資源管理策略、網(wǎng)絡(luò)映射策略和內(nèi)部依賴關(guān)系,導(dǎo)致各個平臺無法做到相互兼容、相互連接。同時,應(yīng)用的規(guī)模越來越龐大、邏輯越來越復(fù)雜,任何一款應(yīng)用產(chǎn)品都難以順利地從一個云平臺遷移到另外一個云平臺。但Docker的出現(xiàn)打破了這種局面。本項目講解Docker技術(shù)基礎(chǔ)知識、Docker鏡像基礎(chǔ)知識、Docker常用命令、Dockerfile相關(guān)知識、Docker容器基礎(chǔ)知識、Docker容器實現(xiàn)原理、DockerCompose基礎(chǔ)知識、DockerCompose文件基礎(chǔ)知識、DockerCompose常用命令及Docker倉庫基礎(chǔ)知識等相關(guān)理論知識;項目實施部分講解Docker安裝與部署,離線環(huán)境下導(dǎo)入鏡像,通過dockercommit命令創(chuàng)建鏡像,利用Dockerfile創(chuàng)建鏡像,Docker容器創(chuàng)建和管理,安裝DockerCompose并部署WordPress,從源代碼開始構(gòu)建、部署和管理應(yīng)用程序,私有鏡像倉庫Harbor部署,Harbor項目配置與管理以及Harbor系統(tǒng)管理與維護(hù)等相關(guān)知識與技能。5.2
必備知識5.2.2Docker鏡像基礎(chǔ)知識5.2.1Docker技術(shù)基礎(chǔ)知識
5.2.3Docker常用命令
5.2.4Dockerfile相關(guān)知識5.2.5Docker容器基礎(chǔ)知識5.2.6Docker容器實現(xiàn)原理
5.2.7DockerCompose基礎(chǔ)知識5.2.8DockerCompose文件基礎(chǔ)知識5.2.9DockerCompose常用命令5.2.10Docker倉庫基礎(chǔ)知識5.2.1Docker技術(shù)基礎(chǔ)知識Docker產(chǎn)品的Logo如圖所示,它輕便、快速的特性可以使應(yīng)用快速迭代。在Docker中,每次進(jìn)行小變更后,馬上就能看到效果,而不用將若干個小變更積攢到一定程度再進(jìn)行變更。每次變更一小部分其實是一種非常安全的方式,在開發(fā)環(huán)境中能夠快速提高工作效率。Docker容器能夠幫助開發(fā)人員、系統(tǒng)管理員和項目工程師在一個生產(chǎn)環(huán)節(jié)中協(xié)同工作。制定一套容器標(biāo)準(zhǔn)能夠使系統(tǒng)管理員在更改容器的時候,不需要關(guān)心容器的變化,只需要專注于自己的應(yīng)用程序代碼。Docker產(chǎn)品的Logo5.2.1Docker技術(shù)基礎(chǔ)知識1.Docker的發(fā)展歷程Docker公司位于美國加利福尼亞州。Docker公司起初是一家名為dotCloud的PaaS提供商。底層技術(shù)上,dotCloud公司采用了一種基于容器的操作系統(tǒng)層次的虛擬化技術(shù)(LinuxContainer,LXC)。為了方便創(chuàng)建和管理容器,dotCloud公司開發(fā)了一套內(nèi)部工具,之后將其命名為Docker,Docker就這樣誕生了。123452013年,dotCloud公司的PaaS業(yè)務(wù)不景氣,公司需要尋求新的突破,于是聘請了本·戈盧布作為新的CEO,將公司重命名為Docker。2013年3月,Docker開源版本正式發(fā)布;2013年11月,RHEL6.5正式版本集成了對Docker的支持。2014年4月至6月,亞馬遜、谷歌、微軟等公司的云計算服務(wù)相繼宣布支持Docker;2014年6月,隨著DockerCon2014大會的召開,Docker1.0正式發(fā)布2015年6月,Linux基金會在DockerCon2015大會上與亞馬遜、思科、Docker等公司共同宣布成立開放容器項目,該組織后更名為開放容器標(biāo)準(zhǔn);2015年,浙江大學(xué)實驗室攜手華為、谷歌、Docker等公司成立云原生計算基金會。如今Docker公司被普遍認(rèn)為是一家創(chuàng)新型科技公司。2022年3月31日,Docker公司完成了1.05億美元的C輪融資,估值達(dá)到21億美元。5.2.1Docker技術(shù)基礎(chǔ)知識2.Docker的定義目前,Docker的官方定義如下:Docker是以Docker容器為資源分割和調(diào)度的基本單位,封裝了整個軟件運行時的環(huán)境,為開發(fā)者和系統(tǒng)管理員設(shè)計,用于構(gòu)建、發(fā)布和運行分布式的應(yīng)用平臺。它是一套跨平臺、可移植且簡單易用的容器解決方案。Docker的源代碼托管在GitHub上,基于Go語言開發(fā),并遵從Apache2.0協(xié)議。Docker可在容器內(nèi)部快速、自動化地部署應(yīng)用,并通過操作系統(tǒng)內(nèi)核技術(shù)為容器提供資源隔離與安全保障。Docker借鑒集裝箱裝運貨物的場景,讓開發(fā)人員將應(yīng)用程序及其依賴打包到一個輕量級、可移植的容器中,然后將其發(fā)布到任何運行Docker容器引擎的環(huán)境中,以容器方式運行該應(yīng)用程序。與裝運集裝箱時不用關(guān)心其中的貨物一樣,Docker在操作容器時不關(guān)心容器中有什么軟件。采用這種方式部署和運行應(yīng)用程序非常方便。Docker通過一致的用戶界面進(jìn)行管理,具有為用戶在各種平臺上安全、可靠地部署可伸縮服務(wù)的能力。5.2.1Docker技術(shù)基礎(chǔ)知識3.Docker的優(yōu)勢Docker重新定義了應(yīng)用程序在不同環(huán)境中的移植和運行方式,為跨不同環(huán)境運行的應(yīng)用程序提供了新的解決方案,其優(yōu)勢表現(xiàn)在以下幾個方面。更快的交付和部署高效的資源利用和隔離高可移植性、擴展性與輕量級特性更簡單的維護(hù)和更新管理環(huán)境標(biāo)準(zhǔn)化和版本控制12345Docker開發(fā)人員可以使用鏡像來快速構(gòu)建一套標(biāo)準(zhǔn)的開發(fā)環(huán)境,開發(fā)完成之后,測試和運維人員可以直接部署軟件鏡像來進(jìn)行測試和發(fā)布,以確保開發(fā)、測試過的代碼可以在生產(chǎn)環(huán)境中無縫運行,簡化了持續(xù)集成、測試發(fā)布過程。雖然Docker容器共享主機資源,但是每個容器所使用的CPU、內(nèi)存、文件系統(tǒng)、進(jìn)程、網(wǎng)絡(luò)等都是相互隔離的。Docker的可移植性和輕量級特性也使得動態(tài)管理工作負(fù)載變得非常容易,管理員可以近乎實時地根據(jù)業(yè)務(wù)需要增加或縮減應(yīng)用程序和服務(wù)。Docker的鏡像與鏡像之間不是相互隔離的,它們有松耦合的關(guān)系。Docker是輕量級的應(yīng)用,且運行速度很快。Docker可以保證應(yīng)用程序在整個生命周期中的一致性,保證環(huán)境的一致性和標(biāo)準(zhǔn)化。Docker對軟件及其依賴進(jìn)行標(biāo)準(zhǔn)化打包,在開發(fā)和運維之間搭建了一座“橋梁”,旨在解決開發(fā)和運維之間的矛盾,這是實現(xiàn)DevOps的理想解決方案。5.2.1Docker技術(shù)基礎(chǔ)知識4.容器與虛擬機傳統(tǒng)的虛擬機需要有額外的VMM和虛擬機操作系統(tǒng),而Docker的容器是直接在操作系統(tǒng)層面之上實現(xiàn)的虛擬化。容器與傳統(tǒng)虛擬機的特性比較如表所示。特性容器傳統(tǒng)虛擬機啟動速度秒級分鐘級計算能力損耗幾乎沒有損耗50%左右性能接近原生弱于原生內(nèi)存代價很小較大占用磁盤空間一般為MB級一般為GB級系統(tǒng)支持量(單機)上千個幾十個隔離性資源限制完全隔離遷移性優(yōu)秀一般5.2.1Docker技術(shù)基礎(chǔ)知識容器引擎將容器作為進(jìn)程在主機上運行,各個容器共享主機的操作系統(tǒng),使用的是主機操作系統(tǒng)的內(nèi)核,因此容器依賴于主機操作系統(tǒng)的內(nèi)核版本。虛擬機有自己的操作系統(tǒng),且獨立于主機操作系統(tǒng),其操作系統(tǒng)內(nèi)核可以與主機的不同。容器在主機操作系統(tǒng)的用戶空間內(nèi)運行,并且與操作系統(tǒng)的其他進(jìn)程相互隔離,啟動時也不需要啟動操作系統(tǒng)內(nèi)核空間。因此,與虛擬機相比,容器啟動快、開銷小,且遷移更便捷。就隔離特性來說,容器提供應(yīng)用層面的隔離,虛擬機提供物理資源層面的隔離。當(dāng)然,虛擬機也可以運行容器,此時的虛擬機充當(dāng)主機。Docker與傳統(tǒng)虛擬機架構(gòu)的對比5.2.1Docker技術(shù)基礎(chǔ)知識5.Docker的三大核心概念鏡像、容器、倉庫是Docker的三大核心概念。鏡像和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計中的類和實例一樣。鏡像是靜態(tài)的定義,容器是鏡像運行時的實體,Docker的容器是鏡像創(chuàng)建的應(yīng)用程序運行實例,它可以被啟動、停止和刪除。每一個容器都是互相隔離、互不可見的,以保證平臺的安全性。B倉庫(Repository)可看作代碼控制中心,Docker倉庫是用來集中保存鏡像的地方。當(dāng)開發(fā)人員創(chuàng)建了自己的鏡像之后,可以使用push命令將它上傳到公有(Public)倉庫或者私有(Private)倉庫。CDocker的鏡像(Image)是創(chuàng)建容器的基礎(chǔ),類似虛擬機的快照,可以理解為一個面向Docker容器引擎的只讀模板。A鏡像容器倉庫5.2.1Docker技術(shù)基礎(chǔ)知識6.Docker引擎Docker引擎是用來運行和管理容器的核心軟件,它是目前主流的容器引擎,如圖所示,通常人們會簡單地將其稱為Docker或Docker平臺。Docker引擎由如下主要組件構(gòu)成:Docker客戶端(DockerClient)、Docker守護(hù)進(jìn)程(DockerDaemon)、描述性狀態(tài)遷移(RepresentationalStateTransfer,REST)API,它們共同負(fù)責(zé)容器的創(chuàng)建和運行,包括容器管理、網(wǎng)絡(luò)管理、鏡像管理和卷管理等。Docker引擎的組件5.2.1Docker技術(shù)基礎(chǔ)知識Docker客戶端即命令行接口,可使用Docker命令進(jìn)行操作。命令行接口又稱命令行界面,可以通過命令或腳本使用Docker的RESTAPI來控制Docker守護(hù)進(jìn)程,或者與Docker守護(hù)進(jìn)程進(jìn)行交互。Docker服務(wù)器Docker服務(wù)器中運行Docker守護(hù)進(jìn)程,是Docker的后臺應(yīng)用程序,可使用dockerd命令進(jìn)行管理。Docker守護(hù)進(jìn)程的主要功能包括鏡像管理、鏡像構(gòu)建、RESTAPI支持、身份認(rèn)證、安全管理、核心網(wǎng)絡(luò)編排等。RESTAPI定義程序與Docker守護(hù)進(jìn)程交互的接口,便于編程操作Docker平臺和容器,是一個目前比較成熟的互聯(lián)網(wǎng)API架構(gòu)。Docker引擎的組件介紹:5.2.1Docker技術(shù)基礎(chǔ)知識7.Docker的架構(gòu)Docker的架構(gòu)如圖所示。Docker客戶端:是Docker用戶與Docker交互的主要途徑。使用dockerbuild(創(chuàng)建)、dockerpull(拉?。?、dockerrun(運行)等命令時,Docker客戶端就將這些命令發(fā)送到Docker守護(hù)進(jìn)程來執(zhí)行。Docker主機:一臺主機運行一個Docker守護(hù)進(jìn)程,稱為Docker主機,Docker客戶端與Docker守護(hù)進(jìn)程通信,Docker守護(hù)進(jìn)程充當(dāng)Docker服務(wù)器,負(fù)責(zé)構(gòu)建、運行和分發(fā)容器。Docker客戶端與Docker守護(hù)進(jìn)程可以在同一個系統(tǒng)上運行,也可以讓Docker客戶端連接到遠(yuǎn)程主機上的Docker守護(hù)進(jìn)程后再運行。Docker注冊中心:用于存儲和分發(fā)Docker鏡像,可以理解為代碼控制中的代碼倉庫。DockerHub和DockerCloud是任何人都可以使用的公開注冊中心。Docker的架構(gòu)5.2.1Docker技術(shù)基礎(chǔ)知識8.Docker底層技術(shù)Docker使用了以下幾種底層技術(shù)。它是Linux內(nèi)核針對容器虛擬化而引入的一個強大特性。每個容器都可以擁有自己單獨的命名空間,運行在其中的應(yīng)用都像在獨立的操作系統(tǒng)中運行一樣。它是Linux內(nèi)核的一個特性,主要用來對共享資源進(jìn)行隔離、限制、審計等。只有對分配到容器的資源進(jìn)行控制,才能避免多個容器同時運行時對宿主機系統(tǒng)的資源競爭??刂平M提供資源限制、優(yōu)先級、資源審計、隔離和控制功能。它是一種輕量級的高性能分層文件系統(tǒng),它支持將文件系統(tǒng)中的修改信息作為一次提交,層層疊加,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下,應(yīng)用看到的是掛載的最終結(jié)果。此外,Docker鏡像可以通過分層來進(jìn)行繼承。Docker引擎將命名空間、控制組和聯(lián)合文件系統(tǒng)打包到一起時所使用的就是容器格式。自1.20版本開始,Docker也開始支持新的Libcon
tainer格式,并將其作為默認(rèn)選項。Docker中的網(wǎng)絡(luò)接口默認(rèn)都是虛擬接口。Docker容器網(wǎng)絡(luò)就很好地利用了Linux虛擬網(wǎng)絡(luò)技術(shù),它在本地主機和容器內(nèi)分別創(chuàng)建一個虛擬接口veth,并連通這樣的一對虛擬接口(vethpair)來進(jìn)行通信。命名空間控制組聯(lián)合文件系統(tǒng)容器格式Linux網(wǎng)絡(luò)虛擬化5.2.1Docker技術(shù)基礎(chǔ)知識9.Docker的功能與傳統(tǒng)虛擬機不同,Docker提供輕量的虛擬化容器。Docker容器能夠提供以下幾種功能。12345678快速部署:在虛擬機出現(xiàn)之前,引入新的硬件資源需要消耗幾天的時間,而Docker通過為進(jìn)程僅僅創(chuàng)建一個容器而無須啟動一個操作系統(tǒng),再次將這個時間縮短到了秒級。多租戶環(huán)境:Docker能夠作為云計算的多租戶容器,為每一個租戶的應(yīng)用層的多個實例創(chuàng)建隔離的環(huán)境,得益于Docker靈活的環(huán)境及高效的diff命令。隔離應(yīng)用:Docker允許開發(fā)人員選擇適合各種服務(wù)的工具或技術(shù),隔離服務(wù)以消除任何潛在的沖突。簡化配置:將運行環(huán)境和配置放入代碼中部署,同一個Docker的配置可以在不同的環(huán)境中使用。整合服務(wù)器:相比傳統(tǒng)虛擬機,Docker可以提供更好的服務(wù)器整合解決方案。調(diào)試能力:Docker提供了眾多的工具,它們提供了很多功能,這些功能可以幫助消除容器的缺陷與錯誤。提高開發(fā)效率:使用Docker可以輕易地讓幾十個服務(wù)在容器中運行起來,可以在單機上最大限度地模擬分布式部署的環(huán)境。代碼管道化管理:Docker能夠?qū)Υa以流式管道化的方式進(jìn)行管理。5.2.1Docker技術(shù)基礎(chǔ)知識10.Docker的應(yīng)用目前,Docker的應(yīng)用涉及許多領(lǐng)域,據(jù)Docker官網(wǎng)的資料,對主要的應(yīng)用進(jìn)行如下說明。01OPTION云遷移Docker便于執(zhí)行云遷移策略,可以隨時隨地將應(yīng)用程序交付到任何云端。Docker可以跨越多個云環(huán)境容器化,并在這些環(huán)境中部署傳統(tǒng)應(yīng)用程序和微服務(wù)。Docker企業(yè)版通過可移植的打包功能和統(tǒng)一的運維模式加速云遷移,其具有以下優(yōu)勢。靈活選擇混合云和多云簡化運維使軟件發(fā)布更安全5.2.1Docker技術(shù)基礎(chǔ)知識02OPTION大數(shù)據(jù)應(yīng)用Docker能夠釋放數(shù)據(jù)的信息,將數(shù)據(jù)分析為可操作的觀點和結(jié)果。使用Docker企業(yè)版僅需要數(shù)秒就能部署復(fù)雜的隔離環(huán)境,從而幫助數(shù)據(jù)專家創(chuàng)建、分享和再現(xiàn)他們的研究成果。Docker使數(shù)據(jù)專家能夠快速地迭代模型,具體表現(xiàn)在以下幾個方面。①便于安全協(xié)作。平臺和生命周期中的集成安全性有利于數(shù)據(jù)業(yè)務(wù)的協(xié)作,避免數(shù)據(jù)被篡改和數(shù)據(jù)完整性被破壞的風(fēng)險。②獨立于基礎(chǔ)設(shè)施的Docker平臺使得數(shù)據(jù)專家能夠?qū)?yīng)用程序進(jìn)行最優(yōu)化的數(shù)據(jù)分析,數(shù)據(jù)專家可以選擇并使用適合研究項目的工具和軟件包構(gòu)建模型,無須擔(dān)心應(yīng)用程序與環(huán)境的沖突。③確保研究的可再現(xiàn)性。Docker使用不可變?nèi)萜飨h(huán)境不同帶來的問題,可以確保數(shù)據(jù)分析和研究的可再現(xiàn)性。5.2.1Docker技術(shù)基礎(chǔ)知識03OPTION邊緣計算Docker將容器安全地擴展到網(wǎng)絡(luò)的邊緣,直達(dá)數(shù)據(jù)源頭。邊緣計算指靠近數(shù)據(jù)源頭的計算,常用于收集來自數(shù)百甚至數(shù)千個物聯(lián)網(wǎng)設(shè)備的數(shù)據(jù)。使用容器可以將軟件安全地發(fā)布到網(wǎng)絡(luò)邊緣,在易于修補和升級的輕量級框架上運行容器化的應(yīng)用程序。Docker企業(yè)版提供安全的應(yīng)用程序運維功能來支持邊緣計算。Docker是輕量級的應(yīng)用程序平臺,所支持的應(yīng)用程序的可移植性能確保從核心到云,再到邊緣設(shè)備的無障礙容器部署。Docker提供具有粒度隔離功能的輕量級架構(gòu),可以縮小邊緣容器和設(shè)備的攻擊面。Docker提供安全的軟件發(fā)布,能加快容器發(fā)布到邊緣的速度,并通過Docker注冊中心的鏡像和緩存架構(gòu)提高可用性;Docker確保應(yīng)用程序開發(fā)生命周期的安全,通過數(shù)字簽名、邊緣安全掃描和簽名驗證保證從核心到邊緣的信任鏈完整。5.2.1Docker技術(shù)基礎(chǔ)知識04OPTION現(xiàn)代應(yīng)用程序構(gòu)建和設(shè)計現(xiàn)代應(yīng)用程序應(yīng)以獨立于平臺的方式進(jìn)行。現(xiàn)代應(yīng)用程序支持所有類型的設(shè)備,從手機到便攜式計算機,到臺式計算機,再到其他不同的平臺,這樣可以充分利用現(xiàn)有的后端服務(wù)以及公有云或私有云基礎(chǔ)設(shè)施。Docker可以較完美地容器化應(yīng)用程序,在單一平臺上構(gòu)建、分享和運行現(xiàn)代應(yīng)用程序?,F(xiàn)代應(yīng)用程序包括新的應(yīng)用程序和需要新功能的現(xiàn)有應(yīng)用程序。它們是分布式的,需要基于微服務(wù)架構(gòu)實現(xiàn)敏捷性、靈活性,并提供對基于云的服務(wù)的訪問?,F(xiàn)在應(yīng)用程序?qū)?shù)字化轉(zhuǎn)型至關(guān)重要,但是這些程序與構(gòu)建、分享和運行它的組織一樣復(fù)雜?,F(xiàn)代應(yīng)用程序是創(chuàng)新的關(guān)鍵,它能夠幫助開發(fā)人員和運營商快速創(chuàng)新。Docker對軟件構(gòu)建、分享和運行的方式進(jìn)行標(biāo)準(zhǔn)化,使用漸進(jìn)式創(chuàng)新來解決應(yīng)用開發(fā)和基礎(chǔ)設(shè)施方面的復(fù)雜問題。5.2.1Docker技術(shù)基礎(chǔ)知識05OPTION數(shù)字化轉(zhuǎn)型Docker通過容器化實現(xiàn)數(shù)字化轉(zhuǎn)型,與現(xiàn)有人員、流程和容器平臺一起推動業(yè)務(wù)創(chuàng)新。Docker企業(yè)版支持現(xiàn)有應(yīng)用程序的數(shù)字化轉(zhuǎn)型,其具體措施如下。①自由選擇實現(xiàn)技術(shù)。Docker可以在不受廠商限定的基礎(chǔ)結(jié)構(gòu)上構(gòu)建和部署絕大多數(shù)應(yīng)用程序,可以使用大部分操作系統(tǒng)、編程語言和技術(shù)棧構(gòu)建應(yīng)用程序。②保證運維敏捷性。Docker通過新的技術(shù)和創(chuàng)新服務(wù)來加快產(chǎn)品上線速度,實現(xiàn)較高客戶服務(wù)水平的敏捷運維,快速實現(xiàn)服務(wù)交付、補救、恢復(fù)和服務(wù)的高可用性。③保證集成安全性。Docker確保法規(guī)遵從性并在動態(tài)IT環(huán)境中提供安全保障。5.2.1Docker技術(shù)基礎(chǔ)知識06OPTION微服務(wù)Docker通過容器化微服務(wù)激發(fā)開發(fā)人員的創(chuàng)造力,使開發(fā)人員更快地開發(fā)軟件。微服務(wù)用于替代大型的單體應(yīng)用程序,其架構(gòu)是一個獨立部署的服務(wù)集合,每個服務(wù)都有自己的功能。微服務(wù)是模塊化的,在整個架構(gòu)中每個服務(wù)獨立運行自己的應(yīng)用。Docker為容器化微服務(wù)提供通用平臺,Docker企業(yè)版可以使基于微服務(wù)架構(gòu)的應(yīng)用程序的構(gòu)建、發(fā)布和運行標(biāo)準(zhǔn)化、自動化,其主要優(yōu)勢如下。1234受開發(fā)人員歡迎。開發(fā)人員可以為每個服務(wù)選擇合適的工具和編程語言具有內(nèi)在安全性。Docker驗證應(yīng)用程序的可信度,構(gòu)建從開發(fā)環(huán)境到生產(chǎn)環(huán)境的安全通道,通過標(biāo)準(zhǔn)化和自動化配置減少容易出錯的手動設(shè)置來降低風(fēng)險。有助于高速創(chuàng)新。Docker支持快速編碼、測試和協(xié)作在軟件日趨復(fù)雜的情況下,微服務(wù)架構(gòu)是彈性擴展、快速迭代的主流方案。微服務(wù)有助于負(fù)責(zé)單個服務(wù)的小團(tuán)隊降低溝通成本、提高效率。5.2.2Docker鏡像基礎(chǔ)知識1.Docker鏡像鏡像又譯為映像,在IT領(lǐng)域通常是指一系列文件或一個磁盤驅(qū)動器的精確副本。例如,一個Linux鏡像可以包含一個基本的Linux操作系統(tǒng)環(huán)境,其中僅安裝了Nginx應(yīng)用程序和用戶需要的其他應(yīng)用,可以將其稱為一個Nginx鏡像在云計算環(huán)境下,鏡像就是虛擬機模板,它預(yù)先安裝基本的操作系統(tǒng)和其他軟件,創(chuàng)建虛擬機時首先需要準(zhǔn)備一個鏡像,然后啟動一個或多個鏡像的實例即可。與虛擬機類似,Docker鏡像用于創(chuàng)建容器的只讀模板,它包含文件系統(tǒng),而且比虛擬機更輕巧。鏡像是Docker的核心技術(shù)之一,也是應(yīng)用發(fā)布的標(biāo)準(zhǔn)格式。Docker鏡像類似于虛擬機中的鏡像,是一個只讀的模板,也是一個獨立的文件系統(tǒng),包括運行容器所需的數(shù)據(jù)。Docker鏡像是按照Docker要求制作的應(yīng)用程序,安裝Docker鏡像就像安裝軟件包一樣。5.2.2Docker鏡像基礎(chǔ)知識Docker鏡像是Docker容器的靜態(tài)表示,包括Docker容器所要運行的應(yīng)用的代碼及運行時的配置。Docker鏡像采用分層的方式構(gòu)建,每個鏡像均由一系列的鏡像層和一層容器層組成,鏡像一旦被創(chuàng)建就無法再被修改。一個運行中的Docker容器是一個Docker鏡像的實例,當(dāng)需要修改容器的某個文件時,只能對處于最上層的可寫層(容器層)進(jìn)行變動,而不能覆蓋其下只讀層(鏡像層)的內(nèi)容。如右圖所示,可寫層位于若干只讀層之上,運行Docker容器時的所有變化,包括對數(shù)據(jù)和文件的寫操作及更新操作,都會保存在可寫層中。同時,Docker鏡像采用了寫時復(fù)制策略,多個容器共享鏡像。每個容器在啟動的時候并不需要單獨復(fù)制一份鏡像文件,而是將所有鏡像層以只讀的方式掛載到一個掛載點,在上面覆蓋一個可寫的容器層。Docker鏡像的分層結(jié)構(gòu)5.2.2Docker鏡像基礎(chǔ)知識2.Docker鏡像倉庫Docker架構(gòu)中的鏡像倉庫是非常重要的,鏡像會因業(yè)務(wù)需求的不同以不同的形式存在,這就需要一種很好的機制對這些鏡像進(jìn)行管理,而鏡像倉庫就很好地解決了這個問題。鏡像倉庫是集中存放鏡像的地方,分為公有倉庫和私有倉庫。Docker注冊服務(wù)器是存放倉庫的地方,可以包含多個倉庫,各個倉庫根據(jù)不同的標(biāo)簽和鏡像名管理各種Docker鏡像。一個鏡像倉庫中可以包含同一款軟件的不同鏡像,利用標(biāo)簽進(jìn)行區(qū)分,可以利用<倉庫名>:<標(biāo)簽名>的格式來指定相關(guān)軟件鏡像的版本。倉庫名通常以兩段路徑形式出現(xiàn),以斜線為分隔符,可包含可選的主機名前綴。主機名必須符合標(biāo)準(zhǔn)的DNS規(guī)則,不能包含下畫線。如果存在主機名,則可以在其后加一個端口號,否則,使用默認(rèn)的公有倉庫。例如,CentOS/nginx:version3.1.test表示倉庫名為CentOS、鏡像名為nginx、標(biāo)簽名為version3.1.test的鏡像。5.2.2Docker鏡像基礎(chǔ)知識01OPTION公有倉庫公有倉庫(DockerHub)是默認(rèn)的DockerRegistry,由Docker公司維護(hù),其中擁有大量高質(zhì)量的官方鏡像,供用戶免費上傳、下載和使用。也存在其他提供收費服務(wù)的倉庫。DockerHub具有如下特點。①倉庫名稱前沒有命名空間②穩(wěn)定、可靠、干凈③數(shù)量大、種類多由于跨地域訪問和源地址不穩(wěn)定等原因,在國內(nèi)訪問DockerHub時,存在訪問速度比較慢且容易報錯的問題,可以通過配置Docker鏡像加速器來解決這個問題。加速器表示鏡像代理,只代理公共鏡像。通過配置Docker鏡像加速器可以從國內(nèi)的地址下載DockerHub的鏡像,比直接從官方網(wǎng)站下載快得多。國內(nèi)常用的鏡像加速器來自華為、中科大和阿里云等公司或機構(gòu)。5.2.2Docker鏡像基礎(chǔ)知識02OPTION私有倉庫雖然公有倉庫有很多優(yōu)點,但是也存在一些問題。例如,一些企業(yè)級的私有鏡像,涉及一些機密的數(shù)據(jù)和軟件,私密性比較強,因此不太適合放在公有倉庫中。此外,出于安全考慮,一些公司不允許通過公司內(nèi)網(wǎng)服務(wù)器環(huán)境訪問外網(wǎng),因此無法下載公有倉庫的鏡像。為了解決這些問題,可以根據(jù)需要搭建私有倉庫,存儲私有鏡像。私有倉庫具有如下特點。①自主控制、方便存儲和可維護(hù)性高②安全性和私密性高③訪問速度快私有倉庫可以通過docker-registry項目來實現(xiàn),通過超文本傳輸安全協(xié)議(HypertextTransferProtocolSecure,HTTPS)服務(wù)完成鏡像的上傳、下載。5.2.2Docker鏡像基礎(chǔ)知識3.鏡像描述文件DockerfileDocker使用Dockerfile文件來描述鏡像,采用與Makefile同樣的機制,定義了如何構(gòu)建Docker鏡像。Dockerfile是一個文本文件,包含用來構(gòu)建鏡像的所有命令。Docker通過讀取Dockerfile中的指令自動構(gòu)建鏡像。在驗證Docker是否成功安裝時已經(jīng)獲取了hello-world鏡像,這是Docker官方提供的一個最小的鏡像,它的Dockerfile內(nèi)容只有3行,具體如下所示。FROMscratchCOPYhello/CMD["/hello"]其中,第
1
行的
FROM
指令定義了所有的基礎(chǔ)鏡像,即該鏡像從哪個鏡像開始構(gòu)建,scratch表示空白鏡像,即該鏡像不依賴其他鏡像,從“零”開始構(gòu)建;第2行表示將hello文件復(fù)制到鏡像的根目錄下;第3行意味著通過鏡像啟動容器時執(zhí)行/hello這個可執(zhí)行文件。5.2.2Docker鏡像基礎(chǔ)知識一個鏡像的父鏡像(ParentImage)是指該鏡像的Dockerfile文件中由FROM指定的鏡像。所有后續(xù)的指令都應(yīng)用到這個父鏡像中。例如:FROMCentOS:8.4基于提供FROM指令,或提供FROMscratch指令的Dockerfile所構(gòu)建的鏡像被稱為基礎(chǔ)鏡像(BaseImage)。Docker官方提供的基礎(chǔ)鏡像通常都是各種Linux發(fā)行版的鏡像,如CentOS、Debian、Ubuntu等,對Debian鏡像來說,底層直接共享主機的Linux內(nèi)核,自己只需要提供根文件系統(tǒng)即可,而根文件系統(tǒng)上只安裝基本的軟件,這樣可以節(jié)省空間。以Debian鏡像的Dockerfile內(nèi)容為例進(jìn)行介紹。FROMscratchADDrootfs.tar.xz/CMD["bash"]4.基礎(chǔ)鏡像說明其父鏡像為“CentOS:8.4”其中,第2行表示將Debian的rootfs壓縮包添加到容器的根目錄下。5.2.2Docker鏡像基礎(chǔ)知識早期鏡像分層結(jié)構(gòu)是通過聯(lián)合文件系統(tǒng)實現(xiàn)的,聯(lián)合文件系統(tǒng)將各層的文件系統(tǒng)疊加在一起,向用戶呈現(xiàn)一個完整的文件系統(tǒng),如圖所示。以鏡像A為例,用戶可以訪問file01、file02、file03、file04這4個文件,即使它們位于不同的層中。5.基于聯(lián)合文件系統(tǒng)的鏡像分層這種分層結(jié)構(gòu)的優(yōu)點①方便資源共享。②便于鏡像的修改。這種分層結(jié)構(gòu)的缺點①上層的鏡像都基于相同的底層基礎(chǔ)鏡像,當(dāng)基礎(chǔ)鏡像需要修改(如安全漏洞修補),而基于它的上層鏡像通過容器生成時,維護(hù)工作量會變得相當(dāng)大。②鏡像的使用者無法對鏡像進(jìn)行審查,存在一定的安全隱患。③會導(dǎo)致鏡像的層數(shù)越來越多,而聯(lián)合文件系統(tǒng)所允許的層數(shù)是有限的。④當(dāng)需要修改大文件時,以文件為粒度的寫時復(fù)制需要復(fù)制整個大文件再對其進(jìn)行修改,這會影響操作效率。5.2.2Docker鏡像基礎(chǔ)知識為彌補上述鏡像分層結(jié)構(gòu)的不足,Docker推薦選擇Dockerfile文件逐層構(gòu)建鏡像。大多數(shù)Docker鏡像是在其他鏡像的基礎(chǔ)上逐層建立起來的,采用這種方式構(gòu)建鏡像時,每一層都由鏡像的Dockerfile指令所決定。除了最后一層外,每層都是只讀的。6.基于Dockerfile文件的鏡像分層5.2.2Docker鏡像基礎(chǔ)知識Docker的三大核心概念是鏡像、容器和倉庫,它們貫穿Docker虛擬化應(yīng)用的整個生命周期。容器是鏡像創(chuàng)建的運行實例,Docker應(yīng)用程序以容器方式部署和運行。一個鏡像可以用來創(chuàng)建多個容器,容器之間都是相互隔離的。Docker倉庫又稱鏡像倉庫,類似于代碼倉庫,是集中存放鏡像文件的場所??梢詫⒅谱骱玫溺R像推送到倉庫以發(fā)布應(yīng)用程序,也可以將所需要的鏡像從倉庫拉取到本地以創(chuàng)建容器來部署應(yīng)用程序。注冊中心用于存放鏡像倉庫,一個注冊中心可以提供很多倉庫。7.鏡像、容器和倉庫的關(guān)系鏡像、容器和倉庫的關(guān)系5.2.3Docker常用命令Docker提供了若干鏡像操作命令,如dockerpull用于拉?。ㄏ螺d)鏡像,dockerimage用于生成鏡像列表等,這些命令可看作docker命令的子命令。被操作的鏡像對象可以使用鏡像ID、鏡像名稱或鏡像摘要值進(jìn)行標(biāo)識。有些命令可以操作多個鏡像,鏡像之間使用空格分隔。Docker新版本提供了一個統(tǒng)一的鏡像操作命令dockerimage,其基本語法如下。dockerimage子命令用于實現(xiàn)鏡像的各類管理操作功能,其大多與傳統(tǒng)的鏡像操作docker子命令相對應(yīng),功能和語法也類似,只有個別不同。dockerimage子命令5.2.3Docker常用命令dockerimage子命令docker子命令功能說明dockerimagebuilddockerbuild根據(jù)Dockerfile文件構(gòu)建鏡像dockerimagehistorydockerhistory顯示鏡像的歷史記錄dockerimageimportdockerimport從Tarball文件中導(dǎo)入內(nèi)容以創(chuàng)建文件系統(tǒng)鏡像dockerimageinspectdockerinspect顯示一個或多個鏡像的詳細(xì)信息dockerimageloaddockerload從.tar文件或STDIN中裝載鏡像dockerimagelsdockerimages輸出本地鏡像列表dockerimagepulldockerpull從注冊中心拉取鏡像或鏡像倉庫dockerimagepushdockerpush將鏡像或鏡像倉庫推送到注冊中心dockerimagermdockerrm刪除一個或多個鏡像dockerimageprune—刪除未使用的鏡像dockerimagesavedockersave將一個或多個鏡像保存到.tar文件中dockerimagetagdockertag為指向源鏡像的目標(biāo)鏡像添加一個名稱5.2.3Docker常用命令可以使用dockerimages命令來列出本地主機上的所有鏡像,其語法格式如下。dockerimages[選項][倉庫[:標(biāo)簽]]1.顯示本地的鏡像列表可使用--help命令查詢命令參數(shù),執(zhí)行命令如下。[root@localhost~]#dockerimages--help命令執(zhí)行結(jié)果如下。Usage:dockerimages[OPTIONS][REPOSITORY[:TAG]]ListimagesOptions:
-a,--all Showallimages(defaulthidesintermediateimages)--digests Showdigests
-f,--filterfilter Filteroutputbasedonconditionsprovided--formatstring Pretty-printimagesusingaGotemplate--no-trunc Don'ttruncateoutput
-q,--quiet OnlyshowimageIDs[root@localhost~]#5.2.3Docker常用命令dockerimages命令常用選項及其功能說明如表所示。選項功能說明-a,--all表示列出本地所有鏡像--digest表示可顯示內(nèi)容尋址標(biāo)識符-f,--filterfilter表示顯示符合過濾條件的鏡像,如果有超過一個鏡像,那么使用多個-f選項--no-trunc表示顯示完整的鏡像信息-q,--quiet表示只顯示鏡像ID各字段的說明REPOSITORY:鏡像的倉庫源。TAG:鏡像的標(biāo)簽。IMAGEID:鏡像ID。CREATED:鏡像創(chuàng)建時間。SIZE:鏡像大小。命令執(zhí)行結(jié)果(查看本地鏡像列表)5.2.3Docker常用命令在本地運行容器時,若使用一個不存在的鏡像,則Docker會自動下載這個鏡像。如果需要預(yù)先下載這個鏡像,則可以使用dockerpull命令,也就是將它從鏡像倉庫(默認(rèn)為DockerHub上的公有倉庫)下載到本地,完成之后可以直接使用這個鏡像來運行容器。例如,拉取一個debian:latest版本的鏡像,命令執(zhí)行結(jié)果如圖所示。2.拉取鏡像使用dockerpull命令從鏡像的倉庫源拉取鏡像,或者從一個本地不存在的鏡像創(chuàng)建容器時,鏡像的每層都是單獨拉取的,并將鏡像保存在Docker的本地存儲區(qū)域(在Linux主機上通常是/var/lib/docker目錄)中。5.2.3Docker常用命令可以使用dockertag命令為鏡像添加一個新的標(biāo)簽,也就是給鏡像命名,這實際上是為指向源鏡像的目標(biāo)鏡像添加一個名稱,其語法格式如下。3.設(shè)置鏡像標(biāo)簽一個完整的鏡像名稱的結(jié)構(gòu)如下。dockertag源鏡像[:標(biāo)簽]目標(biāo)鏡像[:標(biāo)簽][主機名:端口]/命名空間/倉庫名稱:[標(biāo)簽]一個鏡像名稱由以斜線分隔的名稱組件組成,名稱組件通常包括命名空間和倉庫名稱。標(biāo)簽是可選的,可以包含小寫字母和大寫字母、數(shù)字、下畫線、句點和破折號,但不能以句點和破折號開頭,且最長支持128個字符,如centos8.4。名稱組件前面可以加上主機名前綴,主機名是提供鏡像倉庫的注冊服務(wù)器的域名或IP地址,必須符合標(biāo)準(zhǔn)的DNS規(guī)則,但不能包含下畫線。一個鏡像可以有多個鏡像名稱,相當(dāng)于有多個別名。但無論采用何種方式保存和分發(fā)鏡像,首先都要給鏡像設(shè)置標(biāo)簽(重命名),這對鏡像的推送特別重要。為以鏡像ID標(biāo)識的鏡像加上標(biāo)簽,以centos:
version8.4為例進(jìn)行介紹,命令執(zhí)行結(jié)果如下圖所示。5.2.3Docker常用命令使用dockersearch命令可以搜索DockerHub中的鏡像。例如,查找名為centos的鏡像,可以使用dockersearchcentos命令,命令執(zhí)行結(jié)果如圖所示。4.查找鏡像其中,NAME列顯示了鏡像倉庫(源)名稱,OFFICIAL列指明了鏡像是否為Docker官方發(fā)布的。查找名為centos的鏡像5.2.3Docker常用命令使用dockerinspect命令查看Docker對象(鏡像、容器、任務(wù))的詳細(xì)信息,默認(rèn)情況下,以JavaScript對象簡譜(JavaScriptObjectNotaion,JSON)格式輸出所有結(jié)果,當(dāng)只需要其中的特定內(nèi)容時,可以使用-f(--format)選項指定。例如,查看centos鏡像的版本信息,命令執(zhí)行結(jié)果如圖所示。5.查看鏡像詳細(xì)信息查看centos鏡像的版本信息5.2.3Docker常用命令使用dockerhistory命令可以查看鏡像的構(gòu)建歷史,也就是Dockerfile的執(zhí)行過程。例如,查看centos鏡像的構(gòu)建歷史信息,命令執(zhí)行結(jié)果如圖所示。6.查看鏡像的構(gòu)建歷史查看centos鏡像的構(gòu)建歷史信息鏡像的構(gòu)建歷史信息也反映了層次。上圖所示的示例中共有3層,每一層的構(gòu)建操作命令都可以通過CREATEDBY列顯示,如果顯示不全,則可以在命令中加上--no-trunc選項,以顯示完整的操作命令。鏡像的各層相當(dāng)于一個子鏡像。例如,第2次構(gòu)建的鏡像相當(dāng)于在第1次構(gòu)建的鏡像的基礎(chǔ)上形成的新的鏡像,以此類推,最新構(gòu)建的鏡像是歷次構(gòu)建結(jié)果的累加。5.2.3Docker常用命令可以使用dockerrmi命令來刪除本地主機上的鏡像,其語法格式如下。7.刪除本地鏡像可以使用鏡像ID、標(biāo)簽或鏡像摘要標(biāo)識符來指定要刪除的鏡像。如果一個鏡像對應(yīng)了多個標(biāo)簽,則只有當(dāng)最后一個標(biāo)簽被刪除時,鏡像才能被真正刪除。可使用--help命令查詢命令參數(shù),執(zhí)行命令如下。dockerrmi[選項]鏡像[鏡像ID/標(biāo)簽/鏡像摘要標(biāo)識符][root@localhost~]#dockerrmi--help命令執(zhí)行結(jié)果如下。Usage:dockerrmi[OPTIONS]IMAGE[IMAGE...]RemoveoneormoreimagesOptions:
-f,--forceForceremovaloftheimage--no-pruneDonotdeleteuntaggedparents[root@localhost~]#5.2.3Docker常用命令dockerrmi命令常用選項及其功能說明如表所示。選項功能說明-f,--force刪除鏡像標(biāo)簽,并刪除與指定鏡像ID匹配的所有鏡像--no-prune不刪除沒有標(biāo)簽的父鏡像例如,刪除本地鏡像hello-world-01,鏡像ID為bc4bae38a9e6,命令執(zhí)行結(jié)果如左圖所示。5.2.4Dockerfile相關(guān)知識基于Dockerfile構(gòu)建鏡像時使用dockerbuild命令,其基本語法如下。1.Dockerfile構(gòu)建鏡像的基本語法Dockerfile可以非常容易地定義鏡像內(nèi)容,它是由一系列指令和參數(shù)構(gòu)成的腳本,每一條指令構(gòu)建一層,因此每一條指令的作用就是描述該層應(yīng)當(dāng)如何構(gòu)建。一個Dockerfile包含構(gòu)建鏡像的完整指令,Docker通過讀取一系列Dockerfile指令自動構(gòu)建鏡像。Dockerfile的結(jié)構(gòu)大致分為4個部分:基礎(chǔ)鏡像信息、維護(hù)者信息、鏡像操作指令和容器啟動時的執(zhí)行指令。Dockerfile中每行為一條指令,每條指令可攜帶多個參數(shù),支持使用以“#”開頭的注釋。dockerbuild[選項]路徑|URL|-該命令通過Dockerfile和構(gòu)建上下文(BuildContext)構(gòu)建鏡像。構(gòu)建上下文是由文件路徑(本地文件系統(tǒng)上的目錄)或統(tǒng)一資源定位符(UniformResourceLocator,URL)定義的一組文件。構(gòu)建上下文以遞歸方式處理,本地路徑包括其中的任何子目錄,URL包括倉庫及其子模塊。5.2.4Dockerfile相關(guān)知識鏡像構(gòu)建由Docker守護(hù)進(jìn)程而不是命令行接口運行,構(gòu)建開始時,Docker會將整個構(gòu)建上下文遞歸地發(fā)送給守護(hù)進(jìn)程。一定要注意不要將多余的文件放到構(gòu)建上下文中,特別是不要把/、/usr路徑作為構(gòu)建上下文,否則構(gòu)建過程會相當(dāng)緩慢甚至失敗。要使用構(gòu)建上下文中的文件,可由Dockerfile引用指令(如COPY)指定文件。
按照習(xí)慣,將Dockerfile文件直接命名為“Dockerfile”,并置于構(gòu)建上下文的根目錄。否則,執(zhí)行鏡像構(gòu)建時就需要使用-f選項指定Dockerfile文件的具體位置。dockerbuild-fDockerfile文件路徑.句點(.)表示當(dāng)前路徑??梢酝ㄟ^-t(--tag)選項指定構(gòu)建的新鏡像的倉庫名和標(biāo)簽,例如:dockerbuild-tdebian/debian_sshd.要將鏡像標(biāo)記為多個倉庫,就要在使用dockerbuild命令時添加多個-t選項,例如:dockerbuild-tdebian/debian_sshd:1.0.1-tdebian/debian_sshd:latest.5.2.4Dockerfile相關(guān)知識Dockerfile的格式如下。2.Dockerfile格式#注釋指令參數(shù)指令不區(qū)分字母大小寫,但建議使用大寫字母,指令可以指定若干參數(shù)。其他說明Docker按順序執(zhí)行其中的指令,Dockerfile文件必須以FROM指令開頭,該指令定義了構(gòu)建鏡像的基礎(chǔ)鏡像,F(xiàn)ROM指令之前唯一允許使用的是ARG指令,用于定義環(huán)境變量。以“#”開頭的行一般被視為注釋,除非該行是解析器指令(ParserDirective),行中其他位置的“#”符號將被視為參數(shù)的一部分。解析器指令是可選的,它會影響處理Dockerfile中后續(xù)行的方式。構(gòu)建器用于構(gòu)建復(fù)雜對象,如構(gòu)建一個對象需要傳入3個參數(shù),那么可以定義構(gòu)建器接口,將參數(shù)傳入接口構(gòu)建相關(guān)對象。5.2.4Dockerfile相關(guān)知識3.Dockerfile常用指令指令功能說明FROM鏡像指定新鏡像所基于的鏡像,Dockerfile文件第一條指令必須為FROM指令,每創(chuàng)建一個鏡像就需要一條FROM指令MAINTAINER名稱說明新鏡像的維護(hù)人信息RUN命令基于鏡像執(zhí)行命令,并提交到新的鏡像中CMD命令["可執(zhí)行程序","參數(shù)1","參數(shù)2"]啟動容器時要運行的命令或者腳本。Dockerfile只能有一條CMD指令,即使指定多條CMD指令,也只執(zhí)行最后一條CMD指令EXPOSE端口指定新鏡像加載到Docker時要開啟的端口ENV命令[環(huán)境變量][變量值]設(shè)置一個環(huán)境變量的值,會被后面的RUN指令用到LABEL向鏡像添加標(biāo)記ADD源文件/目錄目標(biāo)文件/目錄將源文件復(fù)制到目標(biāo)文件中,源文件/目標(biāo)文件要與Dockerfile位于相同目錄或同一個URL下ENTRYPOINT配置容器的默認(rèn)入口點COPY源文件/目錄目標(biāo)文件/目錄將本地主機上的源文件/目錄復(fù)制到目標(biāo)文件/目錄中,源文件/目錄要與Dockerfile在相同目錄中VOLUME["目錄"]在容器中創(chuàng)建一個掛載點USER用戶名/UID指定運行容器時的用戶WORKDIR路徑為后續(xù)的RUN、CMD、ENTRYPOINT指定工作目錄ONUUILD命令指定所生成的鏡像作為一個基礎(chǔ)鏡像時要運行的命令HEALTHCHECK健康檢查5.2.4Dockerfile相關(guān)知識在編寫Dockerfile時,需要遵循嚴(yán)格的格式:第一行必須使用FROM指令指明所基于的鏡像名稱,之后使用MAINTAINER指令說明維護(hù)該鏡像的用戶信息,然后是鏡像操作的相關(guān)指令,如RUN指令。每運行一條指令,都會給基礎(chǔ)鏡像添加新的一層,最后使用CMD指令指定啟動容器時要運行的命令。下面介紹常用的Dockerfile指令。FROM<鏡像>[AS<名稱>]FROM<鏡像>[:<標(biāo)簽>][AS<名稱>]FROM<鏡像>[@<摘要值>][AS<名稱>]01OPTIONFROMFROM指令可以使用以下3種格式。FROM為后續(xù)指令設(shè)置基礎(chǔ)鏡像,鏡像參數(shù)可以指定為任何有效的鏡像,特別是從公有倉庫下載的鏡像。FROM可以在同一個Dockerfile文件中多次出現(xiàn),以創(chuàng)建多個鏡像層?!皹?biāo)簽”“摘要值”參數(shù)是可選的,如果省略其中任何一個,則構(gòu)建器將默認(rèn)使用“l(fā)atest”作為要生成的鏡像的標(biāo)簽;如果構(gòu)建器與標(biāo)簽不匹配,則構(gòu)建器將提示錯誤。可以通過添加“AS<名稱>”來為構(gòu)建的鏡像指定一個名稱。這個名稱可用于在后續(xù)的FROM指令和COPY--from=<name|index>指令中引用此階段構(gòu)建的鏡像。5.2.4Dockerfile相關(guān)知識RUN<命令>RUN["可執(zhí)行程序","參數(shù)1","參數(shù)2"]02OPTIONRUNRUN指令可以使用以下2種格式。第1種是shell格式,命令在Shell環(huán)境中運行,在Linux操作系統(tǒng)中默認(rèn)為/bin/sh–c命令;第2種是exec格式,不會啟動Shell環(huán)境。RUN指令將在當(dāng)前鏡像頂部創(chuàng)建新的層,在其中執(zhí)行所定義的命令并提交結(jié)果,提交結(jié)果產(chǎn)生的鏡像將用于Dockerfile的下一步處理。分層的RUN指令和生成的提交結(jié)果符合Docker的核心理念。提交結(jié)果非常容易,可以從鏡像歷史中的任何節(jié)點創(chuàng)建容器,這與軟件源代碼控制非常類似。exec格式可以避免shell格式的字符串轉(zhuǎn)換問題,能夠使用不包含指定shell格式可執(zhí)行文件的基礎(chǔ)鏡像來執(zhí)行RUN命令。在shell格式中,可以使用反斜線“\”將單個RUN指令延續(xù)到下一行,也可以將這兩行指令合并到一行中。如果不使用/bin/sh,改用其他Shell,則需要使用exec格式并以參數(shù)形式傳入所要使用的Shell,如:RUN["/bin/bash","-c","echohello"]5.2.4Dockerfile相關(guān)知識CMD["可執(zhí)行程序","參數(shù)1","參數(shù)2"]CMD["參數(shù)1","參數(shù)2"]CMD命令,參數(shù)1,參數(shù)203OPTIONCMDCMD指令可以使用以下3種格式。第1種是首選的exec格式;第2種用于為ENTRYPOINT指令提供默認(rèn)參數(shù);第3種是shell格式。FROMcentosCMDecho"helloeveryone."|wcCMD指令使用shell格式或exec格式設(shè)置運行鏡像時要執(zhí)行的命令,如果使用shell格式,則命令將在/bin/sh–c語句中執(zhí)行,例如:FROMcentosCMD["/usr/bin/wc","--help"]如果不使用Shell執(zhí)行命令,則必須使用JSON格式的命令,并給出可執(zhí)行文件的完整路徑。這種形式是CMD的首選形式,任何附加參數(shù)都必須以字符串的形式提供,例如:注意,不要混淆RUN和CMD。RUN實際執(zhí)行命令并提交結(jié)果;CMD在構(gòu)建鏡像時不執(zhí)行任何命令,只為鏡像定義想要執(zhí)行的命令。5.2.4Dockerfile相關(guān)知識EXPOSE<端口>[<端口>…]04OPTIONEXPOSEEXPOSE指令的語法格式如下。EXPOSE指令通知容器在運行時監(jiān)聽指定的網(wǎng)絡(luò)端口,可以指定傳輸控制協(xié)議(TransmissionControlProtocol,TCP)或用戶數(shù)據(jù)報協(xié)議(UserDatagramProtocol,UDP)端口,默認(rèn)指定TCP端口。EXPOSE不會發(fā)布該端口,只起聲明作用。在運行容器時要想發(fā)布端口,可以使用-p選項發(fā)布一個或多個端口,或者使用-P選項發(fā)布所有暴露的端口。5.2.4Dockerfile相關(guān)知識ENV<鍵><值>ENV<鍵>=<值>…05OPTIONENVENV指令可以使用以下2種格式。ENV指令以鍵值對的形式定義環(huán)境變量。其中,值會存在于構(gòu)建鏡像階段的所有后續(xù)指令環(huán)境中,也可以在運行時被指定的環(huán)境變量替換。兩種格式說明第1種格式:將單個變量設(shè)置為一個值,ENV指令第1個鍵值空格后面的整個字符串將被視為值的一部分,包括空格和引號等字符。第2種格式:允許一次設(shè)置多個變量,可以使用等號,而第1種格式不使用等號。與命令行解析類似,反引號和反斜線可用于轉(zhuǎn)義空格。5.2.4Dockerfile相關(guān)知識LABEL<鍵>=<值><鍵>=<值>…06OPTIONLABELLABEL指令的語法格式如下。每個標(biāo)簽以鍵值對的形式表示。要想在其中包含空格,應(yīng)使用反引號和反斜線進(jìn)行轉(zhuǎn)義,就像在命令行解析中一樣,例如:LABELversion="8.4"LABELdescription="這個鏡像的版本為\CentOS8.4"一個鏡像可以有多個標(biāo)簽。要想指定多個標(biāo)簽,Docker建議盡可能將它們合并到單條LABEL指令中。這是因為每條LABEL指令會產(chǎn)生一個新層,如果使用多條LABEL指令指定標(biāo)簽,則可能會生成效率低下的鏡像層。5.2.4Dockerfile相關(guān)知識ADD[--chown=<用戶>:<組>]<源文件>…<目的文件>ADD[--chown=<用戶>:<組>]["<源文件>",…,"<目的文件>"]07OPTIONADDADD指令可以使用以下2種語法格式。ADD指令與COPY指令的功能基本相同,不同之處有兩點:一是ADD指令可以使用URL指定路徑;二是ADD指令的歸檔文件(.tar文件)在復(fù)制過程中能夠被自動解壓縮。文件歸檔遵循文件的形成規(guī)律,保持文件之間的有機聯(lián)系,以便于保管和利用。在源是遠(yuǎn)程URL的情況下,復(fù)制產(chǎn)生的目的文件將具有數(shù)字600所表示的權(quán)限,即只有所有者可讀寫,其他人不可訪問。如果源文件是URL,而目的路徑不以斜線結(jié)尾,則下載URL指向的文件,并將其復(fù)制到目的路徑中。如果源文件是URL,并且目的路徑以斜線結(jié)尾,則從URL中解析出文件名,并將文件下載到“<目的路徑>/<文件名>”中。如果源文件是具有可識別的壓縮格式的本地.tar文件,則將其解壓縮為目錄,來自遠(yuǎn)程URL的資源不會被解壓縮。5.2.4Dockerfile相關(guān)知識ENTRYPOINT["可執(zhí)行文件","參數(shù)1","參數(shù)2"]ENTRYPOINT命令參數(shù)1參數(shù)208OPTIONENTRYPOINTENTRYPOINT指令可以使用以下2種語法格式。ENTRYPOINT用于配置容器運行的可執(zhí)行文件。例如,下面的示例將使用Nginx鏡像的默認(rèn)內(nèi)容啟動監(jiān)聽端口80。第1種是首選的exec格式;第2種是shell格式。ENTRYPOINT["/bin/echo","hello!$name"]dockerrun-i-t–rm-p80:80nginxdockerrun<鏡像>的命令參數(shù)將附加在exec格式的ENTRYPOINT指令定義的所有元素之后,并將覆蓋使用CMD指令所指定的所有元素。shell格式的ENTRYPOINT指令禁止使用任何CMD指令參數(shù)或run命令參數(shù),其缺點是ENTRYPOINT指令將作為/bin/sh-c的子命令啟動,不傳遞任何其他信息。5.2.4Dockerfile相關(guān)知識COPY[--chown=<用戶>:<組>]<源路徑>…<目的路徑>COPY[--chown=<用戶>:<組>]["<源路徑>",…,"<目的路徑>"]09OPTIONCOPYCOPY指令可以使用以下2種語法格式。COPY指令將指定源路徑的文件或目錄復(fù)制到容器文件系統(tǒng)指定的目的路徑中,COPY指令可以指定多個源路徑,但文件和目錄的路徑將被視為相對于構(gòu)建上下文的源路徑,每個源路徑可能包含通配符,匹配時將使用Go的filepath.Match規(guī)則,例如:其中,--chown選項只能用于構(gòu)建LXC,不能在Windows容器上工作。COPYfil*/var/data #添加(復(fù)制)所有以“fil”開頭的文件到/var/data目錄中COPYfil?.txt/var/data #“?”用于替換任何單字符(如“file.txt”)COPYfile-testdata-dir/ #將“file-test”添加到相對路徑/data-dir/下COPYfile-test/data-dir/ #將“file-test”添加到絕對路徑/data-dir/下目的路徑可以是絕對路徑,也可以是相對于工作目錄的路徑(由WORKDIR指令指定),例如:5.2.4Dockerfile相關(guān)知識09OPTIONCOPYCOPY指令遵守如下復(fù)制規(guī)則。①源路徑必須位于構(gòu)建上下文中,不能使用指令COPY../aaa/bbb,因為dockerbuild命令的第1步是發(fā)送上下文目錄及其子目錄到Docker守護(hù)進(jìn)程中。②如果源路徑指向目錄,則復(fù)制目錄的整個內(nèi)容,包括文件系統(tǒng)元數(shù)據(jù)。注意,目錄本身不會被復(fù)制,被復(fù)制的只是其中的內(nèi)容。③如果源路徑指向任何其他類型的文件,則文件與其元數(shù)據(jù)被分別復(fù)制。在這種情形下,如果目的路徑以斜線(/)結(jié)尾,則它將被認(rèn)為是一個目錄的源內(nèi)容,將被寫到“<目的路徑>/base(<源路徑>)”路徑中。④如果直接指定多個源路徑,或者源路徑中使用了通配符,則目的路徑必須是目錄,并且必須以斜線結(jié)尾。⑤如果目的路徑不以斜線結(jié)尾,則它將被視為常規(guī)文件,源路徑將被寫入該文件。⑥如果目的路徑不存在,則其會與其路徑中所有缺少的目錄一起被創(chuàng)建。5.2.4Dockerfile相關(guān)知識VOLUME["掛載點路徑"]10OPTIONVOLUMEVOLUME指令的語法格式如下。VOLUME指令用于創(chuàng)建具有指定名稱的掛載點,并將其標(biāo)記為從本地主機或其他容器可訪問的外部掛載點。掛載點路徑可以是JSON數(shù)據(jù),如VOLUME["/mnt/data"];或具有多個參數(shù)的純字符串,如VOLUME/mnt/data。5.2.4Dockerfile相關(guān)知識WORKDIR工作目錄11OPTIONWORKDIRWORKDIR指令的語法格式如下。WORKDIR指令為Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令設(shè)置工作目錄,如果該目錄不存在,則將被自動創(chuàng)建,即使它沒有在任何后續(xù)Dockerfile指令中被使用??梢栽谝粋€Dockerfile文件中多次使用WORKDIR指令,如果一條WORKDIR指令提供了相對路徑,則該路徑是相對于前一條WORKDIR指令指定的路徑,例如:WORKDIR/aaaWORKDIRbbbRUNpwd在此Dockerfile中,最終pwd命令的輸出是/aaa/bbb。5.2.4Dockerfile相關(guān)知識RUN、CMD和ENTRYPOINT指令都會用到exec格式和shell格式。其中,exec格式的語法格式如下。4.Dockerfile指令的exec格式和shell格式<指令>["可執(zhí)行程序","參數(shù)1","參數(shù)2"]指令執(zhí)行時會直接調(diào)用命令,參數(shù)中的環(huán)境變量不會被Shell解析,例如:ENVnameListenerENTRYPOINT["/bin/echo","hello!$name"]運行該鏡像將輸出以下結(jié)果。hello!$name5.2.4Dockerfile相關(guān)知識其中,環(huán)境變量name沒有被解析,采用exec格式時,如果要使用環(huán)境變量,則可進(jìn)行如下修改。ENVnameListenerENTRYPOINT["/bin/sh","-c","echohello!$name"]運行該鏡像將輸出以下結(jié)果。hello!Listenerexec格式?jīng)]有運行Bash或Shell的額外開銷,還可以在沒有Bash或Shell的鏡像中運行。shell格式的語法如下。<指令><命令>指令被執(zhí)行時shell格式底層會調(diào)用/bin/sh-c語句來執(zhí)行命令,例如:ENVnameListenerENTRYPOINTechohello!$name運行該鏡像將輸出以下結(jié)果。hello!Listener其中,環(huán)境變量name已經(jīng)被替換為變量值。5.2.4Dockerfile相關(guān)知識5.RUN、CMD和ENTRYPOINT指令的區(qū)別及聯(lián)系A(chǔ)RUN指令執(zhí)行命令并創(chuàng)建新的鏡像層,經(jīng)常用于安裝應(yīng)用程序。RUN先于CMD或ENTRYPOINT指令在構(gòu)建鏡像時執(zhí)行,并被固化在所生成的鏡像中。CCMD指令的主要作用是為運行容器提供默認(rèn)值,即默認(rèn)執(zhí)行的命令及其參數(shù),但當(dāng)運行帶有替代參數(shù)的容器時,CMD指令將被覆蓋。如果CMD指令省略可執(zhí)行文件,則必須指定ENTRYPOINT指令,CMD可以為ENTRYPOINT提供額外的默認(rèn)參數(shù)。BCMD和ENTRYPOINT指令在每次啟動容器時才被執(zhí)行,區(qū)別在于CMD指令被dockerrun命令所覆蓋。兩個指令一起使用時,ENTRYPOINT指令作為可執(zhí)行文件,而CMD指令則為ENTRYPOINT指令提供默認(rèn)參數(shù)。D當(dāng)容器作為可執(zhí)行文件時,應(yīng)該定義ENTRYPOINT指令。ENTRYPOINT指令用于配置容器啟動時執(zhí)行的命令,可讓容器以應(yīng)用程序或者服務(wù)的形式運行。EENTRYPOINT指令中的參數(shù)始終會被dockerrun命令使用,不可改變;而CMD指令中的額外參數(shù)可以在使用dockerrun命令啟動容器時被動態(tài)替換掉。5.2.4Dockerfile相關(guān)知識6.組合使用CMD和ENTRYPOINT指令CMD和ENTRYPOINT指令都可以定義運行容器時要執(zhí)行的命令,兩者組合使用時應(yīng)遵循以下規(guī)則。①②③④Dockerfile中應(yīng)至少定義一個CMD或ENTRYPOINT指令。將整個容器作為一個可執(zhí)行文件時應(yīng)當(dāng)定義ENTRYPOINT指令。CMD指令應(yīng)為ENTRYPOINT指令提供默認(rèn)參數(shù),或者用于在容器中臨時執(zhí)行一些命令。當(dāng)使用替代參數(shù)運行容器時,CMD指令的定義將會被覆蓋。值得注意的是,如果CMD指令從基礎(chǔ)鏡像定義,那么ENTRYPOINT指令的定義會將CMD指令重置為空值。在這種情況下,必須在當(dāng)前鏡像中為CMD指令指定一個實際的值。5.2.5Docker容器基礎(chǔ)知識1.什么是容器Docker的最終目的是部署和運行應(yīng)用程序,這是由容器來實現(xiàn)的。容器的英文為Container,在Docker中指從鏡像創(chuàng)建的應(yīng)用程序運行實例。鏡像和容器就像面向?qū)ο蟪绦蛟O(shè)計中的類和實例,鏡像是靜態(tài)的定義,容器是鏡像運行時的實體,基于同一鏡像可以創(chuàng)建若干不同的容器。Docker作為一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包應(yīng)用及其依賴包到一個可移植的容器中,并將容器發(fā)布到任何裝有流行的Linux操作系統(tǒng)的機器中,也可以實現(xiàn)虛擬化。容器是相對獨立的運行環(huán)境,這一點類似于虛擬機,但是它不像虛擬機獨立得那么徹底。容器通過將軟件與周圍環(huán)境隔離,將外界的影響降到最低。Docker的設(shè)計借鑒了集裝箱的概念,每個容器都有一個軟件鏡像,相當(dāng)于集裝箱中的貨物。可以將容器看作應(yīng)用程序及其依賴環(huán)境打包而成的集裝箱。容器可以被創(chuàng)建、啟動、停止、刪除、暫停等。Docker在執(zhí)行這些操作時并不關(guān)心容器里有什么軟件。5.2.5Docker容器基礎(chǔ)知識容器的實質(zhì)是進(jìn)程,但與直接在主機上運行的進(jìn)程不同,容器進(jìn)程在屬于自己的獨立的命名空間內(nèi)運行。因此容器可以擁有自己的根文件系統(tǒng)、網(wǎng)絡(luò)配置、進(jìn)程空間,甚至自己的用戶命名空間。容器內(nèi)的進(jìn)程運行在隔離的環(huán)境里,使用起來就好像是在獨立主機的系統(tǒng)下操作一樣。通常容器之間是彼此隔離、互不可見的。這種特性使得容器封裝的應(yīng)用程序比直接在主機上運行的應(yīng)用程序更加安全,但這種特性可能會導(dǎo)致一些初學(xué)者混淆容器和虛擬機,這個問題應(yīng)引起注意。Docker容器具有以下特點。(2)安全。(1)標(biāo)準(zhǔn)。(4)獨立性。(3)輕量級。5.2.5Docker容器基礎(chǔ)知識2.可寫的容器層容器與鏡像的主要不同之處是容器頂部有可寫層。一個鏡像由多個可讀的鏡像層組成,正在運行的容器會在鏡像層上面增加一個可寫的容器層,所有寫入容器的數(shù)據(jù)都保存在這個可寫層中,包括添加的新數(shù)據(jù)或修改的已有數(shù)據(jù)。當(dāng)容器被刪除時,這個可寫層也會被刪除,但是底層的鏡像層保持不變,因此,任何對容器的操作均不會影響到其鏡像。每個容器都有自己的可寫層,所有的改變都存儲在這個容器層中,因此多個容器可以共享同一個底層鏡像,并且仍然擁有自己的數(shù)據(jù)狀態(tài)。這里給出多個容器共享同一個CentOS8.4鏡像的示例,如圖所示。多個容器共享同一個CentOS8.4鏡像5.2.5Docker容器基礎(chǔ)知識3.寫時復(fù)制策略寫時復(fù)制策略是一個高效的文件共享和復(fù)制策略。如果一個文件位于鏡像中的較低層,其他層需要讀取它,包括可寫層,那么使用現(xiàn)有文件即可。其他層首次修改該文件時,構(gòu)建鏡像或運行容器后,文件將會被復(fù)制到該層并被修改,這最大限度地減少了后續(xù)的讀取工作,并且減少了文件占用的空間。修改容器中已有的文件時,存儲驅(qū)動執(zhí)行寫時復(fù)制策略,具體步驟取決于特定的存儲驅(qū)動。對另一種聯(lián)合文件系統(tǒng)(AnotherUnionFileSystem,AUFS)、overlay和overlay2驅(qū)動來說,執(zhí)行寫時復(fù)制策略的大致步驟如下。12從鏡像各層中搜索要修改的文件,從最新的層開始直到最底層,被找到的文件將被添加到緩存中以加速后續(xù)操作。對找到的文件的第1個副本執(zhí)行copy_up操作,將其復(fù)制到容器的可寫層中。5.2.5Docker容器基礎(chǔ)知識4.容器的基本信息可以使用dockerps-a命令輸出本地全部容器的列表,執(zhí)行命令如下。[root@localhost~]#dockerps-a命令執(zhí)行結(jié)果如圖所示。圖中的列表反映了容器的基本信息。CONTAINERID列表示容器的ID,IMAGE列表示容器所用鏡像的名稱,COMMAND列表示啟動容器時執(zhí)行的命令,CREATED列表示容器的創(chuàng)建時間,STATUS列表示容器運行的狀態(tài)(Up表示運行中,Exited表示已停止),PORTS列表示容器對外發(fā)布的端口號,NAMES列表示容器的名稱。創(chuàng)建容器之后對容器進(jìn)行的各種操作,如啟動、停止、修改或刪除等,都可以通過容器ID來進(jìn)行引用。容器ID能保證唯一性,但難以記憶,因此可以使用容器名稱來代替容器ID來引用容器。5.2.5Docker容器基礎(chǔ)知識5.磁盤上的容器大小要查看一個運行中的容器的大小,可以使用dockerps-s命令,命令執(zhí)行結(jié)果中的SIZE列會顯示兩個不同的值。這里以centos_sshd鏡像為例,啟動相應(yīng)的容器,執(zhí)行命令如下。[root@localhost~]#dockerrun-dcentos_sshd命令執(zhí)行結(jié)果如下。9c96a9fd37c6e12eb89a0dc15594068a2bf402b546f08cdd0bf9609a20354099[root@localhost~]#查看該容器的大小,執(zhí)行命令如下。[root@localhost~]#dockerps-s其中,SIZE列的第1個值表示每個容器的可寫層中當(dāng)前所有數(shù)據(jù)的大??;第2個值是虛擬大小,位于括號中并以vritual進(jìn)行標(biāo)記,表示該容器所用鏡像層的數(shù)據(jù)量加上容器可寫層數(shù)據(jù)的大小。5.2.5Docker容器基礎(chǔ)知識6.容器操作命令Docker提供了相當(dāng)多的容器操作命令,既包括創(chuàng)建、啟動、停止、刪除、暫停等容器生命周期管理操作,如dockercreate、dockerstart等;又包括查看、連接、導(dǎo)出容器運維操作,以及容器列表、日志、事件查看操作,如dockerps、dockerattach等。這些都可以看作docker命令的子命令。被操作的容器可以使用容器ID或容器名稱進(jìn)行標(biāo)識。有些命令可以操作多個容器,多個容器ID或容器名稱之間使用空格分隔。Docker新版本提供了一個統(tǒng)一的容器管理操作命令dockercontainer,其基本語法格式如下。dockercontainer子命令5.2.5Docker容器基礎(chǔ)知識dockercontainer子命令docker子命令功能說明dockercontainerattachdockerattach將本地的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤信息內(nèi)容附加到正在運行的容器上,也就是連接到正在運行的容器上,其實就是進(jìn)入容器dockercontainercommitdockercommit從當(dāng)前容器創(chuàng)建新的鏡像dockercontainercpdockercp在容器和宿主機之間復(fù)制文件及目錄dockercontainercreatedockercreate創(chuàng)建新的容器dockercontainerdiffdockerdiff檢查容器創(chuàng)建以來其文件系統(tǒng)上文件或目錄的更改dockercontainerexecdockerexec在正在運行的容器中執(zhí)行命令dockercontainerexportdockerexport將容器的文件系統(tǒng)導(dǎo)出為.tar文件dockercontainerimport1dockerimport1導(dǎo)入一個鏡像dockercontainerinspectdockerinspect顯示一個或多個容器的詳細(xì)信息dockercontainerkilldockerkill停止一個正運行的容器dockercontainerlogsdockerlogs獲取容器的日志信息dockercontainerlsdockerps顯示容器列表dockercontainerpausedockerpause暫停一個或多個容器內(nèi)的所有進(jìn)程dockercontainerportdockerport列出容器的端口映射或特定的映射dockercontainerprune—刪除所有停止運行的鏡像dockercontainerrenamedockerrename對容器進(jìn)行重命名dockercontainerrestartdockerrestart重啟一個或多個容器
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版家電產(chǎn)品消費者滿意度調(diào)查服務(wù)合同2篇
- 二零二五版房地產(chǎn)融資居間代理合同范本3篇
- 二零二五年電影聯(lián)合制作與市場推廣合同2篇
- 二零二五版茶葉茶具專賣店加盟管理合同3篇
- 二零二五版汽車購置貸款保證擔(dān)保合同3篇
- 二零二五年度化肥原料進(jìn)口與分銷合同3篇
- 二零二五年度航空航天股權(quán)買賣合同范本3篇
- 二零二五版戶外廣告牌定期檢查與維修合同3篇
- 二零二五年度駕校車輛購置稅承包合同3篇
- 國際貿(mào)易第六章出口合同訂立2025年綠色貿(mào)易標(biāo)準(zhǔn)與認(rèn)證3篇
- 15.5-博物館管理法律制度(政策與法律法規(guī)-第五版)
- 水泥廠鋼結(jié)構(gòu)安裝工程施工方案
- 2023光明小升初(語文)試卷
- 三年級上冊科學(xué)說課課件-1.5 水能溶解多少物質(zhì)|教科版
- GB/T 7588.2-2020電梯制造與安裝安全規(guī)范第2部分:電梯部件的設(shè)計原則、計算和檢驗
- GB/T 14600-2009電子工業(yè)用氣體氧化亞氮
- 小學(xué)道德與法治學(xué)科高級(一級)教師職稱考試試題(有答案)
- 河北省承德市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)
- 實用性閱讀與交流任務(wù)群設(shè)計思路與教學(xué)建議
- 應(yīng)急柜檢查表
- 通風(fēng)設(shè)施標(biāo)準(zhǔn)
評論
0/150
提交評論