1. 程式人生 > >Docker的使用(一、Docker簡介)

Docker的使用(一、Docker簡介)

(一)Docker簡介

1. 虛擬化

1)什麼是虛擬化

在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種 實體資源,如伺服器、網路、記憶體及儲存等,予以抽象、轉換後呈現出來,打破實體結構間 的不可切割的障礙,使使用者可以比原本的組態更好的方式來應用這些資源。這些資源的新虛 擬部份是不受現有資源的架設方式,地域或物理組態所限制。一般所指的虛擬化資源包括計 算能力和資料儲存。

在實際的生產環境中,虛擬化技術主要用來解決高效能的物理硬體產能過剩和老的舊的 硬體產能過低的重組重用,透明化底層物理硬體,從而最大化的利用物理硬體 對資源充 分利用

虛擬化技術種類很多,例如:軟體虛擬化、硬體虛擬化、記憶體虛擬化、網路虛擬化(vip)、 桌面虛擬化、服務虛擬化、虛擬機器等等。

2)虛擬化種類

1)全虛擬化架構

虛擬機器的監視器(hypervisor)是類似於使用者的應用程式執行在主機的 OS 之上,如 VMware 的 workstation,這種虛擬化產品提供了虛擬的硬體。
在這裡插入圖片描述
2)OS層虛擬化架構
在這裡插入圖片描述
3)硬體層虛擬化
在這裡插入圖片描述
硬體層的虛擬化具有高效能和隔離性,因為 hypervisor 直接在硬體上執行,有利於控制 VM 的 OS 訪問硬體資源,使用這種解決方案的產品有 VMware ESXi 和 Xen server

Hypervisor 是一種執行在物理伺服器和作業系統之間的中間軟體層,可允許多個操作系 統和應用共享一套基礎物理硬體,因此也可以看作是虛擬環境中的“元”作業系統,它可以 協調訪問伺服器上的所有物理裝置和虛擬機器,也叫虛擬機器監視器(Virtual Machine Monitor, VMM)。

Hypervisor 是所有虛擬化技術的核心。當伺服器啟動並執行 Hypervisor 時,它會給每一 臺虛擬機器分配適量的記憶體、CPU、網路和磁碟,並載入所有虛擬機器的客戶作業系統。 宿主 機

Hypervisor 是所有虛擬化技術的核心,軟硬體架構和管理更高效、更靈活,硬體的效能 能夠更好地發揮出來。常見的產品有:VMware、KVM、Xen 等等。

2. 什麼是Docer

在這裡插入圖片描述

容器技術

在計算機的世界中,容器擁有一段漫長且傳奇的歷史。容器與管理程式虛擬化 (hypervisor virtualization,HV)有所不同,管理程式虛擬化通過中間層將一臺或者多臺獨立 的機器虛擬執行與物理硬體之上,而容器則是直接執行在作業系統核心之上的使用者空間。因 此,容器虛擬化也被稱為“作業系統級虛擬化”,容器技術可以讓多個獨立的使用者空間執行 在同一臺宿主機上。

由於“客居”於作業系統,容器只能執行與底層宿主機相同或者相似的作業系統,這看 起來並不是非常靈活。例如:可以在 Ubuntu 服務中執行 Redhat Enterprise Linux,但無法再 Ubuntu 伺服器上執行 Microsoft Windows。

相對於徹底隔離的管理程式虛擬化,容器被認為是不安全的。而反對這一觀點的人則認 為,由於虛擬容器所虛擬的是一個完整的作業系統,這無疑增大了攻擊範圍,而且還要考慮 管理程式層潛在的暴露風險。

儘管有諸多侷限性,容器還是被廣泛部署於各種各樣的應用場合。在超大規模的多租戶 服務部署、輕量級沙盒以及對安全要求不太高的隔離環境中,容器技術非常流行。最常見的 一個例子就是“許可權隔離監牢”(chroot jail),它建立一個隔離的目錄環境來執行程序。 如果許可權隔離監牢正在執行的程序被入侵者攻破,入侵者便會發現自己“身陷囹圄”,因為 許可權不足被困在容器所建立的目錄中,無法對宿主機進一步破壞。

最新的容器技術引入了 OpenVZ、Solaris Zones 以及 Linux 容器(LXC)。使用這些新技 術,容器不在僅僅是一個單純的執行環境。在自己的許可權類內,容器更像是一個完整的宿主 機。對 Docker 來說,它得益於現代 Linux 特性,如控制元件組(control group)、名稱空間 (namespace)技術,容器和宿主機之間的隔離更加徹底,容器有獨立的網路和儲存棧,還 擁有自己的資源管理能力,使得同一臺宿主機中的多個容器可以友好的共存。

容器被認為是精益技術,因為容器需要的開銷有限。和傳統虛擬化以及半虛擬化相比, 容器不需要模擬層(emulation layer)和管理層(hypervisor layer),而是使用作業系統的系 統呼叫介面。這降低了執行單個容器所需的開銷,也使得宿主機中可以執行更多的容器。

儘管有著光輝的歷史,容器仍未得到廣泛的認可。一個很重要的原因就是容器技術的復 雜性:容器本身就比較複雜,不易安裝,管理和自動化也很困難。而 Docker 就是為了改變 這一切而生的。

容器與虛擬機器比較

1)本質上的區別
在這裡插入圖片描述
2)使用上的區別
在這裡插入圖片描述

Docker特點

1)上手快

使用者只需要幾分鐘,就可以把自己的程式“Docker 化”。Docker 依賴於“寫時複製” (copy-on-write)模型,使修改應用程式也非常迅速,可以說達到“隨心所致,程式碼即改” 的境界。

隨後,就可以建立容器來執行應用程式了。大多數 Docker 容器只需要不到 1 秒中即可 啟動。由於去除了管理程式的開銷,Docker 容器擁有很高的效能,同時同一臺宿主機中也 可以執行更多的容器,使使用者儘可能的充分利用系統資源。

2)職責的邏輯分類

使用 Docker,開發人員只需要關心容器中執行的應用程式,而運維人員只需要關心如 何管理容器。Docker 設計的目的就是要加強開發人員寫程式碼的開發環境與應用程式要部署 的生產環境一致性。從而降低那種“開發時一切正常,肯定是運維的問題(測試環境都是正 常的,上線後出了問題就歸結為肯定是運維的問題)”

3)快速高效的開發生命週期

Docker 的目標之一就是縮短程式碼從開發、測試到部署、上線執行的週期,讓你的應用 程式具備可移植性,易於構建,並易於協作。(通俗一點說,Docker 就像一個盒子,裡面 可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件 件的取。)

4)鼓勵使用面向服務的架構

Docker 還鼓勵面向服務的體系結構和微服務架構。Docker 推薦單個容器只執行一個應 用程式或程序,這樣就形成了一個分散式的應用程式模型,在這種模型下,應用程式或者服 務都可以表示為一系列內部互聯的容器,從而使分散式部署應用程式,擴充套件或除錯應用程式 都變得非常簡單,同時也提高了程式的內省性。(當然,可以在一個容器中執行多個應用程 序)

3. Docker元件

1)Docker 客戶端和伺服器

Docker 是一個客戶端-伺服器(C/S)架構程式。Docker 客戶端只需要向 Docker 伺服器 或者守護程序發出請求,伺服器或者守護程序將完成所有工作並返回結果。Docker 提供了 一個命令列工具 Docker 以及一整套 RESTful API。你可以在同一臺宿主機上執行 Docker 守護 程序和客戶端,也可以從本地的 Docker 客戶端連線到執行在另一臺宿主機上的遠端 Docker 守護程序。
在這裡插入圖片描述

2)Docker映象

映象是構建 Docker 的基石。使用者基於映象來執行自己的容器。映象也是 Docker 生命周 期中的“構建”部分。映象是基於聯合檔案系統的一種層式結構,由一系列指令一步一步構 建出來。例如:

新增一個檔案;

執行一個命令;

開啟一個視窗。

也可以將映象當作容器的“原始碼”。映象體積很小,非常“便攜”,易於分享、儲存和更 新。

3)Registry(註冊中心)

Docker 用 Registry 來儲存使用者構建的映象。Registry 分為公共和私有兩種。Docker 公司 運營公共的 Registry 叫做 Docker Hub。使用者可以在 Docker Hub 註冊賬號,分享並儲存自己的 映象(說明:在 Docker Hub 下載映象巨慢,可以自己構建私有的 Registry)。

4)Docker容器

Docker 可以幫助你構建和部署容器,你只需要把自己的應用程式或者服務打包放進容 器即可。容器是基於映象啟動起來的,容器中可以執行一個或多個程序。我們可以認為,鏡 像是Docker生命週期中的構建或者打包階段,而容器則是啟動或者執行階段。 容器基於 映象啟動,一旦容器啟動完成後,我們就可以登入到容器中安裝自己需要的軟體或者服務。
在這裡插入圖片描述

所以 Docker 容器就是: 一個映象格式; 一些列標準操作; 一個執行環境。

Docker 借鑑了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker 將這個模 型運用到自己的設計中,唯一不同的是:集裝箱運輸貨物,而 Docker 運輸軟體。

和集裝箱一樣,Docker 在執行上述操作時,並不關心容器中到底裝了什麼,它不管是 web 伺服器,還是資料庫,或者是應用程式伺服器什麼的。所有的容器都按照相同的方式將 內容“裝載”進去。

Docker 也不關心你要把容器運到何方:我們可以在自己的筆記本中構建容器,上傳到 Registry,然後下載到一個物理的或者虛擬的伺服器來測試,在把容器部署到具體的主機中。 像標準集裝箱一樣,Docker 容器方便替換,可以疊加,易於分發,並且儘量通用。

使用 Docker,我們可以快速的構建一個應用程式伺服器、一個訊息匯流排、一套實用工 具、一個持續整合(CI)測試環境或者任意一種應用程式、服務或工具。我們可以在本地構 建一個完整的測試環境,也可以為生產或開發快速複製一套複雜的應用程式棧。

4 使用Docker做什麼

容器提供了隔離性,結論是,容器可以為各種測試提供很好的沙盒環境。並且,容器本

身就具有“標準性”的特徵,非常適合為服務建立構建塊。Docker 的一些應用場景如下:

  • 加速本地開發和構建流程,使其更加高效、更加輕量化。本地開發人員可以構建、 執行並分享 Docker 容器。容器可以在開發環境中構建,然後輕鬆的提交到測試環境中,並 最終進入生產環境。
  • 能夠讓獨立的服務或應用程式在不同的環境中,得到相同的執行結果。這一點在 面向服務的架構和重度依賴微型服務的部署由其實用。
  • 用 Docker 建立隔離的環境來進行測試。例如,用 Jenkins CI 這樣的持續整合工具 啟動一個用於測試的容器。
  • Docker 可以讓開發者先在本機上構建一個複雜的程式或架構來進行測試,而不是 一開始就在生產環境部署、測試。