开启新篇章--Docker入门

一.容器介绍
容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于互相干扰;而被装进集装箱的应用,也可以被方便地搬来搬去,这其实是PaaS最理想的状态

问题:容器的本质是什么?
容器的本质是进程。容器就是未来云计算系统中的进程;容器镜像就是这个系统里的"。exe"安装包.kubernetes就是操作系统

1.Docker介绍
开启新篇章--Docker入门_第1张图片

1.1 Docker公司认知

  • 官网地址: docker.io docker.com
  • 公司名称:原名dotCloud 14年改名为docker
  • 容器产品:docker 16年已经更名为Moby

1.2 容器简史

  • 和虚拟机一样,容器技术也是一种资源隔离的虚拟化技术。我们追溯它的历史,会发现它的技术雏形早已有之。
  • 容器概念始于1979年提出的UNIX chroot,它是一个UNIX操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的位置,从而达到了进程隔离的目的。
  • 2000年的时候FreeBSD开发了一个类似于chroot的容器技术Jails,这是最早期,也是功能最多的容器技术。Jails英译过来是监狱的意思,这个"监狱”(用沙盒更为准确)包含了文件系统、用户、网络、进程等的隔离。
  • 2001 Linux也发布自己的容器技术Linux Server,2004 Solaris也发布了Solaris
    Containers,两者都将资源进行划分,形成一个个zones,又叫做以服务器。
  • 2005年推出OpenZ,它通过对Linux内核进行补丁来提供虚拟化的支持,每个OpenNZ容器完整支持了文件系统、用户及用户组、进程、网络、设备和IPC对象的隔离。
  • 2007年Google实现了Control Groups( cgroups),并加入到Linux内核中,这是划时代的,为后期容器的资源配额提供了技术保障。
  • 2008年基于cgroups 和linux namespace推出了第一个最为完善的Linux容器LXC
  • 2013年推出到现在为止最为流行和使用最广泛的容器Docker,相比其他早期的容器技术,Docker引入了一整套容器管理的生态系统,包括分层的镜像模型,容器注册库,友好的RestAPl。
  • 2014年CoreOS也推出了一个类似于Docker的容器Rocket,CoreOS一个更加轻量级的Linux操作系统,在安全性上比
    Docker更严格。
  • 2016年微软也在Windows 上提供了容器的支持,Docker可以以原生方式运行在Windows上,而不是需要使用Linux虚拟机。
  • 基本上到这个时间节点,容器技术就已经很成熟了,再往后就是容器云的发展,由此也衍生出多种容器云的平台管理技术,其中以kubernetes,最为出众,有了这样一些细粒度的容器集群管理技术,也为微服务的发展奠定了基石。因此,对于未来来说,应用的微服务化是一个较大的趋势。

1.3 容器需求成因

  • 其一,这是技术演进的一种创新结果,其二,这是人们追求高效生产活动的一种工具。

  • 随着软件开发的发展,相比于早期的集中式应用部署方式,现在的应用基本都是采用分布式的部署方式,一个应用可能包含多种服务或多个模块,因此多种服务可能部署在多种环境中,如虚拟服务器、公有云、私有云等,由于多种服务之间存在一些依赖关系,所以可能存在应用在运行过程中的动态迁移问题,那这时如何保证不同服务在不同环境中都能平滑的适配,不需要根据环境的不同而去进行相应的定制,就显得尤为重要。

  • 就像货物的运输问题一样,如何将不同的货物放在不同的运输机器上,减少因货物的不同而频繁进行货物的装载和卸载,浪费大量的人力物力。

  • 为此人们发明了集装箱,将货物根据尺寸形状等的不同,用不同规格的集装箱装载,然后再放到运输机上运输,由于集装箱密封,只有货物到达目的地才需拆封,在运输过程能够再不同运输机上平滑过渡,所以避免了资源的浪费。

  • 因此集装箱被誉为是运输业与世舁贸易最重要的发明。

  • Docker容器的思想就是采用集装箱思想,为应用提供了一个基于容器的标准化运输系统。Docker可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上。这样容器就可以跑在任何环境中,因此才有了那句话:Buildonce, Run Anywhere

  • 这种集装箱的思想我们也能从 Docker的 Logo中看出来,这不就是一堆集装箱吗?

开启新篇章--Docker入门_第2张图片
1.4 Docker VS 传统

部署模式区别

传统的部署模式:安装(包管理工具或者源码包编译)->配置->运行

Docker部署模式:复制->运行

容器和虚拟机区别

  1. 容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。
  2. 虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。
  3. 容器使用宿主操作系统的内核,而虚拟机使用独立的内核
  4. 容器只是一个进程,而虚拟机不是

Docker对服务器端开发/部署带来的变化:

  • 实现更轻量级的虚拟化,方便快速部署
  • 对于部署来说可以极大的减少部署的时间成本和人力成本
  • Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,核心理念就是 Build once, Run
    anywhere

1)标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;

2)节约时间,快速部署和启动,MM启动一般是分钟级,docker容器启动是秒级;

3)方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合;

4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;

5)方便持续集成,通过与代码进行关联使持续集成非常方便;

6)可以作为集群系统的轻量主机或节点,在laaS平台上,已经出现了CaaS,通过容器替代原来的主机。

Docker 优势
1、交付物标准化

  • Docker是软件工程领域的"标准化"交付组件,最恰到好处的类比是"集装箱"。

集装箱将零散、不易搬运的大量物品封装成一个整体,集装箱更重要的意义在于它提供了一种通用的封装货物的标准,卡车、火车、货轮、桥吊等运输或搬运工具采用此标准,隧道、桥梁等也采用此标准。以集装箱为中心的标准化设计大大提高了物流体系的运行效率。

传统的软件交付物包括:应用程序,依赖软件安装包、配置说明文档、安装文档、上线文档等非标准化组件。Docker的标准化交付物称为"镜像"",包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。

2、一次构建,多次交付

类似于集装箱的"一次装箱,多次运输",Docker镜像可以做到"一次构建,多次交付"。当涉及到应用程序多副本部署或者应用程序迁移时,更能体现Docker的价值。

3、应用隔离

集装箱可以有效做到货物之间的隔离,使化学物品和食品可以堆砌在一起运输。Docker可以隔离不同应用程序之间的相互影响,但是比虚拟机开销更小。
总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本。

Docker的度量

Docker是利用容器来实现的一种轻量级的虚拟技术,从而在保证隔离性的同时达到节省资源的目的。Docker的可移植性可以让它一次建立,到处运行。Docker的度量可以从以下四个方面进行:

1)隔离性

Docker采用libcontainer作为默认容器,代替了以前的LXC。libcontainer的隔离性主要是通过内核的命名空间来实现的,有pid、net、ipc.mnt.uts命令空间,将容器的进程、网络、消息、文件系统和主机名进行隔离。

2)可度量性

Docker主要通过cgro.ups控制组来控制资源的度量和分配。

3)移植性
Docker利用AUES来实现对容器的快速更新.AUES是一种支持将不同目录挂载到同一个虚拟文件系统下的文件系统,支持对每个目录的读写权限管理。ALES.具有层的概念,每一次修改都是在已有的只写层进行增量修改,修改的内容将形成新的文件层,不影响原有的层。

4)安全性

安全性可以分为容器内部之间的安全性;容器与托管主机之间的安全性。容器内部之间的安全性主要是通过命名空间和cgroups来保证的。
容器与托管主机之间的安全性主要是通过内核能力机制的控制,可以防止Docker非法入侵托管主机。

Docker容器使用AUES作为文件系统,有如下优势
1)节省存储空间
多个容器可以共享同一个基础镜像存储.

2)快速部署
如果部署多个来自同一个基础镜像的容器时,可以避免多次复制操作。

3)升级方便
升级—个基础镜像即可影响到所有基于它的容器。

4)增量修改
可以在不改变基础镜像的同时修改其目录的文件,所有的更高都发生在最上层的写操作层,增加了基础镜像的可共享内容。

1.5 容器的应用场景
1.简化配置
这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。

2.代码流水线管理
前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。

3.提高开发效率
这就带来了一些额外的好处: Dotker_提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater.在DevOpsDays Austin 2014大会或者是"ockerCon上的演讲。
不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。
理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。

4.隔离应用
有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。
我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的这篇论文,文中将Google和亚马逊做了比较。

5.整合服务器
正如通过虚拟机来整合多个应用,Dorker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。

6.调试能力
Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在《Docker拯救世界》的文章中找到这一点的例证。

7.多租户环境
另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为物联网的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。

使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的命令。

8.快速部署
在虚拟机之前,引入新的硬件资汲需要消耗几天的时间。虚拟化技术将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统再次将这个过程缩短到了秒级。这正是Google和Eacebook都看重的特性。

你可能感兴趣的:(docker)