Docker能火起来,不仅仅与它开源有关系,一定是解决了我们软件从开发到上线的痛点,要不然几乎不可能。那Docker到底解决了什么问题?下面这几点,相信我们程序员都深有感触:
程序员经常说的一句话:“不可能有问题啊!我本地是好的啊!”。但是有时候线上确实是无法正常运行,可能经过很长时间的排错,最后发现某个第三方包或者运行时环境和本地不相同,并且这种排错是非常耗时的。
我们拿一个普通的java-web项目来说,要部署这个项目,那我就需要jdk、tomcat、nginx、Mysql、redis等等软件中间件
2013年Docker诞生之时,正值企业应用转向互联网应用高速发展时期,应用小型化微服务化的需求正好是其用武之地,也就是适应了今天流行面更广的微服务的一个方面—应用部署到容器中运行。这样就解决了服务拆分后快速上线部署,同时,在遇到大流量扩容方面,可以很容易就进行扩容,再也不需要再安装那么多软件,配置那么多环境,弄完还要调试等等繁琐的事情,达到了快速扩容,同时也保证了扩容时程序的稳定性(因为是同一个镜像,容器内的运行环境是一样的)
那么针对第一个问题,主要还是从开发者来说,如果我的程序能和它所依赖的环境一起打一个包交给运维,那么测试和生产部署就会更顺畅,因为任何地方运行我的程序都是一样的,因为环境都一样;
针对第二个问题,从运维角度来看,如果所有的这些重复安装的工作能省掉就行了,或者我安装一次,其他的直接复制就行(当然,运维肯定是有这种工具);
从开发者角度来看,要是这些软件能和我的软件一样,把环境和软件打一个包,我直接傻瓜式的一启动就安装好,那我是不是就不再强依赖运维了,开发者自己也能够部署项目了,省去了那些极其繁多复杂的软件安装问题。Docker 公司的口号:Build,Ship,and Run Any App,Anywhere
正式因为许许多多的开发者一直面临着这些问题,所以docker一开源,立马就收到了广大开发者的推崇,使得docker很快就大火,甚至可以说的又红又紫。所以docker能大火,由数以万计的程序员推动起来的。
2010年,几个搞IT的年轻人,在美国成立了一家公司,dotCloud。他们做的是 pass的云计算服务,其中他们用到了LXC(Linux Containers)有关的容器技术!
注意:LXC并不是docker公司的,而是linux原生支持的容器技术。
下面链接是LXC的基本介绍,可以看一下:https://blog.csdn.net/qq_44281591/article/details/132251767
他们这个东西并没有引起别人的重视,以至于自己的公司活下去都比较难了,所以在2013年,他们选择将自己容器化技术开源,起名为docker。Docker开源后,越来越多的人发现Docker的优点,Docker开始火了,每个月都会更新一个版本。2014.4.9,Docker1.0发布。所以,有时候开源是可以拯救一个公司的。
最早的时候docker就是一个开源项目,主要由docker公司维护。2017年年初,docker公司将原先的docker项目改名为mobyhttps://github.com/moby/moby,并创建了docker-ce和docker-ee。
这三者的关系是:moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品。docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品;docker-ee是docker公司维护的闭源产品,是docker公司的商业产品。moby project由社区维护,docker-ce project是docker公司维护,docker-ee是闭源的。使用免费的docker,从网页docker-ce上获取;要使用收费的docker,从网页docker-ee上获取。
到这里我们看到,其实容器化也可以算是虚拟化的一种,在之前包括现在,我们都还会使用虚拟机化技术,最常见的就是Vmware在我们自己的电脑上虚拟出多个主机来。用过虚拟机的同学可能知道,我只要配置好一台,做出一个镜像,其他虚拟主机的安装就好装了,直接克隆出来就行了,配置环境都是一样的,所以这么看,docker的容器化技术也没有比虚拟机来的更好。但事实真的是这样么?随着我们不断的使用和比较,我们发现,docker容器技术在我们开发运维过程中,确实比虚拟机技术好用太多了,甚至可以说是两种完全同的技术方案。
Docker容器化技术与虚拟机技术的不同:
我们常用的虚拟机是Vmware,使用的是windows电脑, 我想要模拟一台linux服务器, 方便部署应用, 在windows上安装了一台虚拟机,我就能够用有一台Linux的机器了。
这样构建出来的虚拟机,是和真机具有一样功能的机器,它需要有自己的内核、有自己的各种lib库,需要安装各种应用软件服务,并且本身比较笨重,启动速度也非常慢。
所以从docker容器来看,它会共享主机的Kernel内核,不需要模拟各种硬件、只需要少量的必须库lib就可以啦。这里要说明一点,我们说docker容器会共享Kernel内容,那么我们在centos上为什么能运行Ubuntu的容器?
这里我们首先要区分下Linux内核与Linux发行版。
所以,CentOS 与 Ubuntu 是不同的 Linux 发行版, 它们都是基于 Linux 内核, 只是添加的工具软件不同。比如, 他们的软件包管理系统不同, CentOS 使用 yum 命令安装软件, 而 Ubuntu 使用 apt-get 命令安装软件。这样,在 CentOS 上运行基于 Ubuntu 镜像的容器时,容器使用了 CentOS 主机的内核以及 Ubuntu 镜像,Ubuntu 镜像中安装了 Ubuntu 的各种软件(apt-get)。
那我们可能还会有疑问,那windows为什么能运行centos的容器?centos和windows的内核可是绝对不一样的啊!Docker 公司开始推出自己的 Docker for Windows 工具包,它旨在为开发人员在 Windows 上开发面向 Docker 的应用程序提供完整的工具链,其中包括运行环境、客户端,Docker Swarm 编排工具和其他工具。Docker for Windows 中负责运行环境配置的工具是 Docker Machine。与 boot2docker 类似,Docker Machine 也会在 Windows 上创建一个 Linux 虚拟机,用于运行 Docker 引擎。
传统虚拟机, 虚拟出一条硬件,运行完整的操作系统, 然后在这个操作系统上安装和运行软件;而Docker容器内的应用直接安装在主机的内核上, 容器没有自己的内核, 也没有虚拟的硬件, 所以就轻便了.由于没有臃肿的子操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。
容器的启动速度很快, 一般在几毫秒~几十毫秒;
应用场景不同。虚拟机更擅长于彻底隔离整个运行环境.例如,云服务提供商通常采用虚拟机技术隔离不同的用户。Docker通常用于隔离不同的应用,例如前端,后端以及数据库。
容器和虚拟机相比, 可以更多的利用起来小块的闲置资源,它们不运行完整的操作系统。
应用更快速的交付和部署
更便捷的升级和扩缩容
更简单的系统运维
更高效的利用计算机资源
docker是内核级别的虚拟化, 可以在一个物理机上运行很多个容器实例, 服务器的性能可以被压榨到极致.
通常, 一台主机只能同时运行2-3个虚拟机, 但是可以同时运行20-30个容器
上面这个图片就是Docker的log,这是一条鲸鱼,鲸鱼上载满了集装箱。官方团队对Logo的解释:The logo is a Whale carrying a stack of containers. It is on its way to deliver those to you。Docker直译过来是码头工人,然而Docker给人的第一感觉是容器,容器技术英译为Linux Container, Container的直译有集装箱,容器两个意思,如果要形象的理解Linux Container的话还是叫集装箱技术比较好(可以结合着上图及LOGO理解这句话),由于中国本土文化,念集装箱技术会比较奇怪,所以我们都称之为容器技术。
我们都知道码头里的集装箱是运载货物用的,它是一种按规格标准化的钢制箱子。集装箱的特色,「在于其格式划一,并可以层层重叠, 集装箱与集装箱之间互不影响」。IT领域借鉴了这一理念,我部署一个服务运行好后,我再想移植到另外一个地方,**不用再安装一套操作系统和依赖环境。**这就像集装箱运载一样,我把一辆特斯拉(好比开发好的应用APP+环境),打包放到一容器集装箱里,它通过货轮可以轻而易举的从青岛港(CentOS7.2环境)运送到天津港(Ubuntu14.04环境)。而且运输期间,我的特斯拉(APP+环境)没有受到任何的损坏(文件没有丢失),在另外一个天津港卸货后,依然可以(启动正常)。
为了更好的理解docker,我们再讲一个小故事。张三想在天津要造一栋别墅,他重金请来了高级设计师,高级建造师,等各种高级工人,热火朝天历时多半年,房子建成了,半年后,张三由于工作调动需要换到另一个青岛,他只好在青岛花了重金又打造了一栋别墅;
而张三有一个朋友李四,跟李四是同样的场景,唯一不同的是,李四认识一个天神,天神施展了法术(构建镜像),将李四的别墅直接复制了一份(镜像),装到了李四的双肩包(仓库)里,李四去到另一个城市找了一片空地(容器)直接将装在双肩包(仓库)里的房子拿了出来,拿出来的房子就能变成跟李四在原城市一模一样的房子。那么我们说,不论天津还是青岛,这块土地都是一样的东西(同一个内核),房子就是容器。听完了故事,咱们再来理解docker的两句口号就更好理解了
所以要给Docker下一个定义的话:Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。