第1章 什么是Docker

原创 2018年04月17日 14:44:26

1.1 什么是docker

 1.Docker开源项目背景

       Docker是基于Go语言实现的开源容器项目,诞生于2013年初,最初发起者是dotClouc公司。

由于Docker在业界的影响力实大太大,dotCloud公司后来也直接改名为Docker Inc,并专注于Docker相关技术和产品的开发。

      Docker项目已加入了Linux基金会,并遵循Apache2.0协议,全部开源代码均在https://github.com/docker/docker上进行维护。

      现在主流的Linux系统都已经支持Docker.例如,红帽公司的RHEL6.3/RHEL6.5往上的操作系统、Ubuntu14.04往上的操作系统,都已经在软件源中默认带有Docker软件包。Google公司宣称在其PaaS(Platform as a Service) 平台及服务产品中广泛应用了Docker容器。IBM公司跟Docker公司达成了战略全作伙伴关系。微软公司在其云平台Azure上加强了以Docker的支持。公有云提供商亚马逊推出了AWSEC2 Container服务,提供对Docker和容器业务的支持。

      Docker的构想是要实现“build,Ship and Run Any App,Anywhere”,即通过对应用的封装(Packaging)、分发 (Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用级件“一次封装,到处运行”的目的。这里的应用组件,即可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。

      基于Linux平台上的多项开源技术、Docker提供了高效、敏捷和轻量级的容器方案、并支持部署到本地环境和多种主流云平台。可以说,Docker首次为应用的开发、运行和部署提供了“一站式”的实用解决方案。

2. Linux容器技术---巨人的肩膀

           跟大部分新兴的技术的诞生一样,Docker也并非“从石头缝里蹦出来的”,而是站在前人的肩膀上,其中最重要的就是Linux容器(Linux Containers,LXC)技术。

          IBM DeveloperWorks网站关于容器技术的描述十分准确:"容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比。这样即不需要指令级模拟、也不需要即时编译。"容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制,此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性。"

        当然,LXC也经历了长期的演化。最早的容器技术可以追溯到1982年Unix系列操作系统上的chroot工具(直到今天,主流的Unix、Linux操作系统仍然支持和带有该工具)。早期的容器实现技术包括Sun Solaris操作系统上的 Solaris Containers(2004年发布),FreeBSD 操作系统上的FreeBSD jail(2000年左中出现),以及GNU/Linux上的Linux-Vserver和OpenVZ。

    在LXC之前,这些相关技术经过多年的演化已经十分成熟和稳定,但是由于种种原因,它们并没有很好的集成到主流的Linux内核中,用户使用起来并不方便。例如,如果用户要使用OpenVZ技术,需要先手动给操作系统打上特定的补丁方可使用,而且不同版本并不一致。类似的困难造成在很长一段时间内,这些优秀的技术只流传于技术人员的小圈子中。

       后为LXC项目借鉴了前人的成熟的容器设计理念,并基于一互列新引入的内核特性,实现了更具扩展性的虚拟化容器方案。更加关键提,LXC终于被集成到了主流Linux内核中,进而成为了Linux系统轻量级容器技术的事实标准。从技术层面看来,LXC已经趟过了绝大部分的”坑“,完成了容器技术实用化的大半历程。

3. 从Linux容器到Docker

        在lXC的基础上,Dockers进一步优化了容器使用体验,让它进入了寻常百姓家。

         首先,Docker提供了各种容器管理工具(如分发、版本、移植等)让用户无需关注底层的操作,呆以更简单明了地管理和使用容器;其次,Docker通过引入分层文件系统构建和高效的镜像机制,降低了迁移难度,极大地提升了用户体验。用户操作Docker容器就像操作应用自身一样简单。

         早期的Docker代码实现是直接基于LXC的。处0.9版本开始,Docker开发了libcontainer项目,作为更广泛容器驱动实现,从而替换掉了LXC实现。目前Docker还积极推动成立runC标准项目,度图让容器支持不再局限于Linux操作系统,而是更安全、更具扩展性。

        简单来讲,读者可以将Docker容器理解为一种轻量级的沙盒(sandbox).每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。容器的创建和停止都十分快,几乎跟创建和终止原生应用一致;另外,容器自身对系统资源的额外需要也十分有限,远远低于传统虚拟机。很多时候,甚至直接的容器当月作应用本身也没有任何问题。

     有理由相信,Docker技术会进一步成熟,将成为更受欢迎的容器虚拟化技术实现,并在云计算和DevOps等领域得到更广泛的应用。

1.2 为什么要使用Docker

    1.Docker容器虚拟化的好处

            Docker项目的发起人和Docker公司CTO Solomon Hykes曾认为,Docker在正确的地点,正确的时间顺应了正确的趋势----如何正确地构建应用。

             在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同是必须是“任何时间、任何地点”可获取的。因此,开发者需要一种新新型的创建分布式应用程序的方式。快速分发和部署,这正是Docker所能提供的最大的优势。

           举个简单的例子,假设用户试图基于最常见的LAMP(Linux +Apache +Mysql+PHP)组合来构建一个网站。按照传统的做法,首先,需要安装Apache、Mysql和PHP以及它们各自运行所依赖的环境;之后分别对它们进行配置(包括创建合适的用户、配置参数等);经过大量的操作后还需要进行功能测试,掉进否工作正常;如果不正常,则进行调度追踪,意味着更多的时间代价和不可控的风险。可以想象,如果应用数目变多,事情会变得更加难以处理。

         更为可怕的是,一旦需要服务器迁移(例如从亚马逊迁移到其他云),往往需要对每个应用都进行重新部署和调试,这些琐碎而无趣的“体力活”,极大地降低了工作效率。究其根源,是这些应用直接运行在底层操作系统上,无法保证同一份应用在不同的环境中行为一致。

            而Docker提供了一种更为聪明的方式,通过容器来打包应用,解耦应用和运行平台。意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台。这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险。

2. Docker 在开发和运维中的优势

                对开发和运维(DevOps)人员来说,可能最梦寐以求的效果就是一次创建或配置,之后可以在任意地方、任意时间让应用正常运行。而Docker恰恰是可以实现这一终极目标的“瑞士军刀”。

具体说来,Docker在开发和运维过程中,具有如下几个方面的优势:

更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发守成之后                             测试和运维人员可以直接使用完全相同环境来部署代码。只要开发测试过的代码,就可以确保在生产环境无                               缝 运行。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发,测试,部署                                                             的时间,并且,整个过程全程可见,使团队更容易理解应用的创建和工作过程。

 更高效的资源利用。Docker容器的运行不需要额外的虚拟化管理程序(Virtual Machine Manager,VMM,                              级及Hypervisor)支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求和低。跟传统                              虚拟机方式相比,要提高一到两个数量级。

更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、                            个人电脑、服务器等,同时支持主流的操作系统发行版。这种兼容性让用户可以在不同平台之间轻松地迁移                               应用。

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

3.Docker与虚拟机比较

作为一种轻量级的虚拟化方式,Docker在运行应用上与传统的虚拟机方式相比具有显著优势;

Docker容器很快,启动和停止可以在秒级实现,而传统的虚拟机方式需要数分钟。

Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器(在IBM服务器上已经实现了同时运行10K量级的容器实例)。

Docker通过类似Git设计理念的操作方式来方便用户获取、分发和更新应用镜像,存储复用,增量更新。

Docker通过Dockerfile支持灵活的自动化创建和部署机制,提高工作效率,使流程标准化。

Docker容器除了运行其中应用外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。传统

虚拟机试运行N个不同的应用就要起N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离的“很薄的”容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。

当然,在隔离性方面,传统的虚拟机方式提供的是相对封闭的隔离。但这产东意味着Docker就不安全,Docker利用Linux系统上多种防护技术实现了严格的隔离可靠性,并且可以整合众多安全工具,从1.3.0版本开始,Docker重点改善了容器的安全控制和镜像的安全机制,极大提高了使用Docker的安全性。在已知的大规格应用中,目前尚未出现值得担忧安全隐患。

 表1-1 总结了使用Docker容器技术与传统虚拟机技术的特性比较,可见容器技术在很多应用场景下具有巨大的优势。


表1-1  Docker 容器技术与传统虚拟机技术的特性比较



1.3 Docker与虚拟化

虚拟化(Virtualization)技术是一个通用的概念。在不同领域有不同的理解。在计算机领域,一般指的是计算虚拟化(Computing Virtualization)、或通常说的服务器虚拟化。维基百科上的定义:“虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络,内存及存储等,予以抽象、转化后呈现出来,打破实体结构间的不可切割的障碍,便用户可以比原三的组态更好的方式来应用这些资源。”

可见,虚拟化的核心是对资源的抽象、目标往往是在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。

从大类上分,虚拟化技术可以分类基于硬件的虚拟化和基于软件的虚拟化。其中,真正基于硬件的虚拟化技术不多见,少数网卡中的单根多IO虚拟化(Single Root I/O Virtualization and Sharing Specif ication,SR-IOV)等技术,也超出了本书的讨论范畴。

 基于软件的虚拟化朋对象所在的层次,以可以分为应用虚拟化和平台虚拟化(通常说的是虚拟机技术 即属于这个范畴)。其中,前者一般指的是一些模拟设备或诸如Wine这样的软件。后者又可以细分为如下 几个子类:

完全虚拟化 虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无需要进行修改。例如IBM p 和 z 系列的虚拟化、VMware Workstation、VirtualBox、QWMU等。

 硬件辅助虚拟化。利用硬件(主要是CPU)辅助支持(目前x86体系结构上可用的硬件辅助虚拟化技术包括Inter-VT和AMD-V) 处理敏感指令来实现完全虚拟化功能,客户操作系统无需修改,例如VMware Workstation 、Xen、KVM。

 部分虚拟化  只针对部分硬件资源进行虚拟化。客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化。

准虚拟化(paravirtualication)。部分硬件接口以软件的形式提供给客户机操作系统。客户操作系统需要进行修改,例如早期的Xen。

  操作系统级虚拟化。内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术却在这个范畴。

可见,Docker以及其他容器技术,都属性操作系统虚拟化这个范畴,操作系统虚拟化最大的特点是不需要额外的supervisor支持。

Docker虚拟化方式这所以有众多优势,这下操作系统虚拟化技术自身的设计和实现是分不开的。

图1-2比较了Docker和常见的虚拟化方式的不同之处。


                                                      

        传统方式是在硬件层面实现虚拟化,需要的额外的虚拟机管理应用和虚拟机操作系统层。Docker容器是在操作系统层面上实现虚拟化、直接利用本地主机的操作系统,因此更加轻量级。  


1.4 本章小结

        本单介绍了容器虚拟化的基本概念、Docker的诞生及发展历史,以及容器在云时代应用分发场景下的巨大优势。 与传统的虚拟机相比,容器虚拟化在很多场景下有极为明显的优势。无论是系统管理员、应用开发人员、测试人员以及运维管理人员,都就该尽快掌握Docker,尽早享受其带来的巨大便利。后续章节,笔者将结合实践案例具体介绍Docker的安装、使用,让我们一起开启精彩的Docker之旅。      

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tjjingpan/article/details/79974321

西安电子科技大学硕士论文latex模板第1章修改为第一章

就是章号从阿拉伯数字修改成中文数字。 在XDUthesis.cls中查找chapter,并照下图所示,将name={\arabic{chapter}}修改为name={\chinese{chapte...
  • jk123vip
  • jk123vip
  • 2017-02-25 23:41:29
  • 1238

《数据库系统概论》 第1章--绪论--第1节-数据库系统概述

1.1 数据、数据库、数据库管理系统、数据库系统1.1.1 数据Data 数据是数据库中存储的基本对象。 定义:描述事物的符号记录。 记录是计算机中表示和存储数据的一种格式或方法。 1.1.2 数据库...
  • YiBochun
  • YiBochun
  • 2016-12-22 20:38:45
  • 697

第1章 初识C语言

想拥有自由就必须时刻保持警惕 1.1、C语言的起源 1972年,丹尼斯·里奇和肯·汤姆逊在开发UNIX系统时在B语言(汤姆逊发明)的基础上设计了C语言。 C语言的主要目标:成为有用的语言。 Pasca...
  • s_whale
  • s_whale
  • 2017-07-31 01:01:08
  • 193

第1章 数据库基础知识

  • 2017年09月14日 11:56
  • 910KB
  • 下载

《大话数据结构》笔记之 第一章 数据结构绪论

一、基本概念和术语 1、数据:是描述客观事务的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 2、数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为...
  • cdu09
  • cdu09
  • 2013-05-16 11:58:04
  • 726

python自然语言处理第一章1.1

第一章:python自然语言处理 我们可以很容易的获得成千上万的文本。假设我们写一些简单的python程序,能用它做什么?在这个章节中,我们将提出以下问题: 1.我们使用简单的程序设计能对大量...
  • qianqianxiao
  • qianqianxiao
  • 2012-03-14 11:34:50
  • 308

PMBOK笔记 第1章 引论 (3)

战略管理 项目管理是企业管理的发展趋势 使命 Mission  //企业为何存在? 价值观 Values  //行为指南 愿景 Vision  //我们想要成为什么? 方向/目标Goals/Obje...
  • jiaping0424
  • jiaping0424
  • 2017-12-16 18:19:28
  • 165

第1章 什么是GitHub

Git属于分散型版本管理系统 可以免费建立任意个 GitHub 提供的 Git公开仓库。
  • qq_32659299
  • qq_32659299
  • 2017-04-06 17:50:02
  • 232

深入理解Android卷III 第1章 开发环境部署

 第1章         开发环境部署 本章的主要内容: 介绍获取Android源代码的方法 介绍如何将Android源代码导入到IDE中以方便代码阅读 ...
  • Pandoramer
  • Pandoramer
  • 2015-08-22 17:29:36
  • 652

Java基础之DBUtils

DBUtils和连接池 今日内容介绍 u DBUtils u 连接池 第1章 DBUtils 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apa...
  • opera95
  • opera95
  • 2017-03-13 17:59:23
  • 163
收藏助手
不良信息举报
您举报文章:第1章 什么是Docker
举报原因:
原因补充:

(最多只允许输入30个字)