xiaohacontainer, docker, windows-來自微軟Azure CTO的佈道

https://azure.microsoft.com/zh-cn/blog/containers-docker-windows-and-trends/linux

今天這個時代當你討論雲計算時,不談談docker是不可想象的。各行各業的成功組織,從銀行等金融組織到電子商務公司都但願可以清晰理解到底container容器是個什麼,container對於運行於雲端的application意味着什麼,以及容器化對於他們組織的開發及IT運營場景有什麼好處,他們能夠如何運用。。本文中,我將從最基礎的topic開始:到底什麼是container,他們是如何工做的,隨後轉到container當前應用的最多場景,最後也會講講應該如何擁抱這種容器化的計算趨勢,實現如何用好這種雲計算開發模式無縫地實現build, test,deploy以及manage你地雲計算application.docker

containers overview

從理論上上說,全部的computing本質上就是在一套物理資源上運行一些function完成某個特定的任務,這些資源包括cpu,memory,disk,network等。好比簡單的數學計算任務或者一個分佈於多個機器上的複雜application(好比exchange郵箱系統)都是這種模式:資源+軟件.隨着計算機技術的發展,物理硬件資源愈來愈強大,這致使一個問題是:資源的巨大浪費,由於每個application實際上僅僅須要很是少的一部分資源,而它可能卻獨佔了整臺機器。這就產生了"虛擬化"的需求,虛擬的資源就是用於模擬底層物理硬件,容許多個應用同時運行在同一臺機器上:每個app都只使用物理資源的很小一部分。這些模擬技術咱們稱爲虛擬化。當人們聽到虛擬化這個詞語時大多數人都想到的是virtual machine,可是須要指出的是,虛擬機器僅僅是虛擬化的一種實現。virtual memory,虛擬內存這在全部的通用OS中實現的機制,可以使得application產生它擁有全部的計算機內存的假象,甚至這種GPOS提供的virtual memory機制可使得app可以使用比物理內存要大的多的"內存".而containers是另一種虛擬化啊,也被稱爲OS virtualization.今天在Linux系統中,container給application建立了一個徹底隔離和獨立的OS運行環境。對於運行中的container來講,本地磁盤看起來就是一個完整乾淨的OS文件系統,好比/usr,/local,/etc等等目錄,而其看到的內存佔用狀況就是一個全新重啓後的OS運行狀況:也就是隻有OS自己在運行,在佔用着內存資源。爲了實現這種效果(僅有單獨新OS運行和佔用內存),負責建立container的host主機須要作一些很是聰明的操做並基於幾個關鍵技術。windows

1. 首先是namespace isolation安全

命名空間包含了應用能夠交互的全部資源,包括files, network ports以及running process list。namespace isolation使得Host主機可以給每一個容器分配一個虛擬化的namespace,該namespace中僅僅包含了該應用能夠看到的資源。有了這個視圖的限制性,應用自己沒法訪問到不在namespace中的文件,即便自己他們可能有權限訪問,由於很簡單,app自己就看不到這些資源,又如何訪問呢?另外app也沒法列出或者訪問那些不在container namespace中的應用,這使得應用自己就覺得只有它本身在運行,可是實際上可能有成千上萬的app在同時運行中,這不過就是一個障眼法。網絡

爲了提升效率,不少OS文件,目錄以及運行中的service都是由不少container共享的,而且被投射到每一個容器的namespace中。app

只有當應用自己針對容器作了修改時,好比修改或者建立一個新的文件時,container會從底層的host os中獲取到一個copy,並保存相應的修改。注意僅僅是修改的部分自己會被保存哦,這實際上就是docker的"copy-on-write"優化機制.這種共享機制使得在一個host主機上部署多個容器很是高效!工具

2. host主機控制每一個container可以使用的主機資源數量.有效控制好比CPU,RAM和網絡帶寬這類資源能夠保證每一個容器可以得到它所須要的資源數量,而且容器自己的運行不會影響到其餘container的運行性能。性能

好比,若是一個容器被限制最多隻能使用10%的CPU能力,這意味着即便該容器的應用不遺餘力去搶佔CPU,它也不能獲得另外90%未分配給它的CPU能力!而這個90%的CPU能力host主機能夠分派給其餘的container容器或者host本身使用。linux實現這種控制資源使用配額的技術被稱爲"cgroups". 固然並非每種場景都須要作這種嚴格的資源配額控制的,好比若是在一個host上全部的容器自己就是合做式的,而非競爭關係的,須要考慮標準的應對app變動的資源需求,容許標準的OS動態資源分配.那麼就無需作這種控制.優化

 

因爲OS虛擬化帶來的快速啓動的優勢,和因爲namespace隔離以及cgroups資源控制帶來的可靠性優勢使得containers很是適合於application development和testing.在開發流程中,開發人員能夠快速迭代. 因爲container運行的環境和資源使用狀況在跨系統時徹底一致,那麼這一點能夠保證在開發人員的環境中能夠運行ok的話,就能夠在生產環境中一樣安全work.ui

快速啓動和小尺寸對於雲場景也有很大好處,由於app能夠很快速的scale out而且可以容許更多的instance被建立(由於尺寸小,資源佔用很小哦),這樣更加充分地利用好有限的物理資源。

若是和使用virtumal machine的解決方案來對比,使用container會因爲這種sharing帶來很高的效能。

在下面使用vm方案中,host主機有三個vm,爲了得到app的徹底隔離特性,每一個vm都有對應的OS文件,庫文件和應用程序代碼,以及一個有指定好內存的獨佔OS。啓動一個新的VM須要啓動一個新的OS實例,雖然host主機或者其餘vm已經有了相同版本OS正在運行中,也沒法共用這個OS。每一個APP VM都必須吃進OS啓動所須要的時間,以及OS對應消耗的內存,而這將大大下降可以起的VM個數

 

 下面這張圖則時使用container時的狀況。全部的容器都共享host主機的OS,包括kernel和lib,所以這些container自己不須要啓動一個OS,加載library,從而也就大大下降了memory的佔用。所須要的額外資源僅僅是須要使能app運行於容器這個機制所須要的memory和disk space.因爲app的環境就是一個完整獨立的OS,

 

 

OCI

隨着打包成docker image的應用愈來愈多,docker最近組織成立了Open Container Initiative的標準化組織,確保packaging的format是統一的,以便有更多的廠商加入進來,這其中就有microsoft

Windows Server和Containers

微軟宣佈在windows server中實現container技術。爲了使得用慣了Linux docker container的開發人員在windows server container上有相同的體驗,微軟宣佈和Docker創建戰略合做,擴展Docker API和工具集以便支持windows server containers.

相關文章
相關標籤/搜索