上一篇我们简单了解了Docker是什么。我们讨论Docker,首先要想它为什么会出现,在Docker来看,它最本质的需求是什么?

向服务器部署代码非常困难。为什么部署会是挑战?其本质在于复杂多变的技术栈。比如我们下面列举的各类技术。有这么多复杂的技术栈,部署就一定会遇到挑战。

 

 

一个有趣的现象是,我们深切感觉到,程序员要学的技术越来越多了,尤其是在创业公司的程序员,更需要让自己变成一个多面手。如果一个程序员掌握的技术比较单一,那他很有可能在日后被淘汰。虽然我们并不认为专才没有用,但现在已经不是一个只靠一门语言或者技术就可以在科技圈生存下来的时代了,而是需要程序员具有快速学习并且掌握多种现在工业界常用的语言和技术框架,这样的人才更被倚重。

 

因此,很多程序员成为组合大师,就是用多种技术的变化,把它们组合起来,成为所需要的东西。这样做的好处是什么呢?好处是只需要关注最核心的代码。但组合会带来什么问题呢?

 

为什么复杂的技术栈对部署来说是挑战?

 

根本原因是不同的技术之间的版本冲突和依赖。

 我们举最简单的例子—Python。用Python之后就会选择,是Python2还是Python3。开始发现有一些比较新的技术库会支持Python3,但还有一些比较传统的代码集,它们就不能支持Python3,只支持Python2。这就使我们开发不同的程序,或者是相同的程序用不同的库,会产生不同的问题。因此总结来看,我们向服务器部署代码非常困难

 

那这种问题怎么解决呢?最好的方法,是从生活中寻找答案因此,要解决Docker这个问题,或者说解决部署的问题,我们就反过来看,在日常的生产与生活中,与部署代码这种计算机问题,最接近的例子是什么?答案是:货运。

 

仔细想想货运是什么?是通过各种方法,比如汽车、火车、游轮、飞机等将各种货物如石油、钢琴、尿布、啤酒,运送到你的目的地。因此计算机转接交付也是这样,可以用各种各样的方法,将你整个task、stack运送到目的地。大家不要总执着于创造需求,而是寻根找到一个现实中的需求,把它用更好的方式给满足,就能够出现新的转机。

 

再往后看,我们如何来运送货物呢?运输在现实中是怎么解决的?答案是:集装箱。实际上运输业在使用集装箱后有一个很好的发展,因为集装箱有统一的标准。想要运东西的人们,只要遵循集装箱的标准,就能够从货运的细节中解放出来,货运会更加方便。

 

 

那么我们能从集装箱里学到什么呢?

 

就是Docker。再举个例子,当我们部署一个jar文件的时候,很多人用java。我们需要什么呢?不仅有jar文件,实际背后还有很多隐藏的需求,比如服务器需要有一个java版本的解释器,就是jvm,而且往往还需要一些相应的配置环境才能运行起来。这些东西在传统的方法下是怎么解决的呢?其实在Docker出现前有很多别的方法,比如虚拟机。

 

既然有虚拟机,那为什么还会出现Docker呢?

 

为什么不用虚拟机呢?答案是虚拟机太沉重。虚拟机把东西打包太多了,动辄上G,运行代价特别大,单机往往只能勉强撑十几个,就已经很不错。比如要搬家,是想把所有的东西全部都以一种极大的时间成本搬过去,还是想以一种相对小的时间成本只拿上重要物品?这是两种不同的搬家模式,相比而言后面一种方法肯定是简单的。

 

Docker的优点

 

相对于传统方式,它能够同时交付并且部署程序所运行的环境。

相对于虚拟机,它给出了基本的程序代码去交付,也仅仅只打包必需的内容,从而减轻了负担。

 

 

Docker的命令

 

第一个是docker images,列出你本地系统中所有存在的docker镜像,看看哪些可以运行。找到一个能运行的之后,想运行版本号为12.10的ubuntu,并在运行以后,执行里面的/bin/bash的进程,就能和它交互。当然,运行起来后可以看当前有哪些运行中的images或者containers。我们也可以在里面做很多事情,比如运行完以后,在里面删文件、加文件、或者安装几个包,想看看运行之后发生了什么变化,就可以用docker diff来看一些东西。如果本地产生了一些新的image,就可以通过commit的方式将当前运行的所有修改提交为一个新的image。之后可以把这个image推送到远端的云服务里,从而能很好地和大家共享,最终也可以通过pull的方法从远端下载。

 

看似复杂,实际上仔细想想跟Git是一样的,就是把image当成一个代码。你可以看本地有什么代码,可以执行本地的代码或修改它,也能够看这个代码跟别的代码有什么区别,同时把代码本地commit一下,也能够push到远方、pull到本地。大家可以拿Git的方式来思考这个问题。

 

Docker运行时内部删除的文件,如何恢复?

 

比如运行Docker以后,不小心把里面的bin文件目录给全部删掉了,这很危险吗?其实根本不用管。只要重启一下就可以了,为什么呢?因为Docker的本质其实是盗梦空间。什么是梦?什么是现实?我们在Docker是一直生活在梦境的现实中。因此只要先醒到上一层空间,然后再睡回去,就又可以重建这个空间。

 

 

最后总结一下:

  • Docker的本质就是盗梦空间。
  • 从生活寻找技术问题的答案。

 

参考资料:《Introduction to Docker》