很多朋友刚接触docker,不知道docker做什么, 这里白眉大叔给大家普及一下 docker的知识以及docker和虚拟机的区别。
你可以这样认为,docker 就是 打包应用程序的工具。 怎么理解这个工具呢 ?
1-如何理解docker 这个打包工具?
我们都用过Window 系统安装程序,我们一眼看到 exe结尾的文件,就知道它是一个应用程序,双击后就可以安装在系统里,对吧。
在计算机编程技术中,我们有不同的编程语言,有的朋友使用java,或者C++,或者 javascript, nodejs, OC,Python,等等, 然后每个编程语言写完程序后要想要运行起来,就要打成一个包, 我们可以理解为 软件包。
这样就构成了五花八门了, 有的是给了一个 jar包,有的是一个war包,有的是一个文件夹,有的是给你源程序,让你自己去编译。
所以,这个应用构建部分,不同的语言,构建的方式不同, 导致各种包,也挺麻烦的 , 那么有没有一种方式,类似win 的exe,不管你写的什么,只要双击就能运行。
答案是肯定的。
我们会使用docker build 把我们的软件或者应用程序 打成一个标准格式的包, 这个包我们称它为镜像。
这样就解决了统一标准的问题。
2-docker应用商店
其实不能叫商店,应该成为 应用分享, 我们知道在手机上下载程序都要去 应用市场下载对吧, 如果是放到以前,我们可能要去各种应用程序的官方网站去下载, 有了 docker后,我们的应用构建称统一标准后的镜像,就可以放到一个 商店里,类似 安卓的apk 应用商店,都是apk文件。 我们可以把自己所有打包好的镜像放到一个地方,比如 docker 官方提供的公共仓库,docker hub.
因为某种原因,这个网站对国内目前访问不了,具体怎么访问呢,你知道就行了。
我们都打成了一个统一标准的格式-----镜像,
我们直接 docker run 就可以起来了。
如果放到以前,我们需要 java -jar , python ..py 等等每一个都不一样。有了docker后,直接 docker run 就OK了。
所以docker 的出现 ,开启了一个时代 。
这句话毫不夸张的。
市场上也有容器运维工程师,这些都很普遍了。
3-什么是容器化时代呢?
白眉大叔是这样理解的:
区别于容器化,我们以前有一个技术 叫虚拟化技术。 举个例子:
我现在有一个机器,这个机器配置很高,比如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小白的朋友,也能顺着这个逻辑快速的先跟白眉大叔玩起来。