个人理解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(FQ):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之类的技术的。