序言
夜渐深,佳人已入眠。。。
最好的滋味,就是耐人寻味。。。
朦胧美
标题为容器,并不是谈论容器这个技术,而只是在反思一个问题。。。
容器技术这么牛,那么如果没有用这个技术,如何说服大家来采用这门技术?想了一晚上,毫无头绪。。。三千烦恼丝了解一下。。。
容器能做什么?容器解决了什么样的问题?容器比原来的好在哪儿?
技术比较新,意味着在生产环境不成熟,不信任,出了故障暂无解决方法,生态系统不成熟,各种发布,测试,部署,监控,日志收集都可能会出现问题,放着成熟的生产环境不用,为何需要使用docker?
看看原来的方式,有哪些问题存在。。。
1、 运行时环境强依赖,传统的环境中,开发人员写代码,写好之后,给测试进行测试,测完之后,给运维人员发布,部署环境,运行维护。。。测试环境和生产环境不一致,可能会导致线上有问题而测试环境没问题;在开发的时候,在windows下开发,生产在linux运行,可能和操作系统有关;在上线的时候,需要进行部署环境,搭建各种中间件,各种数据库,分配相关的资源。以上的步骤,来一个系统就要做一次。
2、 扩容缩容不方便,传统的环境中,一般都是使用虚拟机的方式来部署测试发布应用,而在每次流量高峰的时候,例如大促时间,都要进行相关的扩容和缩容,在每次扩容和缩容的时候,都要走大量的流程,我需要多少个虚拟机,支持多少应用,运维人员都要进行相关的环境检查,并且部署环境,配置环境变量,当流量高峰过去了的时候,又要进行相应的资源回收。
3、维护成本高,传统环境中,在进行维护变更的时候,总是需要运维人员的参与,打包,然后发布,生产环境运行,发布的时候总会有各种各样的报错,可能是中间件的进程有问题,可能是环境配置不正确,如果碰到发布的日期,人手不足,运维人员压力大。
4、 移植性成本高,传统环境中,我可能在私有云中运行一套系统,我要迁移到公有云上运行,要进行各种环境配置,各种虚拟机的创建,资源分配等各种问题,花费的时间,而且会出现各种兼容性问题。
docker做为一种轻量级的虚拟化技术而出现,那么为什么需要虚拟化?
虚拟化的发展历史很早,在很早的时期,用一台物理机运行所有的应用,后来追求各种高扩展,高性能,高可靠,其实。。。这都是吹牛,主要是为了解决两个问题:第一个就是如果所有的应用运行在同一台物理机上,那么在出现问题的时候,难以追查,并且在运行应用的时候,应用之间可能相互影响,也就是某个应用抢占了所有的服务器资源,从而就需要虚拟化来解决资源隔离的问题,也就是将一个应用进行封装,从而就有VM操作系统级别的隔离,而容器则是用户空间的一种隔离的方式;第二个就是如果一台物理机只运行一个应用,那么资源得不到合理的应用,可以看到很多的物理机的CPU使用率小于百分之十,使用虚拟化的方式可以节省成本。
使用容器之后,情况将如何改变,世界将如何演变?
一个镜像贯穿开发,测试,生产等各种环境,开发人员将程序代码打成image,在本地进行测试,没问题,将image推送到镜像仓库registry,测试人员运行docker进行测试,测试完成之后,运维人员直接将这个容器在生产环境运行。。。docker的采用的方法其实和JVM是一样的,只要java在本地的JVM可以运行,那么在生产环境就不会出现问题,从而达到了,build一次,到处运行。。。docker为什么能解决这个问题,是因为在创建image的时候,不但将程序代码打入image,而且将程序代码依赖的类库也打入了image,从而不会依赖底层的操作系统。
并行运行多版本,开发人员的代码有版本跟踪,那么在打成image的时候,也可以有代码版本机制,可以使用各种版本,例如redis:V1,redis:V2 这样也就形成了各种版本,在生产环境中可以采用少量的流量来分配到这个环境中。。。docker为什么能解决这个问题,可以节省大量的资源,不需要创建那么重量级的虚拟机VM。
运维人员也无需运维各种繁杂的基础环境,只要将相应的中间件打成基础的image,从而在每次需要的时候,只要在这个基础镜像的基础上,添加上配置文件的路径即可。
节省服务器资源?
docker也是一种轻量级虚拟化技术,而VM也是,两者的根本目的是为了将资源进行隔离,两者的主要区别在于vm是整个的操作系统,docker是一个用户空间的虚拟化,也就是说,在使用docker更加轻量化,性能更高,在使用vm的时候,可能cpu指令集要进行转化,内存需要进行寻址,而IO则需要进行几次转发,而docker只是一个用户空间的程序,和宿主机共用同一个内核。。。在使用虚拟机的时候,一个物理机能划分十几个VM不得了了,而在使用docker的时候,一个物理机可以运行几百个docker。
自动化运维,在传统中,也在进行各种自动化运维操作,划分出VM之后,安装对应的软件,例如安装一个nginx,再创建一个vm,安装application,然后修改nginx的配置文件,指向后端的vm,使用docker的时候,docker提供标准的restfull api接口,从而更加便于自动化运维,在扩容缩容的时候,容器能根据流量的情况进行动态的扩容缩容,你可能说VM也可以,但是VM在扩容缩容的时候,需要各种步骤,而在容器中,只要毫秒级的启动,毫秒级的关闭,VM能做到么?做不到。。。容器本身占用的资源也很少,因为共用内核操作系统,而VM则不一样,需要运行操作系统进程,需要运行各种模拟进程,可能需要进行转换。。。性能没有docker高;docker提供的是各种restful api接口,而其他的并不一定是这种接口,而且docker是微服务的催化剂,能更好的适应微服务架构。
每次解决问题的时候,都会引入新的问题,总是没有完美的事务的发生。。。
一句话阐述容器的优点:更高效的虚拟话,更快速的交付和部署,更好的移植性,更好的性能,更轻松的迁移扩展管理。
引入容器存在的问题:
1、 监控问题,当生产环境有上千上万个容器的时候,如何进行管理监控,大规模使用的时候缺少成熟的方案。
2、 资源隔离方面没有虚拟机那么成熟,还在发展当中。
3、 引入新技术,存在一个发展时间,从开发,到测试,到发布,到部署,到运维,一套流程需要进行改进。
4、 使用容器的时候,容器天然的合适无状态的服务,而对于有状态的应用,需要更加好的方案,例如使用分布式存储。
一句话总结:对于固有观念的人来说,以上的说辞感觉很无力。。。。变化是永恒之道。。。但是有的时候,你使用的是锤子,看什么都是钉子。。。
散扯
靠什么来说服别人,这也是一门技术。。。很多技术人员看技术的时候,单纯的认为技术就是一门技术,好像有点绕。。。
技术是什么?技术有的时候为什么会让你感觉到恐慌。。。为什么会让人感觉到焦虑。。。
技术的出现是为了解决某项问题,例如nginx就是为了负载均衡,而容器就是提供一套虚拟化的解决方案,而分布式存储只是为了解决存储方面的可靠性,可用性,可扩展性,高性能。。。
技术的出现是为了解决某个方面的问题,例如我的系统是一个库存系统,其中又包括了很多,使用了缓存memcache,使用了数据库的分库分表,将各种小的技术点综合起来形成了
技术的出现是为了解决某个领域的问题,例如电商系统,例如通话系统。。。
技术的每次演进,都是因为出现了某些方面的变化,从而需要改变,例如海量数据的出现,促使了分布式存储的发生。。。例如海量数据的模糊搜索,促使了elasticsearch高性能的搜索的产生。。。
容器,平台无关性,到哪里都能游走。。。人,公司无关性,到哪里都能浪。。。学习一次,到哪里都能用,到哪里都能创造价值。。。这。。不可能,没有银弹,只有饮弹自尽。。。
那么又回到了那个亘古不变的话题。。。为什么要浪?浪能解决什么问题???
我是谁,我在哪里,我在做什么。。。
方法论和实际操作之间的距离。。。说服别人,也是一种能力。。。那么如何说服?说优点?说案例?天花乱坠。。。
感受了一下无效加班的感觉,其实感觉也蛮好的,打着游戏,加个班,也满快活的。。。
为啥不加班,因为很多问题需要解决,很多问题需要思考。。。按部就班的时候,感觉这种太容易了,每件事已经安排了,只要做就好了,而。。。选择,抉择,权衡,在迷茫之中前行,如何找到最好的方法,最快的方法,最有效的方法。。。这才是最主要的问题。
同时做三件事。。。内存已经开始泄漏了。。。要做的事儿太多,导致无事可做。。。
如果你看到一篇文章,不能立即有所感悟,是因为你不知道背后经过了多少思考,多少考量,多少抉择,多少权衡。。。你以为是对的,可能都是错的,你以为不可能的,可能正在发生。。。你看一本书,感觉不能几分钟领悟其精髓,其实。。也不要紧,因为人家可能花了十年写出了这本书。。。如果你看了这个文章,你没有任何感觉。。。也无所谓,因为你不知道考量了多久,是因为哪些原因促成了这种思想的诞生。。。如果你看到了别人的成功,你只会羡慕。。。也蛮好,你不知道背后别人努力了多少,失败了多少次。。。