Docker学习一:Docker基础知识

一、什么是Docker    

       Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotCloud公司(dotCloud公司后改名为Docker Inc)。目前已加入Linux基金会,遵循Apache 2.0协议,全部代码都在https://github.com/docker/docker上进行维护。

       主流的Linux系统都支持Docker。比如Readhat RHEL 6.5/CentOS 6.5以上版本、Ubuntu 14.04操作系统、Windows、Mac OS X等都支持Docker的安装。

       Docker的目标是实现轻量级的操作系统虚拟化解决方案。通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的“一次封装、到处运行”。这里的应用组件,既可以是一个web应用程序,也可以是一套数据库服务,甚至是一个操作系统或编译器。


Docker学习一:Docker基础知识


、为什么要使用Docker 

    Dcoker容器虚拟化的好处

      建设用户基于常见的LAMP(Linux+Apache+Mysql+PHP)来运维一个网站。传统做法需要安装Apache、Mysql和PHP以及他们各自运行所依赖的环境;之后分别对他们进行设置(包括创建合适的用户、配置参数等);经过大量的操作后,还需要进行功能测试,看是否工作正常;如果不正常,则意味着更多的时间代价和不可控制的风险。可想而知,如果再加上更多的应用,事情会变得更加难以处理。如果涉及服务器迁移,往往需要重新部署和调试。

     Dcoker通过容器来打包应用,意味着迁移只需要在新的服务器上启动需要的容器就可以了,这样可以节约大量的部署时间,并降低部署过程中出现的问题。

    

     Docker开发与运维中的优势

     1、更快的交付和部署。开发人员可以使用镜像来快速构建一套标准开发环境;开发完成之后,测试和运维人员可以直接使用相同环境来部署代码。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且各个步骤都有明确的配置和操作,整个过程全程可见,使团队更容易理解应用的创建和工作过程。

     2、更高效的资源利用。Docker容器运行不需要额外的虚拟化管理程序(Virtual Machine Manager,以及Hypervisor)支持,它是内核级的虚拟化,可以实现更多高的性能,同时对资源的额外需求很低。

     3、更轻松的迁移和扩展。Dcoker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性让用户可以在不同平台之上可以轻松地迁移使用。

     4、更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式进行发布和更新,从而实现自动化并且高效的容器管理。

     

      Dcoker与虚拟机的比较

      1、Docker容器运行很快,启动和停止可以秒级实现,这比传统的虚拟机方式要快很多。

      2、Dcoker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。

      3、Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简单,学习成本低。

      4、Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。

类别
容器
OpenStack
部署难度 非常简单 组件多,部署复杂
启动速度 秒级 分钟级
执行性能 与物理系统基本相同 VM会占用一些资源
镜像体积 MB级别 GB级别
管理效率 管理简单 组件相互依赖,管理复杂
隔离性 隔离性高 彻底隔离
可管理性能 单进程、不建议启动SSH 完整的系统管理
网络连接 借助Neutron可以灵活组件各类网络架构

          

         Docker与虚拟机实现原理比较

Docker学习一:Docker基础知识

        比较两图的差异,左图虚拟机管理程序和虚拟机操作系统层在docker中被Docker容器支持层所替代。虚拟机的虚拟机操作系统即为虚拟机安装的操作系统,它是一个完整操作系统内核;虚拟机的虚拟机管理程序层可以简单理解为一个硬件虚拟化平台,它在宿主机操作系统是以内核态的驱动存在的。
        虚拟机实现资源隔离的方法是利用独立的OS,并利用虚拟机管理程序虚拟化CPU、内存、IO设备等实现的。例如,为了虚拟CPU,虚拟机管理程序会为每个虚拟的CPU创建一个数据结构,模拟CPU的全部寄存器的值,在适当的时候跟踪并修改这些值。需要指出的是在大多数情况下,虚拟机软件代码是直接跑在硬件上的,而不需要虚拟机管理程序介入。只有在一些权限高的请求下,虚拟机操作程序需要运行内核态修改CPU的寄存器数据,虚拟机管理程序会介入,修改并维护虚拟的CPU状态。
        虚拟机管理程序虚拟化内存的方法是创建一个shadow page table。正常的情况下,一个page table可以用来实现从虚拟内存到物理内存的翻译。在虚拟化的情况下,由于所谓的物理内存仍然是虚拟的,因此shadow page table就要做到:虚拟内存->虚拟的物理内存->真正的物理内存。
        对于IO设备虚拟化,当虚拟机管理程序接到page fault,并发现实际上虚拟的物理内存地址对应的是一个I/O设备,虚拟机管理程序就用软件模拟这个设备的工作情况,并返回。比如当CPU想要写磁盘时,虚拟机管理程序就把相应的数据写到一个host OS的文件上,这个文件实际上就模拟了虚拟的磁盘。
        对比虚拟机实现资源和环境隔离的方案,docker就显得简练很多。docker 容器支持可以简单看成对Linux的NameSpace、Cgroup、镜像管理文件系统操作的封装。docker并没有和虚拟机一样利用一个完全独立的宿主机操作系统实现环境隔离,它利用的是目前Linux内核本身支持的容器方式实现资源和环境隔离。简单的说,docker利用namespace实现系统环境的隔离;利用Cgroup实现资源限制;利用镜像实现根目录环境的隔离


、Docker可以用来做什么

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

      2、代码流水线管理

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

      3、开发效率

      不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。

      4、应用隔离

      有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。

      值得考虑的几个此类使用场合包括:合并服务器以降低成本,或者逐步计划将整块式应用程序划分成几个分离的部分。比如说,假设你需要运行两台REST API服务器,它们都使用flask框架。但每一台服务器使用版本略有不同的flash及其他此类依赖项。在不同的容器下运行这些API服务器提供了一种简单的出路,可以克服所谓的“依赖性地狱”(dependency hell)。

      5、服务器整合

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

      6、调试能力

      提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。

      7、多租户

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

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

      8、快速部署

     在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟,Docker只是创建一个容器进程而无需启动操作系统,这个过程只需要秒级的时间。这正是Google和Facebook都看重的特性。

     你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率。


、Docker改变了什么


     面向产品:产品交付
     面向开发:简化环境配置
     面向测试:多版本测试
     面向运维:环境一致性
     面向架构:自动化扩容(微服务)


版权说明:文章参考《Docker技术入门与实战》,转载请注明出处。