2017年3月,又迎來Docker的生日周,今年將有130多個Docker Meetup在全球舉辦,共同爲Docker慶生。網易雲做爲杭州的主辦方,在3月12日成功舉辦了Docker Meetup,爲Docker慶祝4週年生日!git
大雨並無影響你們的技術熱情,還有不少小夥伴特意從武漢、南京等地趕來參加活動,在這裏也感謝他們的支持!github
活動開場,網易雲高級產品經理劉發明首先爲你們帶來了開場演講,劉發明主要介紹了Docker的概念和發展歷程。docker
劉發明,網易雲高級產品經理,10年文件系統開發和架構經驗。自主開發類kubernetes容器雲管理平臺。熟悉雲計算平臺通用架構和技術。網絡
官方對於Docker的定義是:Docker是一個面向開發者、運維和企業的容器管理平臺:架構
對於開發人員來講,Docker能夠提供一套標準化的應用打包格式,避免「work on my machine」狀況的出現;app
對於運維人員來講,用Docker能夠快速搭建和配置複雜的環境;負載均衡
對於企業來講,用Docker能夠構建敏捷的軟件交付流程,產品新特性快速上線。運維
容器就是經過Linux的命名空間,將一個或一組進程互相隔離起來,用起來就很像虛擬機。微服務
容器是共享內核的,上面有不少進程,這些進程是相互隔離的;虛擬機比容器多一層內核,要裝虛擬機首先要裝一層客戶操做系統,而後在操做系統上部署應用。因此容器比虛擬機更輕量級,啓動更快。工具
但容器和虛擬機是能夠相互補充的,容器能夠部署在虛擬機上,它們互相配合能夠爲IT提供更方便的管理和部署。
最開始Docker的目的比較單一,主要是給開發者用,慢慢發展才造成了覆蓋技術社區和企業的全生態鏈的平臺。
爲了協調社區和企業的不一樣需求,Docker的版本也進行了分支,目前已經分爲社區版和企業版,社區版發佈頻率更高,發展更快;企業版每一個季度發佈一次,更穩定。
接下來,網易雲高級開發工程師汪幸分別從容器基礎、編排、網絡架構和存儲方案四個方面,介紹了網易雲在開發過程當中使用Docker的一些實踐經驗,並結合實例、場景分析了使用Docker過程當中遇到的問題以及相應的解決方案。
汪幸,網易雲高級開發工程師,北郵碩士畢業,主要從事雲計算、Kubernetes、Docker相關開發工做。
Docker的基礎功能分爲3個開源項目:Docker、Containerd和runC。Docker 1.1版本基於OCI,把本來的一個項目拆分爲了三個項目,目前runC項目也再也不是Docker主導了,而是Kubernetes、RedHat團隊來維護。2016年末,Docker公司宣佈將containerd從Docker Engine中分離,並捐贈到一個新的開源社區獨立發展和運營。不論是被迫仍是自願,Docker已經漸漸失去了對運行時項目的管控,將更多的精力放在了編排技術的研究。
Docker的底層技術主要分爲namespace和cgroups,namespace主要負責Docker的資源隔離,cgroups主要負責容器的資源控制。在容器建立之初,namespace就肯定了,沒法修改;cgroups在運行時是能夠調整的,網易雲就基於這個功能作了容器的動態調整功能。
一個容器就能夠簡單抽象爲由namespace、cgroups和Linux capabilities機制構建的一個沙盒。可是,這個沙盒在隔離性和擴展性上都有不少問題,汪幸經過2個網易雲在實踐過程當中遇到的問題進行了說明:
其中一個是資源信息顯示錯誤,好比一個16G內存的虛擬機上面跑了8個2G的容器,使用free命令,看到的仍然是16G,形成這個問題的緣由就是/proc目錄隔離不完全。
另一個問題是容器運行時掛盤的實現會遇到2個難點:一是mount namespace隔離致使主機文件系統在容器中不可見,另外一個是capabilities沒有mount權限,汪幸分別介紹了網易雲提供的解決方案。
編排就是把海量的容器部署到集羣中。汪幸首先介紹了Docker原生的三種編排技術:
Swarm獨立於Docker Engine的,集成在Docker Machine中,須要額外的KV存儲,沒有服務模型。如今基本上已是一個廢棄的項目;
SwarmKit是Swarm Mode的基礎本質上是徹底獨立的開源項目,集羣能夠不使用KV存儲,但若是用到overlay網絡則須要提供;
SwarmMode集成到了Docker Engine,不須要額外的KV存儲,支持服務模型以及相應的擴容縮容、服務發現、滾動升級、路由和負載均衡等。
網易雲底層是基於Kubernetes的編排技術,比Docker原生的Swarm技術更穩定,特性也更豐富。而且Kubernetes的架構設計來源於Google長期的集羣管理經驗,更具性能優點。
固然SwarmMode也有本身的優勢:使用很簡單,集成於Docker cli,無需KV、DNS等外部以來,部署、學習成本低;還有完整的容器生態工具鏈支持,更好地集成於Docker Compose、Docker Machine、Docker Universal Control Plane。
Docker的缺省網絡有三種:none、bridge和host,通常都不會直接使用,而是使用用戶自定義網絡:
container模式就是讓多個容器共享一個容器的網絡棧,把一組關係緊密地容器做爲統一的服務對外提供;
bridge單機網絡其實是在宿主機上建立了一個網橋,通常經過NAT技術對外提供服務;
overlay是缺省跨主機網絡,底層實現是隧道技術。
不管是經過NAT技術對外提供服務仍是overlay搭建網絡,這兩種模式再疊加到宿主機原有的網絡模式上,性能損失都是很大的。
要了解Docker的存儲驅動,首先要明確聯合掛載的概念。聯合掛載其實是把容器的讀寫層和全部鏡像的只讀層合併起來,對外提供一個視角,選擇存儲驅動實際上就是選擇如何實現這個聯合掛載。
Docker官方通過實驗也給出了不少參考標準,網易雲選擇了overlay的實現方式,也是Docker當年主推的掛載技術,相比其它AUFS和Device Mapper來講,性能是最高的,缺點是還有不少不完善的地方。汪幸也舉例說明了網易雲在存儲驅動方面遇到的問題以及解決方案。
Docker卷和Docker的網絡很相似,經過插件提供了本地卷和遠程共享卷兩種方式。網易並無使用Docker卷插件,而是使用了IaaS層基於Ceph定製的高性能雲盤,汪幸從盤處理邏輯、Docker修改和容器恢復三個方面進行了詳細說明。
接下來,網易雲的美女程序媛張雨介紹瞭如何經過容器部署的方式快速搭建Jenkins環境,完成軟件開發的容器化構建部署及測試的流程實踐。
張雨,網易雲高級系統測試工程師。2015年加入網易質量保障部平臺測試一組,在網易雲基礎服務從事測試工做。目前致力於平臺產品總體質量保障,探索提升測試效率的工具和方法。
隨着Docker技術的興起,推進了微服務、DevOps和持續集成/持續交付等技術革新。持續集成指開發人員將代碼按期合入到中央倉庫後觸發的一系列構建、靜態代碼檢查、 單元測試、 部署、接口測試等一系列構建或集成的行爲。主要目標是更快發現並解決缺陷,提升軟件質量,並減小驗證和發佈新軟件更新所需的時間。
上圖是一個傳統的持續集成流程,主要的問題是:
部署環境的成本較高 (包含持續集成自己)
測試環境的不一致性,致使問題不能復現
相對開發週期較長
張雨介紹了基於容器的持續集成的實現,使用容器搭建持續集成Master 和Slave環境,結合支持持續集成功能的鏡像倉庫,實現鏡像化版本管理,最終實現容器化CI & 容器化測試。
上圖是基於容器實現的一個持續集成流程,最明顯的變化就是Jekins換成了Docker,而且新增了容器倉庫角色,另外測試在交付的時候不光會反饋一個結果,還會把鏡像也做爲一個測試結果交付,這個鏡像裏面就封裝了代碼和配置的環境。
這樣一來持續集成環境搭建的步驟變得很是簡單,只須要建立一個Jekins的容器服務,在建立的時候設置好環境變量來解決Slave和Master註冊的問題,張雨以網易雲基礎服務爲例,詳細描述了整個過程。
「紙上得來終覺淺 絕知此事要躬行」,乾貨演講結束後,網易雲組織你們進行了Docker Lab的實踐。感興趣的小夥伴也能夠打開下面的連接去體驗一把:https://github.com/docker/labs
爲了方便你們的操做,網易雲首席技術佈道師黃慶兵特別搭建了一套在線的Docker環境:http://docker.bingohuang.com/
除了乾貨演講和Docker實踐,網易雲還提供了美味的Docker生日蛋糕,共同分享Docker的喜悅。