其实连Docker公司都把Docker用错啦

gdgo4514 8年前
   <p> </p>    <p>【编者的话】这是一篇去年发的文章,但是有些见解目前来看,我觉得还是不错的。用户总是希望Docker能把什么工作都做了,提供自己的虚拟文件系统,提供强大的网络空间隔离,提供配套的编排工具。。。然而,这也为自己埋下了无数的坑。</p>    <h2>前言</h2>    <p>好吧,我承认我标题党了。但是这篇内容应该让你从一个新的角度理解Docker的本质是什么。</p>    <h2>Docker其实是static link 的一种回归</h2>    <p>我们在学C的时候,就有静态链接,动态链接,本质上是程序代码库的复用而已。那个时候我们认为动态链接库是最优的。为什么呢?因为一开始磁盘很贵,内存很贵,网络也很贵!是的,我们节省了硬件相关的东西,但是我们也为处理系统的各种链接库版本而付出了惨重的代价,浪费了程序员多少光年。Hey,身为程序员的你,是不是多次为编译依赖的链接库而苦恼不已。而随着程序规模的不断庞大,各种依赖冲突也是不断。</p>    <p>现在,是时候让静态链接发挥作用的时候了。你看Docker容器动则几百M。如果是以前,你分发一个程序要几百M,你自己都吐血了,但是现在,大家已经毫不犹豫的感觉什么都没有发生的一样,接受了动则几百M的镜像了。</p>    <h2>Docker无侵入性的让现存的进程变成具有资源限制的进程</h2>    <p>假设你用Docker运行MySQL。当你使用ps命令,你只能看到MySQL进程,而看不到包裹他的壳(容器)的影子。是的这里的主体依然是MySQL,而不是壳,我们有时候会因为这个漂亮的壳而出现买椟还珠的有趣事情。</p>    <p>既然Docker只是无侵入性的让现存的进程变成具有资源限制的进程,那么进程原来是什么样,就应该是什么样:</p>    <p>对于网络,Host 模式足够啦,高效而不带性能损失。其他的模式让你无谓的各种复杂</p>    <p>对于硬盘,mout 本地磁盘足够了,为什么还有新的文件系统?</p>    <p>为什么有registry 这个东西? Image 不就是个文件么,提供一个标准的文件下载服务器存放image不就行了?</p>    <p>程序和镜像本身也不是耦合的。只是程序运行的时候顺带加上容器这个壳,从而实现资源的隔离。这种模式该是怎么样的呢?</p>    <p>比如,我部署tomcat服务,以前是要现在服务器上部署调试好tomcat,然后分发war包运行。现在是我把war包放到一个目录,然后运行tomcat docker容器并且加载它就好(我们最漂亮-v参数)。对的,我们只是运行一个进程,并且指定了他的数据目录或者程序目录,就是这样。</p>    <p>MySQL也是,你为什么要纠结能不能把MySQL的存储也放到容器里呢?Docker容器+MySQL 就是MySQL啊,只是给MySQL包了个跨平台的壳,但它依然只是个普通的进程呀,所以数据还是应该在宿主机的磁盘上。</p>    <p>我们的思想会被羁绊,这也是Docker公司的误导导致的,他为什么要在进程里面虚拟出一个文件系统的,而且各种各种的实现,让有选择障碍性的人纠结的要死,因为他是一家商业公司,希望把大家绑定在自己的生态上。所以,把数据剥离出来,和以前一样的方式,Docker容器只是一个壳,我们真正的主题还是被包裹的应用。</p>    <p>推销下我开发的一套容器调度工具: <a href="/misc/goto?guid=4959673080229611569" rel="nofollow,noindex">mammuthus-yarn-docker-scheduler</a></p>    <p>via:<a href="/misc/goto?guid=4959673080317863916" rel="nofollow">dockone</a></p>