以前很早就对Docker有所耳闻,可是碍于时间(就是懒得学)的关系,就一直没有开始行动,直到最近这个学期课比较少,实在不知道该干啥了,算了,学习吧。因此就开始了我漫长Docker学习之旅。固然,写这篇笔记的时候,我对Docker已经大概有了一个初步的了解,因此就有了这个面向初学者的Docker学习笔记系列,为何是初学者呢,由于我自认为我对Docker的了解依然处在一个比较初级的阶段,更高级的内容怕说不明白,以致于误导了别人,写这系列的笔记主要初衷有两个,一来是为了对本身这个阶段所学的知识作一个全面的梳理和总结,二来顺便将这些知识用我风骚的写法作成笔记,帮助后面学习Docker的小伙伴更加通俗易懂的去理解Docker相关的知识和概念,本篇文章做为基础篇第一篇,将围绕下面这三个问题来展开:mysql
Docker是基于Go语言实现的在2013年发布的云开源项目,它利用了围绕容器这个现有的计算概念,特别是在Linux世界中,这些原始概念被称为cgroups和命名空间。Docker的技术之因此独特是由于它专一于开发人员和系统操做员的需求,以将应用程序依赖项与基础架构分开。linux
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是经过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(能够是一个WEB应用或数据库应用等等)及其运行环境可以作到“一次封装,处处运行”。git
一句话归纳,Docker的出现解决了运行环境和配置环境不一致的状况,从而更方便的作持续集成并有助于应用的总体发布。程序员
要了解这个问题,咱们就须要了解在Docker以前的传统的虚拟机技术是怎样的,我相信你们都有使用过虚拟机软件在本身电脑上虚拟出另一个操做系统的经历,好比在win上经过vm安装一个linux系统,传统的虚拟机实际上是一种带环境安装的解决方案,也就是说,我模拟的是一套完整的操做系统环境,这个系统依然是有它独立的内核,驱动等等。github
如图所示:sql
对于虚拟机中运行的程序而言,因为虚拟机模拟了一整套系统的环境,那么在虚拟机中运行的应用程序是感知不到本身是在虚拟机中运行的,就像和在真实的操做系统中运行同样。docker
固然,看到这,不少人可能会以为,这不是挺好的吗,的确,在需求不是很大,好比只须要额外开两三台虚拟机的状况下,这种作法并无什么明显的短板,可是,因为咱们模拟的是一整套操做系统的环境,这就致使了什么问题呢,咱们每开一个虚拟机都会额外占用很大一部分资源,尽管你可能两台虚拟机中的linux系统内核是如出一辙的,这就形成了对资源的一个很大的浪费,同时呢,因为咱们启动虚拟机的时候启动的是一整套操做系统,这就会致使启动变得很是的慢,可能须要几分钟,固然,几分钟并非很长,但是若是有不少台虚拟机呢?可能当运维工程师好不容易把全部虚拟机启动完成了,发现秒杀活动已经结束了,如此长的启动时间对于不少大规模的应用来讲是不能忍的,第三点,就是步骤很是繁琐,咱们如今总结一下传统虚拟机最主要的三个缺点:数据库
固然,时代再进步,linux也不能看着这些问题听任无论啊,因而linux发展出了另一项虚拟化技术,即linux容器技术。服务器
linux容器技术是怎么一回事呢,这点和咱们在实际开发中抽取公共逻辑的思路是相似的,以前不是开不少虚拟机内核什么的都同样形成资源浪费吗,那我这下把内核单独抽离出来,你们公用,因此linux容器实际上运行的并非一个完整的操做系统,而是经过进程对不一样的容器进行了隔离,容器与虚拟机不一样,不须要捆绑一整套操做系统,只须要软件工做所需的库资源和设置。系统所以而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。架构
如同所示:
因为启动的时候,启动的并非整套操做系统环境,仅仅是启动应用所需的环境就好了,启动速度天然就比传统的虚拟机快了不少,甚至说能够作到秒启动,同时又解决了资源浪费的问题,而Docker正是基于linux容器技术而衍生出来的开源项目,使其对于广大开发者来讲更容易上手,下降了使用的门槛。
这个就要从好久好久之前提及了。
故事发生在9012年全球最伟大的互联网公司阿里奶奶次世代产品免费版某宝的上线前夕,程序员阿呆把本身多日以来呕心沥血呼呼大睡上班摸鱼下班蹦迪写的程序代码交付给了运维二呆,本觉得本身将代码给了二呆就能够满面春光如释重负迈着六亲不认的步伐深夜买醉瘫倒在灯红酒绿纸醉金迷的酒吧,可是正当阿呆准备开始这崭新的生活的时候,二呆拦住了他:
阿呆,你这代码有问题吧,我怎么跑不起来?
阿呆:WTF ?我没听错吧,你居然说个人代码有问题,呵呵,某人运维技术不行,还好意思说我菜?
二呆:我运维技术不行,我运维技术不行,你行你上啊,开玩笑,你代码写的没问题我能跑不起来?
阿呆:你睁大你的24k钛合金x眼看看,我电脑上是否是跑的好好的,是你运维技术不行,ok?
二呆:我&%¥%&,你代码没问题是吧,你代码没问题是吧,你来啊,有本事你跑起来,你要能跑起来我直播女装,臭弟弟。
阿呆:我今天就让你看看,我是怎么把它完美的部署上去的,你给我好好看着,知道吗?!
此时,阿呆的女友打来电话:阿呆,不是说好了一块儿去醉生梦死的吗?
阿呆:滚,如今没空搭理你。
注:以上皆为节目效果,你们请勿当真。
传统的开发中老是会很容易出现这类开发环境和生产环境不一致的问题,而Docker的出现毫无疑问极大地简化了运维工程师的工做量,也大大下降了开发和运维之间撕逼的几率。你们这么来理解:
咱们以搬家为例,传统的流程就能够看做是把全部家具一件一件地搬到新的地方,万一哪一个家具的摆放位置没记清楚,就有可能致使新家运行不起来(??什么鬼),好比mysql版本没说清楚,而Docker就很简单粗暴,Docker采起的方式就是把整套环境打包给你,也就是直接把整个楼都给你搬过去,问题完美解决。
同时呢,Docker是内核级虚拟化,不像传统的虚拟化技术同样须要额外的Hypervisor支持,因此在一台物理机上能够运行不少个容器实例,可大大提高物理服务器的CPU和内存的利用率。
总结起来,docker大概就是如下四个优势:
不得不说,实在是太香了。
本篇笔记简单地讲了一下docker的一个基本状况,相信看到这里的小伙伴已经对docker有了一个基本的认识,至少知道docker是什么了,下一篇笔记呢,将围绕 Docker 三要素 镜像 容器 和仓库这三个概念展开,预知后事如何,点个赞再走吧。
我是韩数,咱们下一篇笔记《Docker三要素:镜像,容器和仓库》再见。
PS:更多笔记欢迎你们去个人github上下载(欢迎star):