【原文编者的话】作者应该是个Geeker,喜欢思考很多本质性的东西,并开创性的将Docker跟链接器来作比较,并提出了很多有意思的观点如:应用程序栈的链接器等。不管对不对,至少他这种思考的方式值得我们学习。
我必须告诉Docker,他们的创意完全满足我对“天才般创新”的标准,Docker让我花了一段时间来弄明白它到底是什么。
伟大的创新绝对不是发明能飞的汽车,而常常是一些很简单但是细细想想背后的原理非常复杂的一类事物。举个例子,比特币就是一个绝好的发明。它很简单,但是背后的故事非常复杂,仔细想想很多人都会发出疑问,它可以流通吗?有股票价值吗?可以用于债券吗?这其实是个分类的问题,可能把所有的这些不同方面的属性结合在一起就是个新的事物。
Docker绝对不是一个像OpenVZ或者BSD jails一样的容器。当我第一次使用Docker的时候,我费了很多时间在找如何在一个运行的容器中配置一个/dev的node;最后我终于理解了 Docker:其实你没有必要这样做,你只需要启动一个/dev的node的容器即可,Docker的容器是进程,而不是一个完整的虚拟机系统。
Docker是一个新的虚拟机:在不运行时表现为“静止”(immutable)包含运行程序的容器(其实就是镜像),然后启动此镜像后在系统中表现为一个进程。
但是,Docker的本质是什么呢?
这个问题我思考了好几天,最后我顿悟了:Docker是个能够将手动链接变得轻松的工具。更具体的说,是个可以手动链接应用程序还能将其保存的工具。(作者的意图是从链接这个低层工具出发来思考Docker的价值,因为低层的链接器就是将不通程序模块组合成一个程序来运行,从哲学层面上将确实跟 Docker做的事情有些类似,但是维度不一样。)
但是后来我又仔细的思考了一下,好像又不是这样的。
链接器是什么
如果你使用过GCC、clang或者Visual Studio,你就在使用编译器来构造可以执行的程序。对于C或C++来说,编译器会将源代码编译成一堆的目标文件;目标文件中包含了源代码对应于目标平台的机器代码(或者是中间代码)。但是,要使程序能够运行,你的代码一定会调用其他模块的代码——函数;所以链接过程就是把你写的程序中所有依赖于其他模块、库中的代码收集起来并链接到你的目标代码中。(注:关于程序是如何执行这个问题,可以参考译者之前的博文:程序是如何运行的)
(责任编辑:安博涛)