可能很多人听说过docker,也可能有很多人用过,但是其中的一些细节,可能不是很清楚,还有一些人,像我一样,并不知道docker,也没有用过,刚好最近一个大神朋友比较有空,让他写了一篇普及文章,希望能解答像我这样小白的疑问。
作者:Xx
小编了解到很多同学听过docker,认为docker是个高大上的东西 ,但是不清楚为何要使用docker,通过本文可以从入门的角度了解为何要使用docker。
我们先看一个简单的从硬件到软件的层次示意图,最底层是硬件,最上层是应用软件,OS负责硬件管理并衔接软硬件。
有部分同学还玩过虚拟机,其软件示意图如下,在host os上将硬件虚拟化提供给多个guest os使用,举个通俗的例子,我是个苦逼码农,口袋不太鼓,只有一台PC,想要学习下linux,但是PC现在是win10系统,那我们在win10系统下用vmware安装个linux的虚拟机,或者安装几个虚拟机都可以(只要电脑CPU、内存、硬盘配置能抗住),每个linux虚拟机有个root用户,从全局看,就是多个root用户在使用同一台电脑,但是对于1个root用户而言,他拥有整个电脑,所以虚拟机是将电脑的硬件资源虚拟化,实现多用户对同一硬件资源的共享,提升硬件利用率。在此例中win10就是host os,linux是guest os,VMware负责提供硬件虚拟化能力。
基于上述的知识,引申出docker,顾名思义,docker就是个容器,这个容器里盛放的是应用,不是虚拟硬件资源,而是实现软件资源的虚拟化,说白了就是对os软件环境的虚拟化,是为了解决用户多个软件对环境的依赖。(注意这点,虚拟机是对硬件的虚拟化,是解决多个用户对硬件资源的依赖)
举个例子:还是延续上面的例子,有多个linux虚拟机,假设我要在linux上安装软件A和B,A和B都依赖一个名为C的库,但是A软件比较挫,依赖1.0版本的C软件,但是B软件很新,必须依赖10.0版本的C软件,当然我们可以在liunx虚拟机中同时安装1.0版本和10.0版本的C软件,但是会引发很多的软件冲突,甚至如果C软件根本就没考虑高低版本之间的共存,同时安装两个版本的C,甚至都无法运行,这时候怎么办?将A和B软件的运行环境隔离,有两种方式,第一种就是A和B分别安装在不同的虚拟机中,这种方式不是本文重点;第二种就是在同一个虚拟机中采用2个docker容器,把A、B软件的运行环境分离。在容器1中安装A软件和1.0版本的C软件,在容器2中安装B软件和10.0版本的C软件。容器1和容器2最终都都通过docker软件调用linux的os接口。软件层次如下图所示,这个图比较复杂,虚拟机VM个数可以为n个,n是由用户个数决定的,但如果只有1个用户可以只用1个vm。
实际如果只有一个用户,那么也可以不需要虚拟机vm,直接在host os上安装docker,构造多个容器来隔离应用A和应用B的运行环境,如下图所示
从这两个图看来,docker就是个提供软件环境虚拟化的软件,并没有限制是在host os还是guest中使用,至于你为何要使用docker,那就是隔离软件应用。
最后,使用docker还能够很方便的发布image等等,但这些都是在使用docker以后的副作用(好的副作用),归根结底是要明白,为什么要使用docker。