1. 程式人生 > >Docker安裝以及原理詳解

Docker安裝以及原理詳解

Docker

  1. docker簡介

1.1虛擬化

1.1.1什麼是虛擬化

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

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

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

1.1.2虛擬化種類

  1. 全虛擬化架構

虛擬機器的監視器(hypervisor)是類似於使用者的應用程式執行在主機的OS之上,如VMware的workstation,這種虛擬化產品提供了虛擬的硬體。

(2)OS層虛擬化架構

  1. 硬體層虛擬化

硬體層的虛擬化具有高效能和隔離性,因為hypervisor直接在硬體上執行,有利於控制VM的OS訪問硬體資源,使用這種解決方案的產品有VMware ESXi 和 Xen server。

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

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

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

1.2什麼是Docker

1.2.1容器技術

在計算機的世界中,容器擁有一段漫長且傳奇的歷史。容器與管理程式虛擬化(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.2容器與虛擬機器比較

  1. 本質上的區別

  1. 使用上的區別

虛擬機器已死,容器才是未來。

1.2.3 Docker特點

  1. 上手快。

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

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

2)職責的邏輯分類

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

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

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

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

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

1.3 Docker元件

1.3.1 Docker客戶端和伺服器

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

1.3.2 Docker映象

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

新增一個檔案;

執行一個命令;

開啟一個視窗。

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

1.3.3 Registry(註冊中心)

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

1.3.4 Docker容器

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

所以Docker容器就是:

一個映象格式;

一些列標準操作;

一個執行環境。

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

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

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

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

2.Docker安裝與啟動

2.1安裝環境說明

Docker官方建議在Ubuntu中安裝,因為Docker是基於Ubuntu釋出的,而且一般Docker出現的問題Ubuntu是最先更新或者打補丁的。在很多版本的CentOS中是不支援更新最新的一些補丁包的。

注意:這裡建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中,安裝前需要安裝其他很多的環境而且Docker很多補丁不支援更新。

2.2在VMware Workstation中安裝CentOS7

資料已經準備了安裝好的映象,直接掛載即可。

掛載後,使用ip addr命令檢視本地IP

2.3安裝Docker

使用yum命令線上安裝

yum install docker

2.4安裝後檢視Docker版本

docker -v

2.5啟動與停止Docker

systemctl命令是系統服務管理器指令,它是 service 和 chkconfig 兩個命令組合。

  1. 啟動docker:systemctl start docker
  2. 停止docker:systemctl stop docker
  3. 重啟docker:systemctl restart docker
  4. 檢視docker狀態:systemctl status docker
  5. 開機啟動:systemctl enable docker

  1. 檢視docker概要資訊:docker info
  2. 檢視docker幫助文件:docker --help

3.Docker映象操作

3.1什麼是Docker映象

Docker映象是由檔案系統疊加而成(是一種檔案的儲存形式)。最底端是一個檔案引導系統,即bootfs,這很像典型的Linux/Unix的引導檔案系統。Docker使用者幾乎永遠不會和引導系統有什麼互動。實際上,當一個容器啟動後,它將會被移動到記憶體中,而引導檔案系統則會被解除安裝,以留出更多的記憶體供磁碟映象使用。Docker容器啟動是需要的一些檔案,而這些檔案就可以稱為Docker映象。

3.2列出映象

列出docker下的所有映象:docker images

  1. REPOSITORY:映象所在的倉庫名稱
  2. TAG:映象標籤
  3. IMAGE ID:映象ID
  4. CREATED:映象的建立日期(不是獲取該映象的日期)
  5. SIZE:映象大小
  6. 這些映象都是儲存在Docker宿主機的/var/lib/docker目錄下

為了區分同一個倉庫下的不同映象,Docker提供了一種稱為標籤(Tag)的功能。每個映象在列出來時都帶有一個標籤,例如12.10、12.04等等。每個標籤對組成特定映象的一些映象層進行標記(比如,標籤12.04就是對所有Ubuntu12.04映象層的標記)。這種機制使得同一個倉庫中可以儲存多個映象。--- 版本號

我們在運行同一個倉庫中的不同映象時,可以通過在倉庫名後面加上一個冒號和標籤名來指定該倉庫中的某一具體的映象,例如docker run --name custom_container_name –i –t docker.io/ubunto:12.04 /bin/bash,表明從映象Ubuntu:12.04啟動一個容器,而這個映象的作業系統就是Ubuntu:12.04。在構建容器時指定倉庫的標籤也是一個好習慣。

3.3搜尋映象

如果你需要從網路中查詢需要的映象,可以通過以下命令搜尋

docker search 映象名稱

  1. NAME:倉庫名稱
  2. DESCRIPTION:映象描述
  3. STARS:使用者評價,反應一個映象的受歡迎程度
  4. OFFICIAL:是否官方

AUTOMATED:自動構建,表示該映象由Docker Hub自動構建流程建立的

3.4拉取映象

3.4.1從Docker Hub拉取

Docker映象首頁,包括官方映象和其它公開映象。Docker Hub上最受歡迎的10大映象(通過Docker registry API獲取不了映象被pull的個數,只能通過映象的stars數量,來衡量映象的流行度。毫無疑問,擁有最高stars數量的庫都是官方庫)。

國情的原因,國內下載 Docker HUB 官方的相關映象比較慢,可以使用國內(docker.io)的一些映象加速器,映象保持和官方一致,關鍵是速度塊,推薦使用。Mirror與Private Registry的區別:

Private Registry(私有倉庫)是開發者或者企業自建的映象儲存庫,通常用來儲存企業內部的 Docker 映象,用於內部開發流程和產品的釋出、版本控制。

Mirror是一種代理中轉服務,我們(比如daocloud)提供的Mirror服務,直接對接Docker Hub的官方Registry。Docker Hub 上有數以十萬計的各類 Docker 映象。

在使用Private Registry時,需要在Docker Pull 或Dockerfile中直接鍵入Private Registry 的地址,通常這樣會導致與 Private Registry 的繫結,缺乏靈活性。

使用 Mirror 服務,只需要在 Docker 守護程序(Daemon)的配置檔案中加入 Mirror 引數,即可在全域性範圍內透明的訪問官方的 Docker Hub,避免了對 Dockerfile 映象引用來源的修改。

簡單來說,Mirror類似CDN,本質是官方的cache;Private Registry類似私服,跟官方沒什麼關係。對使用者來說,由於使用者是要拖docker hub上的image,對應的是Mirror。yum/apt-get的Mirror又有點不一樣,它其實是把官方的庫檔案整個拖到自己的伺服器上做映象,並定時與官方做同步;而Docker Mirror只會快取曾經使用過的image。

使用命令拉取:

docker pull centos:7

目前國內訪問docker hub速度上有點尷尬,使用docker Mirror勢在必行。現有國內提供docker映象加速服務的商家有不少,下面重點ustc映象。

3.4.2 ustc的映象

ustc是老牌的linux映象服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的docker映象加速器速度很快。ustc docker mirror的優勢之一就是不需要註冊,是真正的公共服務。

步驟:

(1)編輯該檔案:vi /etc/docker/daemon.json  // 如果該檔案不存在就手動建立;說明:在centos7.x下,通過vi。

(2)在該檔案中輸入如下內容:

{

"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]

}

(3)注意:一定要重啟docker服務,如果重啟docker後無法加速,可以重新啟動OS

然後通過docker pull命令下載映象:速度槓槓的。

3.5刪除映象

  1. docker rmi $IMAGE_ID:刪除指定映象
  2. docker rmi `docker images -q`:刪除所有映象

相關推薦

no