在这篇文章中,我将介绍一下为何须要虚拟化的环境。mysql
而后我将介绍耳熟能详的虚拟化技术:虚拟机,并大体的介绍一下虚拟机的原理,但愿可以让你知道虚拟机的优劣。redis
在以后,针对虚拟机存在的问题,引出Docker是怎么提升性能的。sql
最后,我将简单的介绍一下Docker中比较重要的三个概念,镜像、容器、和仓库。docker
在学习Docker以前,咱们须要知道Docker能够干什么,有哪些优势。网络
直接看看官方文档的介绍:架构
Developing apps today requires so much more than writing code. Multiple languages, frameworks, architectures, and discontinuous interfaces between tools for each lifecycle stage creates enormous complexity. Docker simplifies and accelerates your workflow, while giving developers the freedom to innovate with their choice of tools, application stacks, and deployment environments for each project.并发
如今写个项目,装个环境均可能须要很长的一段时间。若是你须要在新的机器上部署项目,尤为是当你须要在不少台机器上部署项目的时候,会显得更加的麻烦。app
不只如此,在装好了环境以后,也有可能由于你和同事之间的某些依赖版本不一致,致使可能会发生”刚刚在我电脑上还能用“的问题。dom
而使用Docker的话,就不须要担忧环境方面的问题了,使用Docker能够构建一个一致的环境,而且能够”一次构建,屡次使用“。也就是说,在你配置好一次环境以后,你能够将你构建的这个环境用在各类不一样的地方。工具
Docker是一个虚拟环境容器,能够将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。在这里你可能会以为”容器“这个词比较难理解,那么你能够暂时的理解为这是一个虚拟机。
为了实现咱们上面说的”一次构建,屡次使用“,咱们只须要把那些环境都安装在这个虚拟机里面,而后把这个虚拟机拷贝不少份,就能在不一样的地方使用了。
可是上面那么说实际上是不太严谨的,或者说是不对的。
可是我认为在学习一个新的东西以前,若是可以跟一个旧的事物做对比,实际上是对咱们的学习特别有帮助的。
思考一下Docker与虚拟机有哪些异同。
相同点:
不一样点:
那么在这里,我想先简单的介绍一下虚拟的的实现方式,可是由于我对这方面没有深刻的研究,因此若是有哪些地方说的不对,请不吝指教!
其实虚拟机分为两类,一种是构建于操做系统之上的应用软件,好比VM Workstations,又或者是各类安卓模拟器等;另外一种是直接的虚拟机管理系统。
咱们主要说说应用软件类型的虚拟机,在早期,这类虚拟机是彻底用模拟电路的形式来实现的。由于咱们知道计算机硬件的组成,归根结底就是各类门电路,因此在早期虚拟机就经过模拟数字电路,来模拟出一套计算机所需的硬件。而后在这个硬件之上,安装所须要的操做系统。
这样的实现方式很容易理解,可是咱们一样也可以推测,这样的实现方式效率很低。
因此在这以后,出现了一种新的虚拟机实现方式,若是虚拟机运行的操做系统,他须要的硬件架构跟宿主机(原来的机器)是同样的,那么也就不须要去模拟这个电路了,能够直接”借用“宿主机的电路来输入输出。这样作的话,虚拟机的效率就变高了。
此外,若是虚拟机须要运行的目标操做系统,所须要的指令集跟宿主机是不一致的,好比宿主机上安装了一个Windows,这是x86架构的,而若是我想要运行Android,这是Arm架构的,那么就没办法借用宿主机上的硬件进行输入输出了,因此就须要一个模拟器,也就是咱们说的”安卓模拟器“。
介绍完这些,你大概知道了虚拟机的实现方式了,可是就算是同种架构,同样的指令集,能够借用宿主机的硬件,这样虚拟化出来的操做系统仍是会显得比较慢。你想,安装一个Windows,就要十几G的硬盘空间了,就算什么都不干,也要占用两三G的内存,这些资源加起来,一台机器,最多模拟几台虚拟机。为了实现环境的隔离,在资源占用上消耗了这么多,实在是不值得。
因此,就有了Docker。
Docker解决了为了分割环境须要很大资源代价的这个问题。
你想,咱们最开始的需求只是但愿能有个独立的环境,在这个环境里面有独立的文件系统、网络系统、进程系统等等。因此其实咱们不须要耗费这么大的功夫去模拟一个操做系统出来,咱们只须要想办法限制每一个进程可以访问的资源,分配好这些资源,让进程”觉得“本身运行在一个独立的操做系统中,就能够了。咱们全部的进程都是基于当前的操做系统,不管是启动,仍是运行,速度都会很快。而且,也没有额外运行一个或多个操做系统的资源损耗。
因此,为了区别于硬件层面的虚拟机,就有了操做系统层虚拟化这种技术,也称为:容器。
而后我想再介绍一下Docker中很重要的两个概念:镜像和容器。
镜像就是模板,你能够理解为咱们把环境配置好后,保存起来做为构建容器的模板,有点像面相对象中”类“的概念。
容器是Docker运行的实体,你能够理解为一个个”虚拟的操做系统“,这个容器是根据镜像构建出来的,好比你构建了一个包含了jdk,mysql,redis的镜像,那么只要根据这个镜像,你能够建立出不少个如出一辙的容器。这里有点像面相对象中”对象“的概念。
而后我还想介绍一下仓库这个概念,你能够理解为,仓库里面存储了不少的镜像。为何须要这么作呢,我认为一个是为了方便,另外一个是为了复用。方便,是由于咱们以前提到了”一次构建,屡次使用“这个概念。咱们只须要把配置好的环境打包成一个镜像,那么只须要把这个镜像拷贝出来,就能够在任何地方进行构建了。那么仓库就是像GitHub同样,咱们能够把打包好的镜像push上去,在须要的机器上再pull下来,减小了运输成本。
另一点,复用,是由于在不少时候,你们都是须要构建同样的环境了,好比某个版本的Redis,某个版本的MySQL,某个版本的JDK等等,那么有了仓库的话,咱们就不须要再构建一次了,只须要使用别人构建过的就能够了。
若是咱们把容器理解为运行在当前操做系统中的进程的话,只不过这个进程可以访问的资源是有限的,会让这个进程误觉得”本身运行在了独立的操做系统中“,那么咱们就可以理解这句话了:
Docker容器没有本身的Kernel,他使用的Kernel版本,跟镜像无关,宿主机有关。
这个问题其实蛮有趣的,原文在这里。
可是当初我还有个问题,咱们在Docker的仓库中,有看到CentOS的镜像,也有看到Ubuntu的镜像。可是咱们上面又说,容器用的是宿主机上的Kernel版本,而不是镜像的。那若是我在CentOS上运行了一个Ubuntu的镜像,该怎么解释呢?
缘由是这样的,咱们说的内核(Kernel),指的是Linux的核心,好比他的内存管理,文件管理等等,可是说的Ubuntu、CentOS这些,指的是Linux的发行版,这些发行版,都是基于Linux制做的,只不过在不一样的发行版中,添加了不一样的工具。好比在CentOS中,用的是yum包管理工具,在Ubuntu中,用的是apt包管理工具。
因此,他们的内核,其实仍是Linux的内核。
嗨,很久不见。
谢谢你能看到这里!
这篇文章主要是起到一个入门的做用,但愿可以让你对Docker有一个初步的认识。
固然了,由于做者学识有限,在这篇文章中不少地方的讲解都是不到位的,若是有哪里讲得不到位,讲得不对,但愿你能不吝指教,谢谢你!
在后面的文章中,我会给你介绍一下namespace这个概念,让你大概的知道容器究竟是怎么实现的。
可是关于Docker的那些操做,不必定会写一篇文章。由于我以为这方面优秀的文章已经不少了,官方文档也很详细。
《Docker入门》系列的文章目前的规划是大概会有两到三篇,定位是偏向于了解Docker及一点点的原理,实用性应该不会特别强。
再次感谢你能看到这里!
PS:若是有其余的问题,也能够在公众号找到我,欢迎来找我玩~