容器化这个词,对于互联网公司的运维人员来说是非常熟悉的。但我们测试开发的兄弟姐妹可能会有疑问:这个与测试有什么关系?其实不是有关系,而是回归到我们平时工作中遇到的困难,以及对于这些困难,我们提供了什么解决方案。
不管从事开发工作也好,测试工作也罢,如果懂得容器化会对自己的工作有很大的增益。工欲善其事必先利其器,容器化(Docker)不管对于开发者来说,还是测试人员来说都是一把利器。
比较重要的一点是可以帮忙公司降低cost,这对于老板们来说是非常有说服力的,以下给大家举两个例子,说明一下Docker的用处,都是女巫工作中遇到的典型案例,当然这远远不能全面说明Docker的好处,但是已经很能说明问题。
便捷的迁移扩展
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易,用户可以很轻易地将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
以下是真实的范例(RF Tool C++环境问题)说明确保执行环境一致性是多么重要(血泪史:理清执行环境的一致性花了1.5天/2人的时间)。
RF Tool C++环境问题说明
开发时间已经超过4年的工具(C++开发),突然被告知"完全无法使用",该怎么办?
首先对于Tool的品质有最起码的自信:不至于说完全无法使用,所以怀疑的焦点就是这个Tool的运行环境问题。最后厘清是excel版本的问题。
厘清过程说明
Tool运行环境:
Tool运行结果
使用者电脑:
当使用默认安装的NI软体,且在仪器和DUT均未连接的情况下,运行FCC test case时出现"Run time error";
当两个NI软体在卸载后重新安装,且将subitem全部选中后,且在仪器和DUT均未连接的情况下,运行FCC Test case时不会出现"Run time error",会出现"RF Tool已经停止运作(由于发生问题,导致程序停止正常运作,请关闭程式)"。
开发电脑:
使用RF RD 4台电脑 (windows 7且已经默认安装RF工作所需要的各种软件),且在仪器和DUT均未连接的情况下,运行FCC test case时,不会出现任何错误。
使用开发者一台windows 7的电脑,没有安装任何RF Tool所需要的软件,安装NI4882_170F0后,运行FCC Test case时,不会出现任何错误。
问题总结
相同的RF Tool版本,在上述不同的环境下,就会有不同的运行结果,就需要一一厘清,这些环境的差异,耗费很多时间。
那为什么Docker为什么可以解决这些问题呢?
本质
Docker容器将一个软件包装在一个完整的文件系统中,该文件系统包含运行所需的一切:代码、运行时、系统工具、系统库,可以安装在服务器上的任何东西。这保证了无论其环境如何,该软件将始终运行相同的软件。默认情况下,容器将应用程序与基础架构相互隔离,同时为应用程序提供了额外的保护。
Docker是以Linux为其原生开发,所以在大部份的Linux系統上都可以安裝。但是Docker是在2013年发行初始版本,这意味着若是要建构Docker开发平台,建议以较新的Linux系统为优先考量。
RF Tool C++环境问题的畅想
最终厘清的结果是:在更换了数个电脑,重装了多次环境后,想到是不是Excel版本的问题。
因为南京办公室为了cost down,让大家默认使用wps,没有让大家随着系统更新office,所以南京同事的电脑上的Excel都是非常旧的excel2007,而公司总部没有这个政策,总部同事的电脑都是很新的excel,例如Excel2017。
就是这个差异造成两边完全不一样的运行结果~
假如上述的C++的程序可以使用container的方式提供给使用者,就不需要做上述痛苦而漫长的厘清工具的"执行环境问题"。
Docker技术建立的container就可以保证无论是在什么环境(包括excel版本),该软件始终在相同环境下运行相同的软件(即使在不同的OS环境下也可以做到这样)。
高效的资源利用
Docker不仅可以保证测试和开发环境一致性,而且它具备高效资源利用的特点,接下来用一个生动的实际工作中的例子来给大家讲解。
搭建不同的开发环境
假如开发者根据客户需求,需要搭建各种开发OS如何用最便宜的方式构建?
如果不同OS的需求都是用真实的电脑来解决:太不靠谱,老板会疯掉,看一下这个实际范例,看看Docker到底可以为我们解决什么问题~
虚拟机解决OS兼容性的实例范例
来自客户的需求是希望在Amazon Web Services (AWS)上用Ubuntu 20.04 开发一套软件APP,而他平常惯用的电脑是Windows系统(或者是Mac OS)。
难不成要去买一台新的电脑,然后安装Ubuntu操作系统来开发项目?又或者有更简单的方法,就是直接在他的Windows系统上安裝虚拟主机(Virtual Machine),有了虚拟化的技术,软件兼容性变得不再是文图。
假若我们又接了新的项目,这次是帮客户修改既有的软件,他看了看操作系统版本,环境是Ubuntu 16.04,虽然还是Ubuntu系统,但在20.04的软件竟然无法在16.04上编译。
开发者花费了大量工夫,才发现原来一些函数库在新版的20.04上已更新并不支援旧版,于是他花了一周末重新编译所需的函数库,花了这么多时间,却还没开始开发项目,所以知道下次遇到这种情形,直接安装虚拟主机Ubuntu 16.04是最快的方法。
事业越做越大后的解决方案只能是Docker
随着事业越做越大,开发者的电脑里有着各式各样不同的虚拟操作系统:Debian、Ubuntu、CentOS......等等几十几套不同版本的开发环境,很显然他必须要去买一个新的硬盘来存放这些虚拟环境。
而且遇到一个困难点,若要同时执行多个虚拟主机显然会降低系统效能,难不成要再买一台新电脑吗?一台电脑最多可以执行十台虚拟主机就已经很勉强了。
如果有人告诉小明,有一个新的虚拟技术,可以在一台主机上同时执行数百个不同的虚拟应用程式,而且彼此完全隔离,不就解决了现有的难题吗?
传统的虚拟主机技术是利用硬件的功能来模拟,而这套轻量的虚拟技术,一般习惯將它称之为容器(Container),则是套透过操作系统(Linux为其原生),建立多个虚拟的实例(instances),有独立的函数库及独立的shell,并彼此隔离。
以下就以容器与虚拟主机作一个对照表:
为什么Docker可以做到这样高效利用资源
用三张图给大家做一个生动的解释,它的设计原理就是胶囊式公寓的概念,即它使用物理机的资源是非常非常有限的!
总结
从我们自己工作中遇到的血淋淋的例子,以及我们在实际工作遇到的多系统环境的开发维护,就能了解:容器化真的是开发的趋势,它对于后续使用者在部署环境时,达到“一键式部署”,不需要厘清环境差异,大大提高工作效率。
对于多系统的开发以及测试,也可以使用容器化的思维,大大降低企业运行的成本:一台电脑可以运行数千个相互隔离的容器,而不是傻傻地买数千个电脑,所以还会问:容器化只是运维人员要顾的技术吗?
作者:Atstudy网校
原文链接:https://www.toutiao.com/article/7054466416631677454/?log_from=abf82da858517_1646895188080