docker本質上是乙個採用虛擬化技術的容器,基於linux容器進行再封裝,使使用者不用關心容器的管理,而簡化應用操作。從2013開始有這個專案到現在也不過5年時間,但是發展應用卻極其迅速,主要原因就是應用簡單方便,傳統的虛擬化是基於硬體實現的,如果要部署10個應用,則需要建立10個虛擬機器,而docker是基於作業系統做的虛擬化,也就是復用本地主機的作業系統,部署運營10個應用時只需要起10個隔離的應用即可。
虛擬機器與容器區別
啟動時間:docker秒級啟動,虛擬機器分鐘級啟動。
輕量級:docker映象大小通常以m為單位,虛擬機器以g為單位。容器資源占用小,要比虛擬機器部署更快速。
效能:docker共享宿主機核心,系統級虛擬化,占用資源少,沒有hypervisor層開銷,效能基本接近物理機; 虛擬機器需要hypervisor層支援,虛擬化一些裝置,具有完整的guestos,虛擬化開銷大,因而降低效能,沒有容器效能好。
安全性:由於共享宿主機核心,只是程序級隔離,因此隔離性和穩定性不如虛擬機器,docker具有一定許可權訪問宿主機核心,存在一定安全隱患。
使用要求:vm基於硬體的完全虛擬化,需要硬體cpu虛擬化技術支援; docker共享宿主機核心,可執行在主流的linux發行版,不用考慮cpu是否支援虛擬化技術。
docker核心解決的問題是利用lxc來實現類似vm的功能,從而利用更加節省的硬體資源提供給使用者更多的計算資源。同vm的方式不同, lxc 其並不是一套硬體虛擬化方法 - 無法歸屬到全虛擬化、部分虛擬化和半虛擬化中的任意乙個,而是乙個作業系統級虛擬化方法, 理解起來可能並不像vm那樣直觀。所以我們從虛擬化到docker要解決的問題出發,看看他是怎麼滿足使用者虛擬化需求的。
使用者需要考慮虛擬化方法,尤其是硬體虛擬化方法,需要借助其解決的主要是以下4個問題:
隔離性- 每個使用者例項之間相互隔離, 互不影響。 硬體虛擬化方法給出的方法是vm, lxc給出的方法是container,更細一點是kernel namespace
可配額/可度量- 每個使用者例項可以按需提供其計算資源,所使用的資源可以被計量。硬體虛擬化方法因為虛擬了cpu, memory可以方便實現, lxc則主要是利用cgroups來控制資源
移動性- 使用者的例項可以很方便地複製、移動和重建。硬體虛擬化方法提供snapshot和image來實現,docker(主要)利用aufs實現
安全性- 這個話題比較大,這裡強調是host主機的角度盡量保護container。硬體虛擬化的方法因為虛擬化的水平比較高,使用者程序都是在kvm等虛擬機器容器中翻譯執行的, 然而對於lxc, 使用者的程序是lxc-start程序的子程序, 只是在kernel的namespace中隔離的, 因此需要一些kernel的patch來保證使用者的執行環境不會受到來自host主機的惡意入侵, dotcloud(主要是)利用kernel grsec patch解決的.、
1、docker client 客戶端
2、docker daemon 守護程序
docker是c/s架構的程式,docker的客戶端向守護程序發起請求,守護程序處理完成後返回結果。
docker客戶端既可以在本底訪問守護程序,也可以遠端訪問守護程序。
3、docker image 映象
映象是容器的基石,容器基於映象啟動,映象就像是容器的源**,儲存了用於容器啟動的各種條件。
映象是乙個層疊的唯讀檔案系統,結構如下
bootfs 引導檔案系統,很像傳統的linux引導檔案系統
rootfs root檔案系統,可以是一種或多種作業系統,如ubuntu或centos,root檔案系統永遠只能是唯讀狀態
union mount 聯合載入技術,一次載入多個唯讀檔案系統到rootfs系統之上。在外圍看到的只是乙個檔案系統,聯合載入使各層檔案系統疊加到一起,使最終的檔案系統包含所有底層檔案系統和目錄,這樣的檔案系統就是映象
乙個映象可以放到另乙個映象的頂部,位於下邊的映象叫做父映象,依次類推,最底部的映象叫做基礎映象,指的是rootfs
4、docker container 容器
通過映象啟動:容器是docker的執行單元。
啟動和執行:映象如果是構建和打包階段,則容器是啟動和執行階段
容器啟動過程:啟動時在映象的最頂層加乙個可寫的檔案系統,即可寫層。docker中執行的程式就是在這個層中執行的。docker第一次啟動乙個容器時,可寫層是空的,當檔案系統發生變化,都會應用到這一層。如果想修改乙個檔案,該檔案首先會從可讀寫層下邊的唯讀層複製到該讀寫層,該檔案的唯讀版本依然存在,但是已經被讀寫層中的該檔案副本所隱藏。這個是docker的重要機制,寫時複製(copy on write)
當建立乙個新容器時,docker構建出乙個映象棧,在棧的最頂層新增可寫層,這個讀寫層加上下邊的映象層及配置資料就構成了乙個容器。如下圖
5、docker registry 倉庫
存放使用者構建的映象,倉庫分為公有和私有,共有是指docker hub。
優點:
1.更快速的交付於部署:快速建立容器,快速迭代應用,秒級啟動,全程視覺化
2.更高效的虛擬化:核心級虛擬化,不需要額外的hypervisor
3.更輕鬆的遷移和擴充套件:可以在任意的平台上執行,應用程式可以直接跨平台遷移
4.更簡單的管理:以增量式進行修改和發布,實現自動化管理
缺點:
1.docker是基於linux 64bit的,無法在32bit的linux/windows/unix環境下使用
2.lxc是基於cgroup等linux kernel功能的,因此container的guest系統只能是linux base的
3.隔離性相比kvm之類的虛擬化方案還是有些欠缺,所有container公用一部分的執行庫
4.網路管理相對簡單,主要是基於namespace隔離
5.cgroup的cpu和cpuset提供的cpu功能相比kvm的等虛擬化方案相比難以度量(所以dotcloud主要是按記憶體收費)
6.docker對disk的管理比較有限
7.container隨著使用者程序的停止而銷毀,container中的log等使用者資料不便收集
Docker基本原理概述
docker基本原理概述 docker是乙個用於開發,交付和執行應用程式的開放平台。docker能夠將應用程式與基礎架構分開,從而可以快速交付軟體。借助docker,可以以與管理應用程式相同的方式來管理基礎架構。通過利用docker的快速交付,測試和部署 的方法,可以顯著減少編寫 和在生產環境中執行...
Docker簡介與基本概念
docker最初是dotcloud公司創始人solomon hykes發起的乙個公司內部專案,它是基於dotcloud公司多年雲服務技術的一次革新,並於2013年3月以 apache 2.0授權協議開源,主要專案 在github上進行維護。docker專案後來還加入了linux 會,並成立推動開放容...
docker命令概述
映象操作 列出docker所有映象 docker images repository 映象所在倉庫名稱 tag 映象標籤 image id 映象id created 映象建立日期 size 映象大小 搜尋映象 docker search 映象名稱 name 倉庫名稱 description 映象描述...