




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