在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各類實體資源,如服務器、網絡、內存及存儲等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使用戶能夠比本來的組態更好的方式來應用這些資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。通常所指的虛擬化資源包括計算能力和資料存儲。linux
在實際的生產環境中,虛擬化技術主要用來解決高性能的物理硬件產能過剩和老的舊的硬件產能太低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件 對資源充分利用web
虛擬化技術種類不少,例如:軟件虛擬化、硬件虛擬化、內存虛擬化、網絡虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機等等。docker
(1)全虛擬化架構數據庫
虛擬機的監視器(hypervisor)是相似於用戶的應用程序運行在主機的OS之上,如VMware的workstation,這種虛擬化產品提供了虛擬的硬件。json
(2)OS層虛擬化架構ubuntu
(3)硬件層虛擬化centos
硬件層的虛擬化具備高性能和隔離性,由於hypervisor直接在硬件上運行,有利於控制VM的OS訪問硬件資源,使用這種解決方案的產品有VMware ESXi 和 Xen server緩存
Hypervisor是一種運行在物理服務器和操做系統之間的中間軟件層,可容許多個操做系統和應用共享一套基礎物理硬件,所以也能夠看做是虛擬環境中的「元」操做系統,它能夠協調訪問服務器上的全部物理設備和虛擬機,也叫虛擬機監視器(Virtual Machine Monitor,VMM)。安全
Hypervisor是全部虛擬化技術的核心。當服務器啓動並執行Hypervisor時,它會給每一臺虛擬機分配適量的內存、CPU、網絡和磁盤,並加載全部虛擬機的客戶操做系統。 宿主機bash
Hypervisor是全部虛擬化技術的核心,軟硬件架構和管理更高效、更靈活,硬件的效能可以更好地發揮出來。常見的產品有:VMware、KVM、Xen等等。Openstack
在計算機的世界中,容器擁有一段漫長且傳奇的歷史。容器與管理程序虛擬化(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)使用上的區別
(1)上手快。
用戶只須要幾分鐘,就能夠把本身的程序「Docker化」。Docker依賴於「寫時複製」(copy-on-write)模型,使修改應用程序也很是迅速,能夠說達到「隨心所致,代碼即改」的境界。
隨後,就能夠建立容器來運行應用程序了。大多數Docker容器只須要不到1秒中便可啓動。因爲去除了管理程序的開銷,Docker容器擁有很高的性能,同時同一臺宿主機中也能夠運行更多的容器,使用戶儘量的充分利用系統資源。
(2)職責的邏輯分類
使用Docker,開發人員只須要關心容器中運行的應用程序,而運維人員只須要關心如何管理容器。Docker設計的目的就是要增強開發人員寫代碼的開發環境與應用程序要部署的生產環境一致性。從而下降那種「開發時一切正常,確定是運維的問題(測試環境都是正常的,上線後出了問題就歸結爲確定是運維的問題)」
(3)快速高效的開發生命週期
Docker的目標之一就是縮短代碼從開發、測試到部署、上線運行的週期,讓你的應用程序具有可移植性,易於構建,並易於協做。(通俗一點說,Docker就像一個盒子,裏面能夠裝不少物件,若是須要這些物件的能夠直接將該大盒子拿走,而不須要從該盒子中一件件的取。)
(4)鼓勵使用面向服務的架構
Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只運行一個應用程序或進程,這樣就造成了一個分佈式的應用程序模型,在這種模型下,應用程序或者服務均可以表示爲一系列內部互聯的容器,從而使分佈式部署應用程序,擴展或調試應用程序都變得很是簡單,同時也提升了程序的內省性。(固然,能夠在一個容器中運行多個應用程序)
1.3 Docker組件
Docker是一個客戶端-服務器(C/S)架構程序。Docker客戶端只須要向Docker服務器或者守護進程發出請求,服務器或者守護進程將完成全部工做並返回結果。Docker提供了一個命令行工具Docker以及一整套RESTful API。你能夠在同一臺宿主機上運行Docker守護進程和客戶端,也能夠從本地的Docker客戶端鏈接到運行在另外一臺宿主機上的遠程Docker守護進程。
鏡像是構建Docker的基石。用戶基於鏡像來運行本身的容器。鏡像也是Docker生命週期中的「構建」部分。鏡像是基於聯合文件系統的一種層式結構,由一系列指令一步一步構建出來。例如:
添加一個文件;
執行一個命令;
打開一個窗口。
也能夠將鏡像看成容器的「源代碼」。鏡像體積很小,很是「便攜」,易於分享、存儲和更新。
Docker用Registry來保存用戶構建的鏡像。Registry分爲公共和私有兩種。Docker公司運營公共的Registry叫作Docker Hub。用戶能夠在Docker Hub註冊帳號,分享並保存本身的鏡像(說明:在Docker Hub下載鏡像巨慢,能夠本身構建私有的Registry)。
Docker能夠幫助你構建和部署容器,你只須要把本身的應用程序或者服務打包放進容器便可。容器是基於鏡像啓動起來的,容器中能夠運行一個或多個進程。咱們能夠認爲,鏡像是Docker生命週期中的構建或者打包階段,而容器則是啓動或者執行階段。 容器基於鏡像啓動,一旦容器啓動完成後,咱們就能夠登陸到容器中安裝本身須要的軟件或者服務。
因此Docker容器就是:
一個鏡像格式;
一些列標準操做;
一個執行環境。
Docker借鑑了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker將這個模型運用到本身的設計中,惟一不一樣的是:集裝箱運輸貨物,而Docker運輸軟件。
和集裝箱同樣,Docker在執行上述操做時,並不關心容器中到底裝了什麼,它無論是web服務器,仍是數據庫,或者是應用程序服務器什麼的。全部的容器都按照相同的方式將內容「裝載」進去。
Docker也不關心你要把容器運到何方:咱們能夠在本身的筆記本中構建容器,上傳到Registry,而後下載到一個物理的或者虛擬的服務器來測試,在把容器部署到具體的主機中。像標準集裝箱同樣,Docker容器方便替換,能夠疊加,易於分發,而且儘可能通用。
使用Docker,咱們能夠快速的構建一個應用程序服務器、一個消息總線、一套實用工具、一個持續集成(CI)測試環境或者任意一種應用程序、服務或工具。咱們能夠在本地構建一個完整的測試環境,也能夠爲生產或開發快速複製一套複雜的應用程序棧。
Docker官方建議在Ubuntu中安裝,由於Docker是基於Ubuntu發佈的,並且通常Docker出現的問題Ubuntu是最早更新或者打補丁的。在不少版本的CentOS中是不支持更新最新的一些補丁包的。
因爲我學習的環境都使用的是CentOS,所以這裏咱們將Docker安裝到CentOS上。注意:這裏建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中,安裝前須要安裝其餘不少的環境並且Docker不少補丁不支持更新。
2.3安裝Docker
使用yum命令在線安裝
yum install docker
docker -v
systemctl命令是系統服務管理器指令,它是 service 和 chkconfig 兩個命令組合。
啓動docker:systemctl start docker
中止docker:systemctl stop docker
重啓docker:systemctl restart docker
查看docker狀態:systemctl status docker
開機啓動:systemctl enable docker
查看docker概要信息:docker info
查看docker幫助文檔:docker --help
Docker鏡像是由文件系統疊加而成(是一種文件的存儲形式)。最底端是一個文件引導系統,即bootfs,這很像典型的Linux/Unix的引導文件系統。Docker用戶幾乎永遠不會和引導系統有什麼交互。實際上,當一個容器啓動後,它將會被移動到內存中,而引導文件系統則會被卸載,以留出更多的內存供磁盤鏡像使用。Docker容器啓動是須要的一些文件,而這些文件就能夠稱爲Docker鏡像。
列出docker下的全部鏡像:docker images
REPOSITORY:鏡像所在的倉庫名稱
TAG:鏡像標籤
IMAGE ID:鏡像ID
CREATED:鏡像的建立日期(不是獲取該鏡像的日期)
SIZE:鏡像大小
這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下
爲了區分同一個倉庫下的不一樣鏡像,Docker提供了一種稱爲標籤(Tag)的功能。每一個鏡像在列出來時都帶有一個標籤,例如12.十、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。在構建容器時指定倉庫的標籤也是一個好習慣。
若是你須要從網絡中查找須要的鏡像,能夠經過如下命令搜索
docker search 鏡像名稱
NAME:倉庫名稱
DESCRIPTION:鏡像描述
STARS:用戶評價,反應一個鏡像的受歡迎程度
OFFICIAL:是否官方
AUTOMATED:自動構建,表示該鏡像由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鏡像。
ustc是老牌的linux鏡像服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的docker鏡像加速器速度很快。ustc docker mirror的優點之一就是不須要註冊,是真正的公共服務。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
步驟:
(1)編輯該文件:vi /etc/docker/daemon.json // 若是該文件不存在就手動建立;說明:在centos7.x下,經過vi。
(2)在該文件中輸入以下內容:
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
(3)注意:必定要重啓docker服務,若是重啓docker後沒法加速,能夠從新啓動OS
一、 docker rmi $IMAGE_ID:刪除指定鏡像
二、 docker rmi `docker images -q`:刪除全部鏡像