1.认识下Docker

1.Docker为什么会火?

Docker能火起来,不仅仅与它开源有关系,一定是解决了我们软件从开发到上线的痛点,要不然几乎不可能。那Docker到底解决了什么问题?下面这几点,相信我们程序员都深有感触:

1. 解决环境不一致的问题

程序员经常说的一句话:“不可能有问题啊!我本地是好的啊!”。但是有时候线上确实是无法正常运行,可能经过很长时间的排错,最后发现某个第三方包或者运行时环境和本地不相同,并且这种排错是非常耗时的。

1.认识下Docker_第1张图片

2.解决服务器繁多复杂的软件安装问题

我们拿一个普通的java-web项目来说,要部署这个项目,那我就需要jdk、tomcat、nginx、Mysql、redis等等软件中间件

  1. 部署一个节点运行,这时候我们至少需要两个环境:测试和生产环境。这时候我们就告诉运维,需要安装这些软件,并且还要告诉运维详细的版本。运维同学拿到需求后,首先部署一套测试环境,费劲巴拉的弄完,还需要再费劲巴拉的部署一套生产环境,好不容易弄完了,并且都是重复的工作;
  2. 假如这时候我需要扩容,部署一个集群,比如需要我的应用需要4个节点,这是运维同学就需要另外再至少部署三台的java运行环境;如果我的MySql需要主从,那么运维同学就需要再装一从库;假如我需要Redis做主从,运维同学还需要至少要搞个哨兵;
  3. 很多服务器上的软件安装也并不是特别容易,对于开发者来源,他可能没有这么强的能力搞定这些东西,那么就会对运维同学产生强依赖,导致离开运维之后,我们的软件就没法上线部署。

3.docker生逢其时

2013年Docker诞生之时,正值企业应用转向互联网应用高速发展时期,应用小型化微服务化的需求正好是其用武之地,也就是适应了今天流行面更广的微服务的一个方面—应用部署到容器中运行。这样就解决了服务拆分后快速上线部署,同时,在遇到大流量扩容方面,可以很容易就进行扩容,再也不需要再安装那么多软件,配置那么多环境,弄完还要调试等等繁琐的事情,达到了快速扩容,同时也保证了扩容时程序的稳定性(因为是同一个镜像,容器内的运行环境是一样的)

那么针对第一个问题,主要还是从开发者来说,如果我的程序能和它所依赖的环境一起打一个包交给运维,那么测试和生产部署就会更顺畅,因为任何地方运行我的程序都是一样的,因为环境都一样;

针对第二个问题,从运维角度来看,如果所有的这些重复安装的工作能省掉就行了,或者我安装一次,其他的直接复制就行(当然,运维肯定是有这种工具);

从开发者角度来看,要是这些软件能和我的软件一样,把环境和软件打一个包,我直接傻瓜式的一启动就安装好,那我是不是就不再强依赖运维了,开发者自己也能够部署项目了,省去了那些极其繁多复杂的软件安装问题。Docker 公司的口号:Build,Ship,and Run Any App,Anywhere

正式因为许许多多的开发者一直面临着这些问题,所以docker一开源,立马就收到了广大开发者的推崇,使得docker很快就大火,甚至可以说的又红又紫。所以docker能大火,由数以万计的程序员推动起来的。

2.Docker历史

2.1 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发布。所以,有时候开源是可以拯救一个公司的。

2.2 Docker的不同版本

最早的时候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上获取。

3.容器化技术

到这里我们看到,其实容器化也可以算是虚拟化的一种,在之前包括现在,我们都还会使用虚拟机化技术,最常见的就是Vmware在我们自己的电脑上虚拟出多个主机来。用过虚拟机的同学可能知道,我只要配置好一台,做出一个镜像,其他虚拟主机的安装就好装了,直接克隆出来就行了,配置环境都是一样的,所以这么看,docker的容器化技术也没有比虚拟机来的更好。但事实真的是这样么?随着我们不断的使用和比较,我们发现,docker容器技术在我们开发运维过程中,确实比虚拟机技术好用太多了,甚至可以说是两种完全同的技术方案。

Docker容器化技术与虚拟机技术的不同:

3.1 虚拟机

我们常用的虚拟机是Vmware,使用的是windows电脑, 我想要模拟一台linux服务器, 方便部署应用, 在windows上安装了一台虚拟机,我就能够用有一台Linux的机器了。
1.认识下Docker_第2张图片

  • 基础服务(Server):可以理解成我们的个人电脑,数据中心的服务器,或者是云主机。
  • 主操作系统(Host OS):你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。
  • 虚拟机管理系统(Hypervisor):利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。
  • 子操作系统(Guest Operating System):假如我们需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个子操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存.

这样构建出来的虚拟机,是和真机具有一样功能的机器,它需要有自己的内核、有自己的各种lib库,需要安装各种应用软件服务,并且本身比较笨重,启动速度也非常慢。

3.2 Docker容器

1.认识下Docker_第3张图片

  • 基础服务(Server):可以理解成我们的个人电脑,数据中心的服务器,或者是云主机。
  • 主操作系统(Host OS):你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。
  • Docker引擎(Docker Engine):Docker Engine 取代了Hypervisor,他是运行在主操作系统之上的后台进程,负责管理docker容器。
  • 各种依赖(libs):对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的;
  • 应用(app):应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

所以从docker容器来看,它会共享主机的Kernel内核,不需要模拟各种硬件、只需要少量的必须库lib就可以啦。这里要说明一点,我们说docker容器会共享Kernel内容,那么我们在centos上为什么能运行Ubuntu的容器?

这里我们首先要区分下Linux内核与Linux发行版。

  • Linux内核是Linux系统的核心,负责硬件管理,比如管理内存、管理磁盘(文件系统)、管理cpu(进程)等等;
  • 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 引擎。

3.3 Docker与虚拟机的区别

  • 传统虚拟机, 虚拟出一条硬件,运行完整的操作系统, 然后在这个操作系统上安装和运行软件;而Docker容器内的应用直接安装在主机的内核上, 容器没有自己的内核, 也没有虚拟的硬件, 所以就轻便了.由于没有臃肿的子操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。

  • 容器的启动速度很快, 一般在几毫秒~几十毫秒;

  • 应用场景不同。虚拟机更擅长于彻底隔离整个运行环境.例如,云服务提供商通常采用虚拟机技术隔离不同的用户。Docker通常用于隔离不同的应用,例如前端,后端以及数据库。

  • 容器和虚拟机相比, 可以更多的利用起来小块的闲置资源,它们不运行完整的操作系统。

  • 性能对比:
    1.认识下Docker_第4张图片

3.4 docker容器化技术在DevOps(开发,运维)中的作用

  • 应用更快速的交付和部署

    • 传统: 每台服务器要安装哪些应用, 配置哪些环境变量, 安装顺序, 都会一一记录到帮助文档
    • docker: 打包镜像, 一键运行.
  • 更便捷的升级和扩缩容

    • 传统: 需要安装软件, 部署, 重复工作
    • docker: 部署应用就像搭积木, 项目打包为一个镜像, 扩展服务器非常方便.
  • 更简单的系统运维

    • 在容易化部署之后, 我们的开发, 测试环境都是高度一致的, 不会出现在开发耗时, 部署到测试,线上不好使的情况
  • 更高效的利用计算机资源

    • docker是内核级别的虚拟化, 可以在一个物理机上运行很多个容器实例, 服务器的性能可以被压榨到极致.

      通常, 一台主机只能同时运行2-3个虚拟机, 但是可以同时运行20-30个容器

3.5 Docker容器学习官网

  • docker官网: https://www.docker.com
  • docker文档: https://docs.docker.com/ docker的文档非常详细
  • docker仓库: https://hub.docker.com/

4.什么是Docker?

1.认识下Docker_第5张图片

上面这个图片就是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的两句口号就更好理解了

  • 「Build, Ship and Run (搭建,发送,运行)」
  • 「Buildonce,Runanywhere (搭建一次,运行到任何地方)」

所以要给Docker下一个定义的话:Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。

你可能感兴趣的:(Docker,docker,容器,虚拟机)