docker的入門簡介
可能寫的不是很完美,需要大家指正修改和意見(謝謝合作)
docker的入門:
docker的好處:
1.更快交付你的應用(Faster delivery of your applications)
2.讓部署和測試更加簡單(Deploying and scaling more easily)
3.實現更高密度和更多的負載 (Achieving higher density and running more workloads)
docker的目標:
docker的目標是實現輕量級的作業系統虛擬化解決方案,建立軟體程式可移植的輕量容器
docker底層實現
- docker的基礎是linux容器(LXC)等技術
- 在LXC的基礎上docker進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。
- docker是使用Cgroups來提供的容器隔離,而union檔案系統用於儲存映象並使容器變得短暫
簡介Cgroups:
Cgroups是linux核心提供的一種可以限制單個程序或者多個程序所使用資源的機制,可以對cpu,記憶體等資源實現精細話的控制,目前越來越火的輕量級容器docker就是使用了Cgroups提供的資源限制能力來完成cpu,記憶體部分的資源控制
另外,開發者也可以使用Cgoups提供的精細化控制能力,限制某一個或者某一組程序的資源呼叫,比如在一個部署web伺服器也部署可後端計算模組的八核伺服器上,可以使用Cgroups限制web server僅可以使用計算計6核,把剩下的兩核給後端計算模組
本文從以下四個方面描述cgroups的原理及用法:
1.Cgroups概念及原理
2.Cgroups檔案系統概念及原理
3.Cgroups使用方法介紹
4.Cgroups實踐中的例子
概念及原理:
Cgroups子系統
cgroups的全稱是control(管理) groups,cgroups為每種可以控制的資源定義了一個子系統,典型的子系統介紹如下:
- cpu子系統:主要限制程序cpu使用率
- cpuacct子系統:可以統計cgroups中的程序的cpu試用報告
- cpuset子系統:可以為Cgroups中的程序分配單獨的cpu節點或者記憶體節點
- memory子系統:可以限制程序的memory使用量。
- blkio子系統:可以限制程序的塊裝置io
- devices子系統:可以控制程序能訪問某些裝置
- net_cls子系統,可以標記Cgroups中程序的網路資料包,然後可以使用tc模組(traffic control)對資料包進行控制
- freezer子系統:可以掛起或者恢復cgroups中的程序
- ns子系統:可以使用不同Cgroups下面的程序使用不同的namespace
這裡邊的每一個子系統都需要與核心的其他模組配合來完成資源控制,比如對cpu資源的限制是通過程序排程模組根據cpu子系統的配置完成的
對記憶體資源限制的規則是記憶體模組根據memory子系統配置來完成的
對網路資料包的控制則需要traffic control子系統來配合完成
本文不會討論核心是如何使用每一個子系統來實現資源的限制,而是重點放在核心是如何把 cgroups 對資源進行限制的配置有效的組織起來的,和核心如何把cgroups
配置和程序進行關聯的,以及核心是如何通過 cgroups 檔案系統把cgroups的功能暴露給使用者態的。
深入Cgroups
http://blog.jobbole.com/88836/
http://www.ttlsa.com/linux/use-cgroups-to-limit-mongodb-memory-usage/
docker和虛擬機器的對比:
虛擬機器;vmware需要模擬整臺伺服器包括硬體,每臺虛擬機器都需要有自己的作業系統,
虛擬機器只要被開啟,那麼分配給他的資源他將全部使用,每一臺虛擬機器包括應用,必要的二進位制和庫以及一個完整的使用者作業系統
容器:容器是和宿主機作業系統共享硬體資源及作業系統,可以實現資源的動態分配,在容器內包含應用和其所有的依賴包,但是與其他容器共享核心,容器在宿主機在使用者空間以分離的程序執行
優點:
- 啟動快秒級別
- 需要的資源較少,docker在作業系統級別進行虛擬化,docker容器和核心互動,幾乎沒有效能損耗,效能優於通過hypervisor層與核心層的虛擬化
- 部署快:不用建立實體檣隔離(多NameSpace),有樣板間可參考(映象服務)
docker的特性:
互動式shell:docker可以分配一個虛擬終端並關聯到任何容器的標準輸入上,列入執行一個一次性互動shell
檔案系統隔離:每個程序容器執行在完全獨立的根檔案系統裡
寫時複製:採用寫時複製方式建立根檔案系統,這讓部署變得極其快捷,並且節省記憶體和硬碟空間
資源隔離:可以使用cgroups為每個程序分配不同的系統資源
網路隔離:每個程序容器執行在自己的網路空間裡,擁有自己的虛擬介面和IP地址
日誌記錄:docker將會收集和記錄每個程序容器的標準流(stdout/stderr/stdin),用於實時檢索或批量檢索
變更管理:容器檔案系統的變更可以提交到新的映像中,並可重複使用已建立更多的容器,無需使用模板或手動配置
docker幾個引擎(主要組建):
- server,就是一個守護程序,他會一直執行在後臺
- rest api,說明如何與server互動和指示它執行命令
- client,是客戶書寫指令的地方,也俗稱shell
- image;俗稱映象
- container:容器,裝載和執行映象
- network:網路,容器通過暴漏埠與主機埠繫結,達到接受來自主機的訊號
- volume:外掛為了能夠持久化資料以及共享容器之間的資料docker提供出了volume的概念
docker執行流程:
當我們想執行一個容器的時候docker會:
- 拉取一個映象,若本地不存在則在網上拉取
- 建立新的容器
- 分配union檔案系統並且掛著一個可讀寫的層,任何修改容器的操作都會被記錄在這個讀寫層上,你可以儲存這些修改成新的映象,也可以選擇不儲存,那麼下次執行改映象的時候所有修改操作都會被消除
- 分配網路\橋接介面,建立一個允許容器與本地主機通訊的網路介面
- 設定ip地址,從池中尋找一個可用的ip地址附加到容器上,換句話說,localhost並不能訪問到容器
- 執行你指定的程式
- 捕獲並且提供應用輸出,包括輸入、輸出、報錯資訊