摘要:由于隔離的進程獨立于宿主和其它的隔離的進程,因此也稱其為容器。設(shè)計時,就充分利用的技術(shù),將其設(shè)計為分層存儲的架構(gòu)。鏡像實際是由多層文件系統(tǒng)聯(lián)合組成。分層存儲的特征還使得鏡像的復(fù)用定制變的更為容易。前面講過鏡像使用的是分層存儲,容器也是如此。
本文只是對Docker的概念做了較為詳細的介紹,并不涉及一些像Docker環(huán)境的安裝以及Docker的一些常見操作和命令。
閱讀本文大概需要15分鐘,通過閱讀本文你將知道一下概念:
容器
什么是Docker?
Docker思想、特點
Docker容器主要解決什么問題
容器 VS 虛擬機
Docker基本概念: 鏡像(Image),容器(Container),倉庫(Repository)
Docker 是世界領(lǐng)先的軟件容器平臺,所以想要搞懂Docker的概念我們必須先從容器開始說起。一 先從認識容器開始 1.1 什么是容器? 先來看看容器較為官方的解釋
一句話概括容器:容器就是將軟件打包成標(biāo)準化單元,以用于開發(fā)、交付和部署。
容器鏡像是輕量的、可執(zhí)行的獨立軟件包 ,包含軟件運行所需的所有內(nèi)容:代碼、運行時環(huán)境、系統(tǒng)工具、系統(tǒng)庫和設(shè)置。
容器化軟件適用于基于Linux和Windows的應(yīng)用,在任何環(huán)境中都能夠始終如一地運行。
容器賦予了軟件獨立性 ,使其免受外在環(huán)境差異(例如,開發(fā)和預(yù)演環(huán)境的差異)的影響,從而有助于減少團隊間在相同基礎(chǔ)設(shè)施上運行不同軟件時的沖突。
再來看看容器較為通俗的解釋如果需要通俗的描述容器的話,我覺得容器就是一個存放東西的地方,就像書包可以裝各種文具、衣柜可以放各種衣服、鞋架可以放各種鞋子一樣。我們現(xiàn)在所說的容器存放的東西可能更偏向于應(yīng)用比如網(wǎng)站、程序甚至是系統(tǒng)環(huán)境。
1.2 圖解物理機、虛擬機與容器關(guān)于虛擬機與容器的對比在后面會詳細介紹到,這里只是通過網(wǎng)上的圖片加深大家對于物理機、虛擬機與容器這三者的理解。
物理機
虛擬機:
容器:
通過上面這三張抽象圖,我們可以大概可以通過類比概括出: 容器虛擬化的是操作系統(tǒng)而不是硬件,容器之間是共享同一套操作系統(tǒng)資源的。虛擬機技術(shù)是虛擬出一套硬件后,在其上運行一個完整操作系統(tǒng)。因此容器的隔離級別會稍低一些。
相信通過上面的解釋大家對于容器這個既陌生又熟悉的概念有了一個初步的認識,下面我們就來談?wù)凞ocker的一些概念。二 再來談?wù)凞ocker的一些概念 2.1 什么是Docker?
說實話關(guān)于Docker是什么并太好說,下面我通過四點向你說明Docker到底是個什么東西。
Docker 是世界領(lǐng)先的軟件容器平臺。
Docker 使用 Google 公司推出的 Go 語言 進行開發(fā)實現(xiàn),基于 Linux 內(nèi)核 的cgroup,namespace,以及AUFS類的UnionFS等技術(shù),對進程進行封裝隔離,屬于操作系統(tǒng)層面的虛擬化技術(shù)。 由于隔離的進程獨立于宿主和其它的隔離的進
程,因此也稱其為容器。Docke最初實現(xiàn)是基于 LXC.
Docker 能夠自動執(zhí)行重復(fù)性任務(wù),例如搭建和配置開發(fā)環(huán)境,從而解放了開發(fā)人員以便他們專注在真正重要的事情上:構(gòu)建杰出的軟件。
用戶可以方便地創(chuàng)建和使用容器,把自己的應(yīng)用放入容器。容器還可以進行版本管理、復(fù)制、分享、修改,就像管理普通的代碼一樣。
2.2 Docker思想集裝箱
標(biāo)準化: ①運輸方式 ② 存儲方式 ③ API接口
隔離
2.3 Docker容器的特點輕量
在一臺機器上運行的多個 Docker 容器可以共享這臺機器的操作系統(tǒng)內(nèi)核;它們能夠迅速啟動,只需占用很少的計算和內(nèi)存資源。鏡像是通過文件系統(tǒng)層進行構(gòu)造的,并共享一些公共文件。這樣就能盡量降低磁盤用量,并能更快地下載鏡像。
標(biāo)準
Docker 容器基于開放式標(biāo)準,能夠在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸機服務(wù)器和云在內(nèi)的任何基礎(chǔ)設(shè)施上運行。
安全
Docker 賦予應(yīng)用的隔離性不僅限于彼此隔離,還獨立于底層的基礎(chǔ)設(shè)施。Docker 默認提供最強的隔離,因此應(yīng)用出現(xiàn)問題,也只是單個容器的問題,而不會波及到整臺機器。
2.4 為什么要用DockerDocker 的鏡像提供了除內(nèi)核外完整的運行時環(huán)境,確保了應(yīng)用運行環(huán)境一致性,從而不會再出現(xiàn) “這段代碼在我機器上沒問題啊” 這類問題;——一致的運行環(huán)境
可以做到秒級、甚至毫秒級的啟動時間。大大的節(jié)約了開發(fā)、測試、部署的時間?!焖俚膯訒r間
避免公用的服務(wù)器,資源會容易受到其他用戶的影響?!綦x性
善于處理集中爆發(fā)的服務(wù)器使用壓力;——彈性伸縮,快速擴展
可以很輕易的將在一個平臺上運行的應(yīng)用,遷移到另一個平臺上,而不用擔(dān)心運行環(huán)境的變化導(dǎo)致應(yīng)用無法正常運行的情況?!w移方便
使用 Docker 可以通過定制應(yīng)用鏡像來實現(xiàn)持續(xù)集成、持續(xù)交付、部署?!掷m(xù)交付和部署
每當(dāng)說起容器,我們不得不將其與虛擬機做一個比較。就我而言,對于兩者無所謂誰會取代誰,而是兩者可以和諧共存。三 容器 VS 虛擬機
簡單來說: 容器和虛擬機具有相似的資源隔離和分配優(yōu)勢,但功能有所不同,因為容器虛擬化的是操作系統(tǒng),而不是硬件,因此容器更容易移植,效率也更高。
3.1 兩者對比圖傳統(tǒng)虛擬機技術(shù)是虛擬出一套硬件后,在其上運行一個完整操作系統(tǒng),在該系統(tǒng)上再運行所需應(yīng)用進程;而容器內(nèi)的應(yīng)用進程直接運行于宿主的內(nèi)核,容器內(nèi)沒有自己的內(nèi)核,而且也沒有進行硬件虛擬。因此容器要比傳統(tǒng)虛擬機更為輕便.
3.2 容器與虛擬機 (VM) 總結(jié)容器是一個應(yīng)用層抽象,用于將代碼和依賴資源打包在一起。 多個容器可以在同一臺機器上運行,共享操作系統(tǒng)內(nèi)核,但各自作為獨立的進程在用戶空間中運行 。與虛擬機相比, 容器占用的空間較少(容器鏡像大小通常只有幾十兆),瞬間就能完成啟動 。
虛擬機 (VM) 是一個物理硬件層抽象,用于將一臺服務(wù)器變成多臺服務(wù)器。 管理程序允許多個 VM 在一臺機器上運行。每個VM都包含一整套操作系統(tǒng)、一個或多個應(yīng)用、必要的二進制文件和庫資源,因此 占用大量空間 。而且 VM 啟動也十分緩慢 。
通過Docker官網(wǎng),我們知道了這么多Docker的優(yōu)勢,但是大家也沒有必要完全否定虛擬機技術(shù),因為兩者有不同的使用場景。虛擬機更擅長于徹底隔離整個運行環(huán)境。例如,云服務(wù)提供商通常采用虛擬機技術(shù)隔離不同的用戶。而 Docker通常用于隔離不同的應(yīng)用 ,例如前端,后端以及數(shù)據(jù)庫。
3.3 容器與虛擬機 (VM)兩者是可以共存的就我而言,對于兩者無所謂誰會取代誰,而是兩者可以和諧共存。
Docker中非常重要的三個基本概念,理解了這三個概念,就理解了 Docker 的整個生命周期。四 Docker基本概念
Docker 包括三個基本概念
鏡像(Image)
容器(Container)
倉庫(Repository)
理解了這三個概念,就理解了 Docker 的整個生命周期
4.1 鏡像(Image)——一個特殊的文件系統(tǒng)操作系統(tǒng)分為內(nèi)核和用戶空間。對于 Linux 而言,內(nèi)核啟動后,會掛載 root 文件系統(tǒng)為其提供用戶空間支持。而Docker 鏡像(Image),就相當(dāng)于是一個 root 文件系統(tǒng)。
Docker 鏡像是一個特殊的文件系統(tǒng),除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。 鏡像不包含任何動態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會被改變。
Docker 設(shè)計時,就充分利用 Union FS的技術(shù),將其設(shè)計為 分層存儲的架構(gòu) 。 鏡像實際是由多層文件系統(tǒng)聯(lián)合組成。
鏡像構(gòu)建時,會一層層構(gòu)建,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會再發(fā)生改變,后一層上的任何改變只發(fā)生在自己這一層。 比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當(dāng)前層標(biāo)記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構(gòu)建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應(yīng)該在該層構(gòu)建結(jié)束前清理掉。
分層存儲的特征還使得鏡像的復(fù)用、定制變的更為容易。甚至可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層,然后進一步添加新的層,以定制自己所需的內(nèi)容,構(gòu)建新的鏡像。
4.2 容器(Container)——鏡像運行時的實體鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計中的 類 和 實例 一樣,鏡像是靜態(tài)的定義,容器是鏡像運行時的實體。容器可以被創(chuàng)建、啟動、停止、刪除、暫停等 。
容器的實質(zhì)是進程,但與直接在宿主執(zhí)行的進程不同,容器進程運行于屬于自己的獨立的 命名空間。前面講過鏡像使用的是分層存儲,容器也是如此。
容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失。
按照 Docker 最佳實踐的要求,容器不應(yīng)該向其存儲層內(nèi)寫入任何數(shù)據(jù) ,容器存儲層要保持無狀態(tài)化。所有的文件寫入操作,都應(yīng)該使用數(shù)據(jù)卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網(wǎng)絡(luò)存儲)發(fā)生讀寫,其性能和穩(wěn)定性更高。數(shù)據(jù)卷的生存周期獨立于容器,容器消亡,數(shù)據(jù)卷不會消亡。因此, 使用數(shù)據(jù)卷后,容器可以隨意刪除、重新 run ,數(shù)據(jù)卻不會丟失。
4.3 倉庫(Repository)——集中存放鏡像文件的地方鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主上運行,但是, 如果需要在其它服務(wù)器上使用這個鏡像,我們就需要一個集中的存儲、分發(fā)鏡像的服務(wù),Docker Registry就是這樣的服務(wù)。
一個 Docker Registry中可以包含多個倉庫(Repository);每個倉庫可以包含多個標(biāo)簽(Tag);每個標(biāo)簽對應(yīng)一個鏡像。所以說:鏡像倉庫是Docker用來集中存放鏡像文件的地方類似于我們之前常用的代碼倉庫。
通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標(biāo)簽就常用于對應(yīng)該軟件的各個版本 。我們可以通過<倉庫名>:<標(biāo)簽>的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標(biāo)簽,將以 latest 作為默認標(biāo)簽.。
這里補充一下Docker Registry 公開服務(wù)和私有 Docker Registry的概念:
Docker Registry 公開服務(wù) 是開放給用戶使用、允許用戶管理鏡像的 Registry 服務(wù)。一般這類公開服務(wù)允許用戶免費上傳、下載公開的鏡像,并可能提供收費服務(wù)供用戶管理私有鏡像。
最常使用的 Registry 公開服務(wù)是官方的 Docker Hub ,這也是默認的 Registry,并擁有大量的高質(zhì)量的官方鏡像,網(wǎng)址為:https://hub.docker.com/ 。在國內(nèi)訪問Docker Hub 可能會比較慢國內(nèi)也有一些云服務(wù)商提供類似于 Docker Hub 的公開服務(wù)。比如 時速云鏡像庫、網(wǎng)易云鏡像服務(wù)、DaoCloud 鏡像市場、阿里云鏡像庫等。
除了使用公開服務(wù)外,用戶還可以在 本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做為私有 Registry 服務(wù)。開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務(wù)端實現(xiàn),足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。
Docker的概念基本上已經(jīng)講完,最后我們談?wù)劊築uild, Ship, and Run。五 最后談?wù)劊築uild, Ship, and Run
如果你搜索Docker官網(wǎng),會發(fā)現(xiàn)如下的字樣:“Docker - Build, Ship, and Run Any App, Anywhere”。那么Build, Ship, and Run到底是在干什么呢?
Build(構(gòu)建鏡像) : 鏡像就像是集裝箱包括文件以及運行環(huán)境等等資源。
Ship(運輸鏡像) :主機和倉庫間運輸,這里的倉庫就像是超級碼頭一樣。
Run (運行鏡像) :運行的鏡像就是一個容器,容器就是運行程序的地方。
Docker 運行過程也就是去倉庫把鏡像拉到本地,然后用一條命令把鏡像運行起來變成容器。所以,我們也常常將Docker稱為碼頭工人或碼頭裝卸工,這和Docker的中文翻譯搬運工人如出一轍。
六 總結(jié)本文主要把Docker中的一些常見概念做了詳細的闡述,但是并不涉及Docker的安裝、鏡像的使用、容器的操作等內(nèi)容。這部分東西,希望讀者自己可以通過閱讀書籍與官方文檔的形式掌握。如果覺得官方文檔閱讀起來很費力的話,這里推薦一本書籍《Docker技術(shù)入門與實戰(zhàn)第二版》。
如果你覺得我的文章對你有幫助話,歡迎關(guān)注我的微信公眾號:"Java面試通關(guān)手冊"(一個有溫度的微信公眾號,無廣告,單純技術(shù)分享,期待與你共同進步~~~堅持原創(chuàng),分享美文,分享各種Java學(xué)習(xí)資源。你想關(guān)注便關(guān)注,公眾號只是我記錄文字和生活的地方,無所謂利益。)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/27346.html
摘要:另外,為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個獨立的程序計數(shù)器,各線程之間計數(shù)器互不影響,獨立存儲,我們稱這類內(nèi)存區(qū)域為線程私有的內(nèi)存。運行時常量池運行時常量池是方法區(qū)的一部分。 寫在前面(常見面試題) 基本問題: 介紹下 Java 內(nèi)存區(qū)域(運行時數(shù)據(jù)區(qū)) Java 對象的創(chuàng)建過程(五步,建議能默寫出來并且要知道每一步虛擬機做了什么) 對象的訪問定位的兩種方式(句...
摘要:的設(shè)計目標(biāo)是將那些復(fù)雜且容易出錯的分布式一致性服務(wù)封裝起來,構(gòu)成一個高效可靠的原語集,并以一系列簡單易用的接口提供給用戶使用。具有不可分割性即原語的執(zhí)行必須是連續(xù)的,在執(zhí)行過程中不允許被中斷。 該文已加入開源文檔:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識)。地址:https://github.com/Snailclimb... showImg(https:...
摘要:之前的堆內(nèi)存示意圖從上圖可以看出堆內(nèi)存的分為新生代老年代和永久代。對象優(yōu)先在區(qū)分配目前主流的垃圾收集器都會采用分代回收算法,因此需要將堆內(nèi)存分為新生代和老年代,這樣我們就可以根據(jù)各個年代的特點選擇合適的垃圾收集算法。 上文回顧:《可能是把Java內(nèi)存區(qū)域講的最清楚的一篇文章》 寫在前面 本節(jié)常見面試題: 問題答案在文中都有提到 如何判斷對象是否死亡(兩種方法)。 簡單的介紹一下強引用...
閱讀 1966·2023-04-26 02:46
閱讀 2062·2021-11-25 09:43
閱讀 1207·2021-09-29 09:35
閱讀 2163·2019-08-30 15:56
閱讀 3481·2019-08-30 15:54
閱讀 2712·2019-08-29 16:35
閱讀 3191·2019-08-29 15:25
閱讀 3355·2019-08-29 14:01