两年之后,再来思考Docker的价值(2)

在维基百科中有关于“链接器”的简明的解释。举个例子,比如你使用C语言写了个程序,调用了“printf”这个函数,代码通过编译器、链接器处理过后会得到一个目标文件,中间会有这么一段“从这里开始调用printf函数”;所以printf不是我程序的一部分——它是一个叫做C语言标准库的一部分(注:glibc,C语言运行时,分为静态链接与动态链接两个版本。)。链接器会分析glibc的静态库文件,收集我的程序中所需要重定位的符号信息,包括printf这个符号;然后将printf的代码从glibc中抽取出来,链接到我的程序中,组成一个完整的可以运行的可执行文件;这样我就能通过printf函数向终端输出字符信息了。

但是真实环境更加复杂,还有个叫做动态链接的概念。很多时候,除开我使用Go语言,我不希望我的可执行文件过大;我会更加希望我编译出来的文件模块分明,不同的模块包含在不同的文件中,我的入口程序在运行时来决定加载哪个模块并运行——这就是动态链接。动态链接做的很多事情跟静态链接类似,只是将链接的过程延迟到运行时完成罢了。

  但是从概念上讲,什么是链接器呢?

当程序员谈起『链接器』时,他们第一反应是C/C++语言编译出来的目标文件。但是,我们回过头想想,忽略一些细节,链接器到底干了些什么呢?链接器的工作是:能够自动完成一些将分散的代码组合起来的复杂工作的程序。从学术上来说,Unix的『ID』,Windows中的『link』都是链接器;而广义上来讲,任何能够自动将代码片段链接在一起运行的程序都是链接器,比如以胶水工厂著称的SWIG。

  二进制元(META-BINARIES)

想象一下没有链接器的情况,任何时候你生成一个程序后——或者运行一个需要众多动态库支持的程序——你都必须手工打开hex编辑器,从二进制代码的层面手工进行符号收集与重定位工作。但是,广义上来讲,你不用去想象,你已经在做这部分工作了,只是层面不同,比如,你需要配置一个LAMP系统的时候,你需要编辑很多配置文件使各个系统能够配合运行通畅,再比如,你需要增加Redis或 Memcached组件时,你必须要更改配置文件一样;你在进行手工链接,链接不同的程序。

再深入一点去思考的话,程序的链接跟应用程序级别的配置没什么两样,只是前者是链接低层代码段,后者是将不同的模块、系统拼接起来运行。但是,市场上并没有专注做“应用程序栈”链接的“链接器”,你必须要手动配置他们的运行参数来实现它们之间的协同工作,如:设置TCP监听端口,设置访问权限规则等等。这其实是高层次的链接过程,应用程序之间靠协议通行或者ABIs的调用。

  Docker不是链接器

所以Docker是链接器了?答案是:不是!

Docker实际上是提供了一个环境,你可以在这个环境中将你要的”应用程序栈“配置好,然后保存你的设置,形成镜像;然后你就能复制这些镜像,多处运行,而不需要再次进行配置。

Docker还包含了很多配置工具,你可以配置容器运行时的网络,运行时访问安全,配置VXLAN overlays来实现同一个数据中心或者局域网中不同容器间的互访。但是这些都是附加属性,Docker的核心是可以让你保存你的手动链接结果。撇去这个功能,Docker只是部署、运行服务器端应用程序的另一种方式而已。(注:Docker的基于进程的虚拟机模型也是一个亮点。)

  应用程序栈的链接器?

是不是没有基于“应用程序栈的链接器”呢?也不尽然,也有些人在尝试,但是都遇到了困难,导致都不知道要做成什么了。比如,Chef、Puppet与Saltstack这些产品,他们都提供了很多附属工具,但是核心功能是用脚本化的链接方式把小的程序模块组合成大的应用程序执行栈来运行。

但是,使用过这些工具的人都觉得它们复杂与笨重;我觉得主要是因为开发它们的程序员错误将它们定位在企业级服务器管理工具上了。他们应该开发更加通用的系统会更加实用。

  如果我们能达到这些,我们还会需要Docker吗?

可能吧,因为Docker很有用。但是,如果我们拥有一个“应用程序栈”级别的“ld.so”(Linux下的动态链接器)就不好说了;因为,相比我们把应用程序栈打包生成一个Docker镜像,我们只需要一个动态链接器就能把不同的应用程序链接在一起工作了。

(责任编辑:安博涛)

分享到:

更多
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
  • 微笑/wx
  • 撇嘴/pz
  • 抓狂/zk
  • 流汗/lh
  • 大兵/db
  • 奋斗/fd
  • 疑问/yw
  • 晕/y
  • 偷笑/wx
  • 可爱/ka
  • 傲慢/am
  • 惊恐/jk
用户名: 验证码:点击我更换图片
资料下载专区
图文资讯

2016年软件即服务发展的五大主题

2016年软件即服务发展的五大主题

对于2016年软件即服务(SaaS)我并没有什么伟大的预言,也没有深邃的远见或是史诗般的猜...[详细]

从生产安全体系视角看数据安全

从生产安全体系视角看数据安全

互联网的发展一日千里,安全技术随着互联网的发展,出现的新场景、新技术、新名称都越...[详细]

RSA 2019大会最值得关注的10个网络安全趋势

RSA 2019大会最值得关注的10个网络安全趋势

RSA2019大会本周开幕,来自八家知名网络安全厂商的高官们谈到了他们期待在今年大会上...[详细]

Gartner:政府部门2019年将重点投资「数据

Gartner:政府部门2019年将重点投资「数据分析与网络安全」的技术

数字化转型时一场长期竞赛,2018年数字化转移面临的主要挑战是缺少用于支持数字化转型...[详细]

区块链正在应用于正在兴起的网络安全运动

区块链正在应用于正在兴起的网络安全运动

尽管有关加密货币和交易所的黑客和欺骗的新闻铺天盖地,但事实仍然是,真正的区块链在...[详细]

返回首页 返回顶部