個人理解Docker的每一個虛機其實是宿主操作系統中的一個進程。主要是一種虛擬化技術。OpenStack主要解決的是基礎架構雲的雲服務問題。OpenStack是在虛擬化技術之上的一層,主要解決系統部署管理的自動化。OpenStack可以兼容多種虛擬化技術包括:PowerVM, KVM, VMware, Docker等。
openstack是Iaas,是管理IT資源的,利用openstack和計算,存儲,網絡資源池化,然后以很靈活的方式分配最終用戶。
docker是一種軟件包的集成技術。有點類似現實中的集裝箱。
openstack本身可以使用docker技術去封裝,去實施。
openstack管理的虛機中可以使用docker去部署各種開發環境。
類別 | Docker | OpenStack |
應用平台 | PaaS | IaaS |
部署難度 | 簡單 | 復雜 |
執行性能 | 和物理性能幾乎一致 | vm會占用資源 |
鏡像體積 | MB | GB |
管理效率 | 簡單 | 復雜 |
隔離性能 | 較高 | 徹底隔離 |
可管理性 | 單進程,較弱 | 完整的管理系統 |
網絡連接 | 較弱 | Neutron靈活組件網絡 |
啟動速度 | 極快 | 稍慢 |
openstack在硬件資源的管理方面已經比較成熟了:
- 單機的虛擬化技術優化
- 計算:kvm用的最多,已經非常成熟了;目前的一些重點在虛機熱遷移的優化上。
- 存儲/網絡:SR-IOV或者vhost-net/vhost-block已經可以把存儲和網絡IO的的虛擬化算好從幾年前的40-50%減少到20%;目前有人在嘗試把hadoop之類IO密集型應用部署到openstack上。
- SDS:目前看無論openstack的廠商,還是用戶本身,對ceph熱情很高,ceph版本本身的穩定性已經可以在生產上跑了(ceph社區目前把重點放在了文件系統上);缺點是ceph軟件本身需要根據自己的硬件配置做深度的perfomance tune;以筆者自己的經驗看用戶不太放心把重要數據放在虛機的數據盤上。數據庫還是在物理環境的比較多。
- SDN:各種傳統的網絡設備廠商的硬件SDN方案到OpenvSwitch的穩定和強大的openflow協議支持。傳統的負載均衡、防火牆硬件廠商也紛紛為neutron提供plugin,以后配置負載均衡和防火牆開端口,都可以在OpenStack上進行;openstack的SDN對於私有雲來說足夠了,做vlan隔離方案已經比較成熟了;多租戶的公有雲方案再推出了DVR的方案之后逐步演進把;前段跟一個阿里前輩交流過,neutron缺的東西,mac nat,vpc之類,DPDK,sr-iov之類,阿里雲應該已經解決了;其他小廠商也是用的軟的SDN,在openflow的流表控制方面,還不太成熟。
- 編排:heat和murano發展還是比較快打,跟docker比yaml編寫過於復雜,一是編寫時需要指定各種物理資源,必須熟悉整套openstack環境才可以;二是配置操作的各種shell腳本,例如yum之類,需要寫在編排的yaml里面,而對於docker來說只要寫在dockerfile里面就行了,不需要寫到yaml里面。
與openstack對比,Docker則在應用程序的部署和編排方面具有較大的優勢;
- 物理機/虛機環境下,自動化部署一個分布式系統是一件很專業和復雜的事情。需要借助puppet/salt/ansible的自動化部署工具,通過遠程執行各種rpm install,sytemctl、設置主機名,免密碼登錄等等復雜操作。很多的復雜系統,專門成立一個子項目來解決自動化部署問題。
- docker解決了包沖突問題,不需要關心是ubuntu還是centos,可以在一個centos的host的啟動一個ubuntu容器編譯ubuntu的包;如果比較激進,cents也不要了,coreOS+rocket,國內用coreOS還比較少
- 對於docker而言,啟動一個一個容器就是一個應用的運行時環境,這個應用的啟動參數,可以用環境變量、命令行參數、配置文件等多種方式傳給應用,這些東西既可以固化在dockerfile里面,可以通過編排系統在容器啟動時動態生成;
- 有了docker后,復雜的配置工作可以通過dockerfile和容器編排引擎來做;靜態配置寫到dockerfile里面,動態配置在容器啟動時從編排引擎下發給容器的環境變量。
- 分布式系統的自動化部署的容器化,已經成為一個趨勢。現在openstack自己的部署也向容器化發展。
- 有興趣的可以看下rancher,部署起來非常方便,不需要關心自己是部署在公有雲還是私有雲還是物理機上。
Docker的缺點
- 主要是網絡方案不太成熟。有個朋友說docker把各種SDN方案引進之后,搞的跟openstack一樣復雜。Docker網絡比較困難的是實現容器環境和原來的物理環境的雙向三層互通、隔離和QoS保障;目前沒有特別好的方案,需要根據自己的需求、應用特點、和網絡設備環境和人員配置進行折中選擇。
- 另外一個缺點是太火了乃至於社區內部分家了,hypervisor有了fork,網絡接口也有了fork(com/cni),調度和編排引擎竟然有三個(算上rancher/cattle就更多),組網模型則有n個(neutron+ovs,calico,flannel,swarm vxlan,contive,weave,cattle/ipsec,nat映射,物理三層交換機等等),新手絕對是選擇恐懼症。
- cgroup還有些坑,比如內核中軟件資源的隔離,比如文件描述符,inode,slab內存等,低版本內核和發行版支持不太好,coreOS沒太研究,可能好些。
- docker registry的管理功能比較弱,查個鏡像的版本號需要自己寫腳本,修改一個鏡像的環境變量,需要push/pull整個鏡像。
- 網絡依賴搞,必須通外網,否則也得設置個代理;docker file的編寫,對於新手工程師,有些難度。
總結一下個人建議:
- 如果公司規模足夠大,IaaS肯定要做,openstack已經比較成熟了,用os做編排和ci/cd也是可以的
- 全新環境,規模不大,對應用的SLA要求不是太高,上docker沒問題。
- 生產上做大規模部署,還是要等下docker的網絡方案更成熟一些,另外一個是等cgroup的一些沒做完的工作再完善些。
- 想玩大數據,用docker不錯,部署擴容之類,都很快,github上的開源項目不少。openstack/sahara就不建議嘗試了。
OpenStack
OpenStack是一個開源的雲計算管理平台項目,由幾個主要的組件組合起來完成具體工作。OpenStack支持幾乎所有類型的雲環境,項目目標是提供實施簡單、可大規模擴展、豐富、標准統一的雲計算管理平台。OpenStack通過各種互補的服務提供了基礎設施即服務(IaaS)的解決方案,每個服務提供API以進行集成。
OpenStack是一個旨在為公共及私有雲的建設與管理提供軟件的開源項目。機構與個人都將OpenStack作為基礎設施即服務(IaaS)資源的通用前端。OpenStack項目的首要任務是簡化雲的部署過程並為其帶來良好的可擴展性。
Docker
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app)。幾乎沒有性能開銷,可以很容易地在機器和數據中心中運行。最重要的是,他們不依賴於任何語言、框架包括系統。
Docker 是 PaaS 提供商 dotCloud 開源的一個基於 LXC 的高級容器引擎,源代碼托管在 Github 上, 基於go語言並遵從Apache2.0協議開源。
OpenStack與Docker的結合使用
為什么流行兩者的結合:https://www.zhihu.com/question/35425470/answer/62993113
學習資料
OpenStack
什么是OpenStack:http://opensource.com/resources/what-is-openstack
OpenStack源碼在哪:https://github.com/openstack/
OpenStack官方入門學習文檔和試用鏈接:http://www.openstack.org/software/start/
OpenStack演講PPT(翻牆):http://www.slideshare.net/openstack/presentations
Docker
github資料: https://github.com/widuu/chinese_docker/blob/master/SUMMARY.md
gitboot:Docker – 從入門到實踐:http://yeasy.gitbooks.io/docker_practice/content/index.html
docker與openstack的關系
最近Docker和OpenStack是在信息化基礎設備虛擬化或雲化方面最火的兩個開源項目,他們有關系嗎,下面來分析分析。
先看看他們分別是什么,我嘗試不用網上的高大上術語,而用大白話來解釋一下他們,或者刺破他們。
OpenStack:它由很多的組件組成,如果沒接觸過,基本上你會暈頭轉向。但是我們只要從它試圖要解決的問題來看就不難理解它。它是管理服務器/網絡/塊存儲的工具。關於塊存儲,簡單的理解是把一堆磁盤用軟件組合成一個大磁盤給操作系統使用。就是管理一堆服務器,然后在有需要的時候在它的管理界面上分配一些存儲/分配IP/創建虛擬機。所以他的最終目的還是管理虛擬機,它於你可能用過的virtualbox、vmware桌面版不同的地方就是你用的那些小東東只能管理你自己那一台機器上的虛擬機,openstack可以管理一堆服務器上的虛擬機,哦,忘了還有有些技術專家常說的網絡和存儲。
Docker:簡單說它用比虛擬機技術少很多的資源消耗實現了類似於虛擬機的對CPU/磁盤/網絡的隔離,同時在AUFS層存儲的基礎上實現的部署標准化。舉例來說你可以在網上下載到安裝好mysql、redis的docker 鏡像,然后在你的linux環境中運行起來,你也可以把你的應用生成為一個鏡像,然后在開發環境運行/然后在正式環境運行,而鏡像是層疊的,這意味着上層鏡像會非常小。
很多人說他們不可以比較,其實他們是可以比較的,OpenStack是IaaS層的東西,有人可能不知道IaaS層是什么,簡單的說就是把一堆服務器整合起來,然后自由自在的在這些服務器上創建管理很多的虛擬機,還會涉及到網絡和磁盤的虛擬化。當然你暫時還是不要想把多個服務器上的CPU合起來變成一個更強大的虛擬機這種美事。而Docker和以Docker為主的swarm或Kubernetes在虛擬化方面想做的與Openstack基本是一樣的事,但相對kvm之類的虛擬機它消耗了更少更少的硬件資源。但是他還做了一些部署標准化,所以docker是一個橫跨IaaS和PaaS的東西,或者它刺破了原來對IaaS和PaaS的嚴格分層,讓這些術語或說着這些術語的人們包括我都有些凌亂了。但它又是那么的簡捷、有效。
那么問題來了,
問題1:docker和openstack會融合嗎?
會的,目前有幾個可能的方向,1.是把docker封裝一層,變成類似kvm的虛擬機引擎。2.是把docker運行到openstack管理的虛擬機中。3.是把openstack用到的各個組件裝到docker容器,方便部署。我們來仔細分析一下這幾個可能的方向。
1.把docker封裝成虛擬機引擎,這是一個看起來比較有效和直接的溶合了docker的方案,但,是有問題的,必竟它不是虛擬機,沒有實現虛擬機那樣對資源徹底的隔離,所以你登錄到docker虛擬出來的容器和登錄到kvm等虛擬機引擎虛擬出來的虛機上時雖然感覺差不多,但一些涉及到相對低層的命令的執行結果是不一致的。所以docker不是一個好的虛擬機引擎,因為它就不是虛擬機引擎。另一方面,這種方式的集成會屏蔽docker在部署上的優勢。所以如果Openstack要全面的溶合docker,那它就不是現在的openstack了,它就不是IaaS層的東東了。
2.把docker運行到openstack管理的虛擬機中,這是虛擬中的虛擬,有點黑客帝國的味道或盜夢空間?土豪的節奏啊,不用評論了。
3.把openstack用到的各個組件裝到docker容器上,這個不錯,正好是對docker的很好的使用,證明了docker的能力。但是。。。這是溶合嗎。
問題2:docker會取代openstack嗎?
不知道,但是以docker為代表的容器技術應該會極大的壓縮openstack在虛擬機方面的使用空間,哦對了,openstack還會管理網絡和存儲。但是需要它管理嗎,不需要嗎。必須要用windows的情況下還是不能用docker的,因為這一點,docker也會一定層度上拉升在服務器領域的linux操作系統占有率。一些需要強硬件資源隔離的場景下還是使用openstack之類的技術的。