聊聊Docker容器的前世今生
一、Docker簡介
1、什么是虛擬化
在計(jì)算機(jī)中,虛擬化(英語:Virtualization)是一種資源管理技術(shù),是將計(jì)算機(jī)的各種實(shí)體資源,如服務(wù)器、網(wǎng)絡(luò)、內(nèi)存及存儲(chǔ)等,予以抽象、轉(zhuǎn)換后呈現(xiàn)出來,打破實(shí)體結(jié)構(gòu)間的不可切割的障礙,使用戶可以比原本的組態(tài)更好的方式來應(yīng)用這些資源。這些資源的新虛擬部份是不受現(xiàn)有資源的架設(shè)方式,地域或物理組態(tài)所限制。一般所指的虛擬化資源包括計(jì)算能力和資料存儲(chǔ)。
在實(shí)際的生產(chǎn)環(huán)境中,虛擬化技術(shù)主要用來解決高性能的物理硬件產(chǎn)能過剩和老的舊的硬件產(chǎn)能過低的重組重用, 透明化底層物理硬件,從而最大化的利用物理硬件
虛擬化技術(shù)種類很多,例如:軟件虛擬化、硬件虛擬化、內(nèi)存虛擬化、網(wǎng)絡(luò)虛擬化(vip)、桌面虛擬化、服務(wù)虛擬化、虛擬機(jī)等等。
2、什么是Docker
Docker 是一個(gè)開源項(xiàng)目,誕生于 2013 年初,最初是 dotCloud 公司內(nèi)部的一個(gè)業(yè)余項(xiàng)目。它基于 Google 公司推 出的 Go 語言實(shí)現(xiàn)。 項(xiàng)目后來加入了 Linux 基金會(huì),遵從了 Apache 2.0 協(xié)議,項(xiàng)目代碼在 GitHub 上進(jìn)行維護(hù)。
Docker 自開源后受到廣泛的關(guān)注和討論,以至于 dotCloud 公司后來都改名為 Docker Inc。Redhat 已經(jīng)在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產(chǎn)品中廣泛應(yīng)用。
Docker 項(xiàng)目的目標(biāo)是實(shí)現(xiàn)輕量級(jí)的操作系統(tǒng)虛擬化解決方案。 Docker 的基礎(chǔ)是 Linux 容器(LXC)等技術(shù)。
在 LXC 的基礎(chǔ)上 Docker 進(jìn)行了進(jìn)一步的封裝,讓用戶不需要去關(guān)心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個(gè)快速輕量級(jí)的虛擬機(jī)一樣簡單。
為什么選擇Docker?
(1)上手快
用戶只需要幾分鐘,就可以把自己的程序“Docker化”。Docker依賴于“寫時(shí)復(fù)制”(copy-on-write)模型,使修改應(yīng)用程序也非常迅速,可以說達(dá)到“隨心所致,代碼即改”的境界。
隨后,就可以創(chuàng)建容器來運(yùn)行應(yīng)用程序了。大多數(shù)Docker容器只需要不到1秒中即可啟動(dòng)。由于去除了管理程序的開銷,Docker容器擁有很高的性能,同時(shí)同一臺(tái)宿主機(jī)中也可以運(yùn)行更多的容器,使用戶盡可能的充分利用系統(tǒng)資源。
(2)職責(zé)的邏輯分類
使用Docker,開發(fā)人員只需要關(guān)心容器中運(yùn)行的應(yīng)用程序,而運(yùn)維人員只需要關(guān)心如何管理容器。Docker設(shè)計(jì)的目的就是要加強(qiáng)開發(fā)人員寫代碼的開發(fā)環(huán)境與應(yīng)用程序要部署的生產(chǎn)環(huán)境一致性。
(3)快速高效的開發(fā)生命周期
Docker的目標(biāo)之一就是縮短代碼從開發(fā)、測試到部署、上線運(yùn)行的周期,讓你的應(yīng)用程序具備可移植性,易于構(gòu)建,并易于協(xié)作。(通俗一點(diǎn)說,Docker就像一個(gè)盒子,里面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件件的取。)
(4)鼓勵(lì)使用面向服務(wù)的架構(gòu)
Docker還鼓勵(lì)面向服務(wù)的體系結(jié)構(gòu)和微服務(wù)架構(gòu)。Docker推薦單個(gè)容器只運(yùn)行一個(gè)應(yīng)用程序或進(jìn)程,這樣就形成了一個(gè)分布式的應(yīng)用程序模型,在這種模型下,應(yīng)用程序或者服務(wù)都可以表示為一系列內(nèi)部互聯(lián)的容器,從而使分布式部署應(yīng)用程序,擴(kuò)展或調(diào)試應(yīng)用程序都變得非常簡單,同時(shí)也提高了程序的內(nèi)省性。(當(dāng)然,可以在一個(gè)容器 中運(yùn)行多個(gè)應(yīng)用程序)
3、 容器與虛擬機(jī)比較
容器是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化,直接復(fù)用本地主機(jī)的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實(shí)現(xiàn)
與傳統(tǒng)的虛擬機(jī)相比,Docker優(yōu)勢體現(xiàn)為啟動(dòng)速度快、占用體積小。
4、 Docker 組件
4.1 Docker服務(wù)器與客戶端
Docker是一個(gè)客戶端-服務(wù)器(C/S)架構(gòu)程序。Docker客戶端只需要向Docker服務(wù)器或者守護(hù)進(jìn)程發(fā)出請(qǐng)求,服務(wù)器或者守護(hù)進(jìn)程將完成所有工作并返回結(jié)果。Docker提供了一個(gè)命令行工具Docker以及一整套R(shí)ESTful API。你可以在同一臺(tái)宿主機(jī)上運(yùn)行Docker守護(hù)進(jìn)程和客戶端,也可以從本地的Docker客戶端連接到運(yùn)行在另一臺(tái)宿主機(jī)上的遠(yuǎn)程Docker守護(hù)進(jìn)程。
4.2 Docker鏡像與容器
鏡像是構(gòu)建Docker的基石。用戶基于鏡像來運(yùn)行自己的容器。鏡像也是Docker生命周期中的“構(gòu)建”部分。
鏡像是基于聯(lián)合文件系統(tǒng)的一種層式結(jié)構(gòu),由一系列指令一步一步構(gòu)建出來。例如: 添加一個(gè)文件; 執(zhí)行一個(gè)命令; 打開一個(gè)窗口。
也可以將鏡像當(dāng)作容器的“源代碼”。鏡像體積很小,非常“便攜”,易于分享、存儲(chǔ)和更新。
Docker可以幫助你構(gòu)建和部署容器,你只需要把自己的應(yīng)用程序或者服務(wù)打包放進(jìn)容器即可。容器是基于鏡像啟動(dòng)起來的,容器中可以運(yùn)行一個(gè)或多個(gè)進(jìn)程。我們可以認(rèn)為,鏡像是Docker生命周期中的構(gòu)建或者打包階段,而容器則是啟動(dòng)或者執(zhí)行階段。容器基于鏡像啟動(dòng),一旦容器啟動(dòng)完成后,我們就可以登錄到容器中安裝自己需要的軟件或者服務(wù)。
所以Docker容器就是: 一個(gè)鏡像格式; 一些列標(biāo)準(zhǔn)操作; 一個(gè)執(zhí)行環(huán)境。 Docker借鑒了標(biāo)準(zhǔn)集裝箱的概念。標(biāo)準(zhǔn)集裝箱將貨物運(yùn)往世界各地,Docker將這個(gè)模型運(yùn)用到自己的設(shè)計(jì)中,唯一不同的是:集裝箱運(yùn)輸貨物,而Docker運(yùn)輸軟件。
和集裝箱一樣,Docker在執(zhí)行上述操作時(shí),并不關(guān)心容器中到底裝了什么,它不管是web服務(wù)器,還是數(shù)據(jù)庫,或者是應(yīng)用程序服務(wù)器什么的。所有的容器都按照相同的方式將內(nèi)容“裝載”進(jìn)去。
Docker也不關(guān)心你要把容器運(yùn)到何方:我們可以在自己的筆記本中構(gòu)建容器,上傳到Registry,然后下載到一個(gè)物理的或者虛擬的服務(wù)器來測試,在把容器部署到具體的主機(jī)中。像標(biāo)準(zhǔn)集裝箱一樣,Docker容器方便替換,可以疊加,易于分發(fā),并且盡量通用。
4.3 Registry(注冊(cè)中心)
Docker用Registry來保存用戶構(gòu)建的鏡像。Registry分為公共和私有兩種。Docker公司運(yùn)營公共的Registry叫做 Docker Hub。用戶可以在Docker Hub注冊(cè)賬號(hào),分享并保存自己的鏡像(說明:在Docker Hub下載鏡像巨慢, 可以自己構(gòu)建私有的Registry)。