Skip to content

Latest commit

 

History

History
25 lines (13 loc) · 2.78 KB

docker-thinking.md

File metadata and controls

25 lines (13 loc) · 2.78 KB

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

前言


好吧,我承认我标题党了。但是这篇内容如果能让你从一个新的角度理解Docker的本质是什么,也就达到我的目的了。

Docker其实是static link 的一种回归。

我们在学C的时候,就有静态链接,动态链接,本质上是程序代码库的复用而已。那个时候我们认为动态链接库是最优的。为什么呢?因为一开始磁盘很贵,内存很贵,网络也很贵!是的,我们节省了硬件相关的东西,但是我们也为处理系统的各种链接库版本而付出了惨重的代价,浪费了程序员多少光年。Hey,身为程序员的你,是不是多次为编译依赖的链接库而苦恼不已。而随着程序规模的不断庞大,各种依赖冲突也是不断。

现在,是时候让静态链接发挥作用的时候了。你看Docker容器动则几百M。如果是以前,你分发一个程序要几百M,你自己都吐血了,但是现在,大家已经毫不犹豫的感觉什么都没有发生的一样,接受了动则几百M的镜像了。

总结下:所谓容器,其实就是静态链接库的一种非侵入式实现,通过加壳的方式为应用完成静态打包。

Docker只是一个进程模型而已,哦,还是跨平台的。

假设你用Docker运行MySQL。当你使用ps命令,你只能看到MySQL进程,而看不到包裹他的壳(容器)的影子。是的这里的主体依然是MySQL,而不是壳,我们有时候会因为这个漂亮的壳而出现买椟还珠的有趣事情。

事实上,容器只是一种跨平台进程模型,Docker是其实现。如此而已。这句话的含义是:

不要再纠结Docker容器应该是无状态的还是有状态的。把它当做一个普通的进程看待就好。那么一个普通的进程里面是不应该放很多东西的,所以,你原先是怎么处理的就怎么处理。比如,我部署tomcat服务,以前是要先在服务器上部署调试好tomcat,然后分发war包运行。现在是我把war包放到一个目录,然后运行tomcat docker容器并且加载它就好(我们最漂亮-v参数)。对的,我们只是运行一个进程,并且指定了他的数据目录或者程序目录,就是这样。

MySQL也是,你为什么要纠结能不能把MySQL的存储也放到容器里呢?Docker容器+MySQL 就是MySQL啊,只是给MySQL包了个跨平台的壳,但它依然只是个普通的进程呀。我们的思想会被羁绊,这也是Docker公司的误导导致的,他为什么要在进程里面虚拟出一个文件系统的,而且各种各种的实现,让有选择障碍性的人纠结的要死。所以,把数据剥离出来,和以前一样的方式,Docker容器只是一个壳,我们真正的主题还是被包裹的应用。