Docker简介
前言
说起Docker,很多人只知道它是容器,那为什么它会发展起来,这就得先从微服务说起。随着生产力的发展尤其是弹性架构的广泛应用(比如微服务),许多一流开发者都将应用托管到了应用容器上,比如Google、微软、亚马逊、腾讯、阿里、京东和新浪。
1.1 微服务
微服务是一种软件开发技术——面向服务的体系结构(SOA)架构样式的一种变体,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕具体业务进行构建,并且能够独立部署到生产环境、类生产环境等。
另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据上下文,选择合适的语言、工具对其进行构建。
1.2 虚拟化技术
虚拟化分为硬件级虚拟化(hardware-levelvirtualization)和操作系统级虚拟化(os-level-virtualization)。
硬件级虚拟化是运行在硬件之上的虚拟化技术,它的管理软件也就是我们通常说的 hypervisor 或者 virtual machine monitor,它需要模拟的就是一个完整的操作系统,也就是我们通常所说的基于 Hyper-V 的虚拟化技术,
VMWare,Xen,VirtualBox,亚马逊 AWS 和阿里云都是用的这种技术。
操作系统级虚拟化是运行在操作系统之上的,它模拟的是运行在操作系统上的多个不同进程,并将其封装在一个密闭的容器里面,也称为容器化技术。Docker 正是容器虚拟化中目前最流行的一种实现。
1.3 基于服务的云计算模式
我们知道传统的服务器或者电脑主机,基本都是一锤子买卖,商家卖给你之后基本就很难再从消费者身上获得其他收入。随着云的概念出现,越来越多的厂商都意识到卖硬件是不可能获得长期利益的,只有服务才是可持续的赢利点。因此,在2010年左右,出现了以大批提供云服务的公司。总体来说基本都可以归为下面几大类的一种或多种:
1.3.1 基础设施即服务(Infrastructure as a service)
通常指的是在云端为用户提供基础设施,如:
虚拟机、服务器、存储、负载均衡、网络等等。亚马逊的 AWS 就是这个领域的佼佼者,国内则以阿里云为首。
1.3.2 平台即服务(Platform as a service)
通常指的是在云端为用户提供可执行环境、数据库、网站服务器、开发工具等等。国外的 OpenShift,RedHat,Cloudera,CloudFoundry,GoogleAppEngine 都是这个领域的,当然还有一个非常有名的公司,那就是 dotCloud,后续会再介绍一下这个公司。
1.3.3 软件即服务(Software as a service)
通常指的是在云端为用户提供软件,如 CRM 系统,邮件系统,在线协作,在线办公等等。比如微软就把自己的 Office 搬到了云端,国内的有道、麦客、Tower 都是属于这个领域的。
1.4 Docker
Docker是一个开源项目,基于Google公司推出的go语言实现,后加入Linux基金会,遵从Apache 2.0协议,项目源代码在GitHub上进行维护。
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker是一个开源的应用容器引擎,可以为任何应用创建一个轻量级、可移植、自给自足的容器。开发者可以在本地编译测试通过的容器批量的在生产环境中部署。
简单理解,Docker就像是一个集装箱,应用就像是各式各样的货物,经过集装箱的标准化进行托管,同时集装箱之间互相没有影响,相互隔离。Docker平台可以理解就是一个软件集装箱化平台,可以将自己/别人的应用程序及其依赖关系通通打包到一个容器中,这样应用就可以轻松的通过容器运送到其它机器上运行使用。其易于装载、复制、移除的特点,非常适合软件弹性架构(微服务)。
容器充当软件部署的标准单元,其中又包含不同代码和依赖项,开发人员或者IT专业人员只需进行极少修改,甚至不进行修改,即可轻松部署到不同环境。
总而言之,Docker是一个开放平台,开发人员和管理员可以在容器这种松散且隔离的环境中构建镜像、交付以及运行分布式应用程序,以便在开发、QA和生产环境之间进行高效的应用程序生命周期管理。
1.5 Docker架构
从下图可见,容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
从上图我们可以看到,容器由于省去了操作系统,整个层级更简化,可以在单台服务器上 运行更多的应用,而这正是 IAAS 所需要的,可能 5G 左右的空间对你来说不是什么大事,但是如果你需要对外提供成千上万的主机,那就是不得不考虑的问题,而这正是容器虚拟化要解决的问题。
1.6 使用Docker的原因
Docker相比传统虚拟化方式具有很多优势,比如Docker容器可以实现秒级启动,Docker对于系统资源的利用率很高,在一台物理主机上可以同时运行数千个Docker容器,另外还有基本不消耗额外系统资源的优点,可以使应用性能很高的同时系统的开销很小。
具体下分以下几点优势:
1.6.1 更快速的交付和部署
开发者可以使用一个标准的镜像构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器部署代码,Docker可以快速创建容器,快速迭代应用程序,并让整个过程透明全程可见,是团队中其他成员更容易理解应用程序是如何创建和工作的。同时上面也说到,Docker容器的启动时间是秒级的,可以大量的节省开发、测试】部署的时间。
1.6.2 更高效的虚拟化
Docker容器运行无需额外的 hypervisor 支持,他是内核级的虚拟化,可以实现更高的性能和效率。
1.6.3 更轻松的迁移和扩展
Docker容器几乎可以在任意环境下运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等等。极高的兼容性可以实现一个应用程序直接迁移到其它类型的平台中并快速运行。
1.6.4 更简单的管理
Docker只需要简单的修改,便可以替代以往大量的更新工作。所有的修改都是以增量的方式被分发和更新,从而实现自动化且高效的管理。
1.7 Docker应用场景
1.7.1 简化配置
虚拟机的最大好处是能在硬件设施上运行各种配置不一样的平台(软件、系统),而Docker在降低额外开销的情况下提供了同样的功能。能将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,降低了硬件要求和应用环境之间的耦合度。
1.7.2 代码流水线(Code Pipeline)管理
代码从开发者的机器到最终在生产环境上的部署,需要经过很多中间环境,每一个中间环境都有其极小的差别,而Docker为应用提供了一个从开发到上线完全一致的环境,简化代码流水线。
1.7.3 提高开发效率
Docker可以非常简单的实现让开发环境贴近生产环境以及快速搭建开发环境这两点,哪怕是所使用机器配置一般依然可行。Docker最牛逼的特性就是几乎没有额外开销的虚拟化,配置机器一般的及其也可以轻松跑动多个Docker应用,而无需增加机器配置。
1.7.4 应用隔离
由于需要节省成本,因此将服务器整合,然后再将这个整体式的应用拆分成松耦合的单个应用(例如微服务架构),最后还要应用之间互相兼容。上述Docker可以简单实现。
1.7.5 整合服务器
Docker可以比虚拟机提供更好的服务器整合解决方案,意味着资源可以更有效的利用——可以做更多衣服的同时,没有边角料,成本还更低。
1.7.6 调适能力
Docker提供了很多工具,提供很多功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,有利于调试bug。
1.7.7 多租户环境
在物联网(IOT)的应用中,开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂且难以处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,这一切得益于Docker环境的启动速度和其高效的diff命令。从而在多租户的应用中,避免关键应用的重写。
假如我们写了一个不支持多租户的业务程序,而实际业务中经常会需要支持多租户或者有
新客户需要使用的场景,通常的做法是部署一套新的代码,但当站点达到一定量的时候,要么重写程序,要么维护人员Game over。
1.7.8 快速部署
在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。
因此,无需担心在服务器或云端中创建 / 销毁资源重新启动所带来的开销。通常情况下,服务器的资源利用率只有30%,而通过使用Docker并进行有效的资源分配可以极大的提高资源的利用率。
1.8 Docker改变了什么
- Docker改变了云服务,使云服务共融共通的理想逐步成为了可能,并且Docker已经是云策略的一部分,许多开发者正在计划使用Docker将业务迁移到云端。另外,为了避免被云服务供应商绑定,Docker成为很多开发者的首选;
- Docker改变了产品交付,为产品的整个生命周期提供了一整套的解决方案和流程;
- Docker改变了开发方式,提供了简化的环境配置、封装的运行环境以及统一的环境,并且提供了快速部署的方式;
- Docker改变了测试,多版本测试变得极为方便,快速构建测试环境也变得更加简单并且无需开发人员干预或者搭建;
- Docker改变了运维,环境的一致性让运维变得更加简单,同时热更新的支持让运维不再需要半夜加班部署更新,更新可以随时进行,当出现重大问题时,还能快速回滚到指定版本;
- Docker改变了架构,自动化扩容支持让架构变得更加简单,分布式系统也更加易于搭建和支持,同时遗留的单体应用也很易于转变为现代应用。