Docker
1. 虛擬化
1)什么是虛擬化
在計算機(jī)中,虛擬化(英語:Virtualization)是一種資源管理技術(shù)茂翔,是將計算機(jī)的各種 實體資源,如服務(wù)器履腋、網(wǎng)絡(luò)珊燎、內(nèi)存及存儲等,予以抽象遵湖、轉(zhuǎn)換后呈現(xiàn)出來悔政,打破實體結(jié)構(gòu)間 的不可切割的障礙,使用戶可以比原本的組態(tài)更好的方式來應(yīng)用這些資源延旧。這些資源的新虛 擬部份是不受現(xiàn)有資源的架設(shè)方式谋国,地域或物理組態(tài)所限制。一般所指的虛擬化資源包括計 算能力和資料存儲迁沫。
在實際的生產(chǎn)環(huán)境中芦瘾,虛擬化技術(shù)主要用來解決高性能的物理硬件產(chǎn)能過剩和老的舊的 硬件產(chǎn)能過低的重組重用,透明化底層物理硬件集畅,從而最大化的利用物理硬件 對資源充 分利用
虛擬化技術(shù)種類很多近弟,例如:軟件虛擬化、硬件虛擬化挺智、內(nèi)存虛擬化、網(wǎng)絡(luò)虛擬化(vip)逃贝、 桌面虛擬化谣辞、服務(wù)虛擬化、虛擬機(jī)等等沐扳。
2) 虛擬化種類
- 全虛擬化架構(gòu)
虛擬機(jī)的監(jiān)視器(hypervisor)是類似于用戶的應(yīng)用程序運行在主機(jī)的 OS 之上泥从,如 VMware 的 workstation,這種虛擬化產(chǎn)品提供了虛擬的硬件沪摄。
-
OS層虛擬化架構(gòu)
![
OS層虛擬化.png
- 硬件層虛擬化
硬件層的虛擬化具有高性能和隔離性躯嫉,因為 hypervisor 直接在硬件上運行纱烘,有利于控制 VM 的 OS 訪問硬件資源,使用這種解決方案的產(chǎn)品有 VMware ESXi 和 Xen server
Hypervisor 是一種運行在物理服務(wù)器和操作系統(tǒng)之間的中間軟件層,可允許多個操作系 統(tǒng)和應(yīng)用共享一套基礎(chǔ)物理硬件祈餐,因此也可以看作是虛擬環(huán)境中的“元”操作系統(tǒng)擂啥,它可以 協(xié)調(diào)訪問服務(wù)器上的所有物理設(shè)備和虛擬機(jī),也叫虛擬機(jī)監(jiān)視器(Virtual Machine Monitor帆阳, VMM)哺壶。
Hypervisor 是所有虛擬化技術(shù)的核心。當(dāng)服務(wù)器啟動并執(zhí)行 Hypervisor 時蜒谤,它會給每一 臺虛擬機(jī)分配適量的內(nèi)存山宾、CPU、網(wǎng)絡(luò)和磁盤鳍徽,并加載所有虛擬機(jī)的客戶操作系統(tǒng)资锰。 宿主 機(jī)
Hypervisor 是所有虛擬化技術(shù)的核心,軟硬件架構(gòu)和管理更高效阶祭、更靈活绷杜,硬件的效能 能夠更好地發(fā)揮出來。常見的產(chǎn)品有:VMware濒募、KVM鞭盟、Xen 等等。
2. 什么是Docker
容器技術(shù)
在計算機(jī)的世界中瑰剃,容器擁有一段漫長且傳奇的歷史懊缺。容器與管理程序虛擬化 (hypervisor virtualization,HV)有所不同培他,管理程序虛擬化通過中間層將一臺或者多臺獨立 的機(jī)器虛擬運行與物理硬件之上,而容器則是直接運行在操作系統(tǒng)內(nèi)核之上的用戶空間遗座。因 此舀凛,容器虛擬化也被稱為“操作系統(tǒng)級虛擬化”,容器技術(shù)可以讓多個獨立的用戶空間運行 在同一臺宿主機(jī)上途蒋。
由于“客居”于操作系統(tǒng)猛遍,容器只能運行與底層宿主機(jī)相同或者相似的操作系統(tǒng),這看 起來并不是非常靈活号坡。例如:可以在 Ubuntu 服務(wù)中運行 Redhat Enterprise Linux懊烤,但無法再 Ubuntu 服務(wù)器上運行 Microsoft Windows。
相對于徹底隔離的管理程序虛擬化宽堆,容器被認(rèn)為是不安全的腌紧。而反對這一觀點的人則認(rèn) 為,由于虛擬容器所虛擬的是一個完整的操作系統(tǒng)畜隶,這無疑增大了攻擊范圍壁肋,而且還要考慮 管理程序?qū)訚撛诘谋┞讹L(fēng)險号胚。
盡管有諸多局限性,容器還是被廣泛部署于各種各樣的應(yīng)用場合浸遗。在超大規(guī)模的多租戶 服務(wù)部署猫胁、輕量級沙盒以及對安全要求不太高的隔離環(huán)境中,容器技術(shù)非常流行跛锌。最常見的 一個例子就是“權(quán)限隔離監(jiān)牢”(chroot jail)弃秆,它創(chuàng)建一個隔離的目錄環(huán)境來運行進(jìn)程。 如果權(quán)限隔離監(jiān)牢正在運行的進(jìn)程被入侵者攻破髓帽,入侵者便會發(fā)現(xiàn)自己“身陷囹圄”菠赚,因為 權(quán)限不足被困在容器所創(chuàng)建的目錄中,無法對宿主機(jī)進(jìn)一步破壞氢卡。
最新的容器技術(shù)引入了 OpenVZ锈至、Solaris Zones 以及 Linux 容器(LXC)。使用這些新技 術(shù)译秦,容器不在僅僅是一個單純的運行環(huán)境峡捡。在自己的權(quán)限類內(nèi),容器更像是一個完整的宿主 機(jī)筑悴。對 Docker 來說们拙,它得益于現(xiàn)代 Linux 特性,如控件組(control group)阁吝、命名空間 (namespace)技術(shù)砚婆,容器和宿主機(jī)之間的隔離更加徹底,容器有獨立的網(wǎng)絡(luò)和存儲棧突勇,還 擁有自己的資源管理能力装盯,使得同一臺宿主機(jī)中的多個容器可以友好的共存。
容器被認(rèn)為是精益技術(shù)甲馋,因為容器需要的開銷有限埂奈。和傳統(tǒng)虛擬化以及半虛擬化相比, 容器不需要模擬層(emulation layer)和管理層(hypervisor layer)定躏,而是使用操作系統(tǒng)的系 統(tǒng)調(diào)用接口账磺。這降低了運行單個容器所需的開銷,也使得宿主機(jī)中可以運行更多的容器痊远。
盡管有著光輝的歷史垮抗,容器仍未得到廣泛的認(rèn)可。一個很重要的原因就是容器技術(shù)的復(fù) 雜性:容器本身就比較復(fù)雜碧聪,不易安裝冒版,管理和自動化也很困難。而 Docker 就是為了改變 這一切而生的逞姿。
容器與虛擬機(jī)的比較
-
本質(zhì)上的區(qū)別
虛擬機(jī)在搭建的時候必須構(gòu)建一個完整的操作系統(tǒng)壤玫,比較沉重
容器雖然也需要構(gòu)建一個操作系統(tǒng)豁护,但是在一個操作系統(tǒng)上可以構(gòu)建很多的容器
![Docker客戶端與服務(wù)器.png](https://upload-images.jianshu.io/upload_images/8572700-90142d6b14d292e2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
使用上的區(qū)別
虛擬機(jī)在對比容器時在使用時過于龐大,運行速度慢欲间,用戶體驗極差
#### Docker特點
1)**上手快**
用戶只需要幾分鐘楚里,就可以把自己的程序“Docker 化”。Docker 依賴于“寫時復(fù)制” (copy-on-write)模型猎贴,使修改應(yīng)用程序也非常迅速班缎,可以說達(dá)到“隨心所致,代碼即改” 的境界她渴。
隨后达址,就可以創(chuàng)建容器來運行應(yīng)用程序了。大多數(shù) Docker 容器只需要不到 1 秒中即可 啟動趁耗。由于去除了管理程序的開銷沉唠,Docker 容器擁有很高的性能,同時同一臺宿主機(jī)中也 可以運行更多的容器苛败,使用戶盡可能的充分利用系統(tǒng)資源满葛。
2)**職責(zé)的邏輯分類**
使用 Docker,開發(fā)人員只需要關(guān)心容器中運行的應(yīng)用程序罢屈,而運維人員只需要關(guān)心如 何管理容器嘀韧。Docker 設(shè)計的目的就是要加強(qiáng)開發(fā)人員寫代碼的開發(fā)環(huán)境與應(yīng)用程序要部署 的生產(chǎn)環(huán)境一致性。從而降低那種“開發(fā)時一切正常缠捌,肯定是運維的問題(測試環(huán)境都是正 常的锄贷,上線后出了問題就歸結(jié)為肯定是運維的問題)”
3)**快速高效的開發(fā)生命周期**
Docker 的目標(biāo)之一就是縮短代碼從開發(fā)、測試到部署曼月、上線運行的周期谊却,讓你的應(yīng)用 程序具備可移植性,易于構(gòu)建哑芹,并易于協(xié)作因惭。(通俗一點說,Docker 就像一個盒子绩衷,里面 可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走激率,而不需要從該盒子中一件 件的取咳燕。)
4)**鼓勵使用面向服務(wù)的架構(gòu)**
Docker 還鼓勵面向服務(wù)的體系結(jié)構(gòu)和微服務(wù)架構(gòu)。Docker 推薦單個容器只運行一個應(yīng) 用程序或進(jìn)程乒躺,這樣就形成了一個分布式的應(yīng)用程序模型招盲,在這種模型下,應(yīng)用程序或者服 務(wù)都可以表示為一系列內(nèi)部互聯(lián)的容器嘉冒,從而使分布式部署應(yīng)用程序曹货,擴(kuò)展或調(diào)試應(yīng)用程序 都變得非常簡單咆繁,同時也提高了程序的內(nèi)省性。(當(dāng)然顶籽,可以在一個容器中運行多個應(yīng)用程 序)
3. Docker組件
1)Docker 客戶端和服務(wù)器
Docker 是一個客戶端-服務(wù)器(C/S)架構(gòu)程序玩般。Docker 客戶端只需要向 Docker 服務(wù)器 或者守護(hù)進(jìn)程發(fā)出請求,服務(wù)器或者守護(hù)進(jìn)程將完成所有工作并返回結(jié)果礼饱。Docker 提供了 一個命令行工具 Docker 以及一整套 RESTful API坏为。你可以在同一臺宿主機(jī)上運行 Docker 守護(hù) 進(jìn)程和客戶端,也可以從本地的 Docker 客戶端連接到在另一臺宿主機(jī)上的遠(yuǎn)程 Docker 守護(hù)進(jìn)程镊绪。
2)Docker鏡像
鏡像是構(gòu)建 Docker 的基石匀伏。用戶基于鏡像來運行自己的容器。鏡像也是 Docker 生命周 期中的“構(gòu)建”部分蝴韭。鏡像是基于聯(lián)合文件系統(tǒng)的一種層式結(jié)構(gòu)够颠,由一系列指令一步一步構(gòu) 建出來。例如:
添加一個文件;
執(zhí)行一個命令;
打開一個窗口榄鉴。
也可以將鏡像當(dāng)作容器的“源代碼”履磨。鏡像體積很小,非忱喂瑁“便攜”蹬耘,易于分享、存儲和更 新减余。
3)Registry(注冊中心)
Docker 用 Registry 來保存用戶構(gòu)建的鏡像综苔。Registry 分為公共和私有兩種。Docker 公司 運營公共的 Registry 叫做 Docker Hub位岔。用戶可以在 Docker Hub 注冊賬號如筛,分享并保存自己的 鏡像(說明:在 Docker Hub 下載鏡像巨慢,可以自己構(gòu)建私有的 Registry)抒抬。
4)Docker容器
Docker 可以幫助你構(gòu)建和部署容器杨刨,你只需要把自己的應(yīng)用程序或者服務(wù)打包放進(jìn)容 器即可。容器是基于鏡像啟動起來的擦剑,容器中可以運行一個或多個進(jìn)程妖胀。我們可以認(rèn)為,鏡 像是Docker生命周期中的構(gòu)建或者打包階段惠勒,而容器則是啟動或者執(zhí)行階段赚抡。 容器基于 鏡像啟動,一旦容器啟動完成后纠屋,我們就可以登錄到容器中安裝自己需要的軟件或者服務(wù)涂臣。所以 Docker 容器就是: 一個鏡像格式; 一些列標(biāo)準(zhǔn)操作; 一個執(zhí)行環(huán)境。
Docker 借鑒了標(biāo)準(zhǔn)集裝箱的概念售担。標(biāo)準(zhǔn)集裝箱將貨物運往世界各地赁遗,Docker 將這個模 型運用到自己的設(shè)計中署辉,唯一不同的是:集裝箱運輸貨物,而 Docker 運輸軟件岩四。
和集裝箱一樣哭尝,Docker 在執(zhí)行上述操作時,并不關(guān)心容器中到底裝了什么炫乓,它不管是 web 服務(wù)器刚夺,還是數(shù)據(jù)庫,或者是應(yīng)用程序服務(wù)器什么的末捣。所有的容器都按照相同的方式將 內(nèi)容“裝載”進(jìn)去侠姑。
Docker 也不關(guān)心你要把容器運到何方:我們可以在自己的筆記本中構(gòu)建容器,上傳到 Registry箩做,然后下載到一個物理的或者虛擬的服務(wù)器來測試莽红,在把容器部署到具體的主機(jī)中。 像標(biāo)準(zhǔn)集裝箱一樣邦邦,Docker 容器方便替換安吁,可以疊加,易于分發(fā)燃辖,并且盡量通用鬼店。
使用 Docker,我們可以快速的構(gòu)建一個應(yīng)用程序服務(wù)器黔龟、一個消息總線妇智、一套實用工 具、一個持續(xù)集成(CI)測試環(huán)境或者任意一種應(yīng)用程序氏身、服務(wù)或工具巍棱。我們可以在本地構(gòu) 建一個完整的測試環(huán)境,也可以為生產(chǎn)或開發(fā)快速復(fù)制一套復(fù)雜的應(yīng)用程序棧蛋欣。
4 使用Docker做什么
容器提供了隔離性航徙,結(jié)論是,容器可以為各種測試提供很好的沙盒環(huán)境陷虎。并且到踏,容器本
身就具有“標(biāo)準(zhǔn)性”的特征,非常適合為服務(wù)創(chuàng)建構(gòu)建塊尚猿。Docker 的一些應(yīng)用場景如下:
加速本地開發(fā)和構(gòu)建流程窝稿,使其更加高效、更加輕量化谊路。本地開發(fā)人員可以構(gòu)建、 運行并分享 Docker 容器菩彬。容器可以在開發(fā)環(huán)境中構(gòu)建缠劝,然后輕松的提交到測試環(huán)境中潮梯,并 最終進(jìn)入生產(chǎn)環(huán)境。
能夠讓獨立的服務(wù)或應(yīng)用程序在不同的環(huán)境中惨恭,得到相同的運行結(jié)果秉馏。這一點在 面向服務(wù)的架構(gòu)和重度依賴微型服務(wù)的部署由其實用。
用 Docker 創(chuàng)建隔離的環(huán)境來進(jìn)行測試脱羡。例如萝究,用 Jenkins CI 這樣的持續(xù)集成工具 啟動一個用于測試的容器。
Docker 可以讓開發(fā)者先在本機(jī)上構(gòu)建一個復(fù)雜的程序或架構(gòu)來進(jìn)行測試锉罐,而不是 一開始就在生產(chǎn)環(huán)境部署帆竹、測試。