为了编写Docker,开发者选择了Google推出的新编程语言——Go语言。在Docker虚拟化技术需要快速响应的前提下,更为传统的选择可能是C语言这样的底层语言。
使用Go语言是一个明智的决定,它使得Docker团队与他们的首选操作系统——Linux的工作变得简单和有效。
更重要的是,Go语言给用户带来了将Docker机制并入自己环境中的捷径。Go语言被特别设计为支持分布式系统上的快速开发,它允许云计算环境上的开发者和系统管理员可以快速地开发程序和系统工具,而无需担心太多关于例如依赖管理、或并发编程的问题。
对于开发者,Go提供了将小段代码打包的功能,在编程的时候可以直接引用这些包,同时,这些包还可以被其他应用所重用。
Go不仅帮助了开发,也简化了部署。因为一个Go程序一旦被编译,一般情况下它便不再需要额外的库。一个大型标准核心库为程序员提供了大多数场景下所需要的功能。
这意味着一个管理员可以开发一个Go程序,并把它拷贝到任何安装了Go语言环境的远程服务器上,而且不用担心程序是否需要一些这台服务器所没有的库。
借助于Docker,这个过程会变得更简单。在Docker Hub上该语言有一个特殊的版本,它可以在编译过程中把任何应用打包为Docker镜像,这样它就可以被立即部署了。开发者可以在容器里面构建他们的应用,他们甚至不需要在本地宿主机上安装Go环境。
利用Docker提供的Go语言API库,使用它跟Docker容器进行交互、管理Docker容器也跟在Docker里面安装和运行Go程序一样简单。
用户的选择
Go语言项目于2009年启动,并且在2012年生产就绪。接着它就被全球开发者所拥护,特别是在中国,Go语言被大量使用(尽管对于是否如数据显示那么大的分歧存在争论)。
事实上有许多大型企业,它们并不是最快的接受者,而令人吃惊的是它们已经接受了Go语言,包括:Chevron、Verizon、Disney、Walmart、Comcast、General Electric,甚至Microsoft、IBM也使用Go来搭建物联网安全库和连接大量Docker容器的网络软件。
许多网络公司也接受了Go语言。不只是Google,Facebook和Amazon也在使用Go。
当然,Google的Google App Engine将Go语言运行时作为它众多服务中的一个,而其它的云服务商,例如Amazon Web Services也在支持Go语言。
据最新统计,Github上有超过86,600个基于Go语言的软件项目,而且这只是开源的公开项目,毫无疑问,许多私有的、专利的软件项目也使用了Go语言进行开发。这不只是关于什么样的公司会使用Go语言——许多开发者回答说他们近期准备使用Go语言。
2015年的StackOverflow开发者调查报告显示,有19%的DevOps开发者说他们将来计划使用Go语言,代表着从当前10%的Go语言用户的增长。整体上,8%的开发者计划在明年使用Go语言。
除了Docker之外,包括Kubernetes容器管理软件和Hashicorp的Nomad集群管理软件等其它的容器支持软件也由Go语言进行开发。
过些年就会很容易看到Go语言成为容器生态系统的核心语言。Docker和Go语言之间有着这样的协调:如果有人看到Docker项目里一个需要修补的bug,或者希望以某种方式提升软件,他们会使用Go语言,并由此加入了全球Go语言程序员的联盟。
新旧孰好
对Go语言的喜爱有一部分来自它将过去的静态类型编程语言的最佳实践和新的常用来搭建web应用的动态类型语言进行了整合。
Go语言是被那些可以称为“超级用户”的老手程序员创造的:Robert Griesemer,他曾在V8 Javascript引擎和Google File System上工作;Rob Pike, 你知道Unix和UTF-8字符编码格式吧;Ken Thompson, 他是Unix和C的共同创造者。在2007年之前,他们都曾在Google工作,并且都被现存语言的限制所烦恼。那时的语言不能很好地适应系统编程,所以他们开始设计Go语言以直接解决这个问题。
传统的静态类型语言,例如Java、C++,提供了对于数据类型更严格的控制,这使得它们更安全、更快。在它们加强了规则的同时,也变得更难使用了。
这样的结果是许多面向web的创业公司在过去的十年里都开始转向例如Ruby或Javascript等的一种新的动态类型语言,它们并没有强数据类型。
与此同时,动态类型语言可以简化程序员的工作,这里减少的工作却增加了测试和调试的代价。如果没有在一开始就加强数据类型,对于尤其是大型程序的调试会变得让人非常头疼。另外由动态语言编写的程序部分要比使用静态语言编写的同一部分更慢,特别是承载大量负载的时候。
Go语言之美在于它结合了动态语言提供的开发便利和静态语言的严格和速度。
所以Go程序比那些由动态语言编写的程序运行更快,而且在云环境里它可以被直接转化为云上运行web应用的公司的月度使用账单。
有一家名为Iron.io的咨询公司学到了上面这些。它给它们的客户搭建了消息系统,之后产品化叫做IronWorker。IronWorker的第一版是用Ruby写的,后来发现它不容易被扩展。于是使用Go语言重写这个程序,最终Iron.io将它们所需的虚拟服务器从30台减少到了2台。
另外,Go适合于分布式计算,它有许多支持并发的内建特征和在多处理器上运行程序的能力。它可以执行许多低级的系统调用,使得有能力来与操作系统进行直接的交互,从而加速了运行时间。
Go同样被设计为程序员友好,所以程序员可以通过简单的一行命令查看文档,或者进行测试。
简言之,Docker不会找到比Go更好的合作伙伴了。
原文作者:Joab Jackson,New Stack主编。
原文链接:How the Go programming language helps docker and the container ecosystem
译者说
Go语言随着Docker等技术的火热也在持续升温,正如文中所说,Docker、Kubernetes社区的活跃和Go语言的社区的活跃密不可分。同时,借助于Docker和Kubernetes的开放API,使用Go语言编写程序管理容器变得轻而易举。除此之外,Go语言还有很多优秀的开源项目,具体可以参见Awesome-go,拥有15,010颗星的该项目下面汇集了众多各个方向的Go语言项目。Go语言作为一门年轻的语言,有它出彩的地方,同时也免不了还有很多瑕疵。译者认为语言之争没有终点,每种语言都如同一门兵器,面对不同的“战役”、面对不同的“敌人”,应该使出不同的“兵器”。编程语言各有所长,我们不应以使用了某种语言而感到优越,正确的姿势是应该通过编程改善了生活、提高了效率、做了有意义的事情而使我们感到骄傲。