很多朋友刚接触docker,不知道docker做什么, 这里白眉大叔给大家普及一下 docker的知识以及docker和虚拟机的区别。
你可以这样认为,docker 就是 打包应用程序的工具。 怎么理解这个工具呢?
我们都用过Window 系统安装程序,我们一眼看到 exe结尾的文件,就知道它是一个应用程序,双击后就可以安装在系统里,对吧。
在计算机编程技术中,我们有不同的编程语言,有的朋友使用java,或者C++,或者 javascript, nodejs, OC,Python,等等, 然后每个编程语言写完程序后要想要运行起来,就要打成一个包, 我们可以理解为 软件包。
这样就构成了五花八门了, 有的是给了一个 jar包,有的是一个war包,有的是一个文件夹,有的是给你源程序,让你自己去编译。
所以,这个应用构建部分,不同的语言,构建的方式不同, 导致各种包,也挺麻烦的, 那么有没有一种方式,类似win 的exe,不管你写的什么,只要双击就能运行。
答案是肯定的。
我们会使用docker build 把我们的软件或者应用程序 打成一个标准格式的包, 这个包我们称它为镜像。
这样就解决了统一标准的问题。
其实不能叫商店,应该成为 应用分享, 我们知道在手机上下载程序都要去 应用市场下载对吧, 如果是放到以前,我们可能要去各种应用程序的官方网站去下载, 有了 docker后,我们的应用构建称统一标准后的镜像,就可以放到一个 商店里,类似 安卓的apk 应用商店,都是apk文件。 我们可以把自己所有打包好的镜像放到一个地方,比如 docker 官方提供的公共仓库,docker hub.
因为某种原因,这个网站对国内目前访问不了,具体怎么访问呢,你知道就行了。
我们都打成了一个统一标准的格式-----镜像,
我们直接 docker run 就可以起来了。
如果放到以前,我们需要 java -jar , python ..py 等等每一个都不一样。有了docker后,直接 docker run 就OK了。
所以docker 的出现 ,开启了一个时代。
这句话毫不夸张的。
市场上也有容器运维工程师,这些都很普遍了。
白眉大叔是这样理解的:
区别于容器化,我们以前有一个技术 叫虚拟化技术。 举个例子:
我现在有一个机器,这个机器配置很高,比如128G内存,32核,这台机器里边要跑很多应用。 以前如果我们把所有应用都放下一个机器里边,可能某一个应用(比如 一个内存泄漏)把128G 内存全部用完了,其他应用就挤不下了, 为了安全起见,我们要把每个应用进行隔离,
那么怎么隔离?
我们首选想到的事,开虚拟机, 一个应用程序占一个虚拟机, 每个虚拟机给它配置8g 内存,这样就算某个应用程序内存泄漏,影响的只是当前的虚拟机,其他虚拟机不影响的。 这样的隔离不是容器化,而是虚拟化。
这种隔离是通过装虚拟机的方式来解决, 但是虚拟机有很多缺点,
(1) 比如 每个虚拟机的镜像,都很大,一般都是上G 起步的。比如,我们在Window上 用VM 装一个centos 系统,每个镜像都比较大,创建使用也比较复杂,有的商用的企业版软件,创建虚拟机很快,速度快,但是过程也比较复杂的。 这是缺点, 优点呢就是 隔离性强。
在虚拟机里跑程序 不会把别人的程序跑炸。
(2)虚拟机的缺点还有一个,就是启动慢, 我们启动虚拟机有的可能要好几分钟。
(3)在虚拟机中我们分享应用也不方便:
比如,我们现在换了环境,之前是 centos 系统,现在换成了 Ubuntu,或者windows, 假如这是个java程序。
我们是不是需要配置JAVA_HOME 等等一大堆东西,把整套环境这个虚拟机镜像全部迁移过去,光把这个镜像抽取过来,可能又得一大会。所以虚拟化技术稍微有点重量级。
那接下来怎么办呢?有没有轻量级的呢?
docker 公司呢推出了一种技术:容器化技术。
当然这个容器化就是linux 做的, 只不是docker 做了一个简单的封装。
容器化就非常简单, 它摒弃了虚拟机的笨重设计, 怎么理解呢?
我们举一个简答的例子,比如封装操作系统。
在虚拟化技术中每一个虚拟机其实都是一个完整的操作系统,但是docker 封装镜像的时候 只封装了应用程序必备的一些东西,类似操作系统的本身自带的,它都没有封装进去,就搞了一个差异化的的环境。我比你操作系统多了什么,我就增加什么,你操作系统有的我就不增加了。它封装的镜像是M级的,有的 linux镜像只有5M。
为什么只有5M 呢,因为其他的都已经在跑镜像的机器上有了,我不要再重复造轮子了。
所以docker 容器化后 镜像只有M级别,非常小。
还有就是它的创建也非常简单,直接一条命令
docker build 就完成了
它的隔离性也是非常好的。 以前我们是跑在虚拟机上, 现在我们是跑在容器上, 容器就像小盒子,而这个小盒子就是这个软件完整的运行环境。我们的应用程序就跑在这个小盒子里边,哪怕它炸了,也不影响其他的镜像。
所以这个类似沙箱。
这样呢我们的整个应用程序运行起来也是非常的安全,隔离性也强,而且启动速度是秒级的(容器的启动可要比虚拟机的启动要快太多了)。另外docker 镜像的移植分享也很方便,直接从 仓库中拉下镜像来就能跑。
还有一个非常好的优点:就是资源的隔离性,这里呢资源隔离不只是 CPU,内存,等还有磁盘,访问设备,网络,等等,都可以进行隔离。
用户与用户组之间的隔离也可以的, 比如,root用户容器里的跟宿主机上的root用户是不一样的。 这样我们不用担心权限的问题, 比如黑客入侵了容器,顶多就是在沙箱里边。 不会跑到我们外部的宿主机上的。 所以docker的整个隔离性非常的高, 这给我们应用上云带来很高的安全性。
好,了解了以上的docker 概念 ,接下来我们就进入docker的实战环节,这样即使对docker小白的朋友,也能顺着这个逻辑快速的先跟白眉大叔玩起来。