Docker是个啥?

       谈到docker你们应该都不陌生,从2013年初诞生到如今,短短两年时间内,迅速成为仅次于openstack的最受欢迎的云计算开源项目。linux

       那么是什么缘由致使docker这么火热呢?git

       我也很感兴趣,所以我将用docker实践这一系列博文,记录我对docker的认识和实践。github

       本文主要介绍docker是什么,以及docker与传统虚拟化之间的区别等。web


docker是什么?docker

       docker,它是一个基于LXC(LinuX Container)的高级容器引擎,使用Go语言开发,遵循Apache2.0协议,所有开源代码均托管在github上(https://github.com/docker/docker)。它诞生于2013年初,最初发起者是dotCloud公司,该公司现已经更名为Docker Inc,专一于Docker相关技术和产品的开发。数据库

       目前,主流的linux、windows和mac都已经支持docker。须要注意的是,因为docker是基于LXC的,因此除了linux以外的操做系统,都是靠在虚拟机里面跑linux,再在linux上跑docker来实现的。windows

       docker诞生的主要目标是"Build,Ship and Run Any App,Anywhere",即经过对应用组件的封装(Packaging)、分发(Deployment)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的"一次封装,处处运行"。这里的应用组件,既能够是一个web应用,也能够是一套数据库服务,甚至是一个操做系统或者编译器。安全


LXC是什么?架构

       docker引擎的基础是Linux容器(linux container,LXC)技术。IBM DevelperWorks上给出了关于容器技术的准确描述:运维

       容器有效地将单个操做系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不须要指令级模拟,也不须要即时编译。容器能够在核心CPU本地运行指令,而不须要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性。

       liunux容器并非一个全新的概念,早期的容器技术有chroot、Solaris Containers、FreeBSD jail、linux-VServer、Solaris Zones、OpenVZ、lxc等。虽然这些技术发展很早,可是并无集成到linux内核中去,使用起来很不方便,好比OpenVZ须要先给操做系统打上特定的内盒补丁才能使用。LXC项目借鉴了前人成熟的容器设计理念,并给予一系列新的内核特性实现了更具扩展性的虚拟化容器方案,而且被集成到了主流linux内核中,进而成为linux系统轻量级容器技术的事实标准。

       在LXC的基础上,docker作了很大的改善,好比:

一、LXC的定位是做为一种虚拟机的替代方案。虽然全部的软件均可以安装在由 LXC 或者 Docker 管理的容器中,可是 Docker 更倾向于在一个容器中运行一个应用

二、每一个LXC容器之间或许不兼容,可是 docker 采用了一种标准的配置方法使得由不一样docker建立出的LXC可以彻底兼容

三、Docker实现了相似 git 的容器版本管理方法,而且可以进行增量更新。

四、能够建立 base p_w_picpath 并将其保存在远程仓库 (repository) 中以便复用,其余容器能够在其基础上进行建立并保存为新的p_w_picpath。

五、docker提供了各类容器管理工具(如分发、版本、移植等)让用户无需关注底层的操做,能够简单明了地管理和使用容器

六、Docker管理着一个公共的 p_w_picpath 库方便用户分享本身的p_w_picpath,同时公司也能够构造本身私有的 p_w_picpath 库。

七、Docker的容器是根据 Dockerfile 构建的,你能够在构建 p_w_picpath 的过程当中,根据须要运行任何命令和程序。

八、由于 docker 愈来愈流行,有大量的方法可以将其轻易地集成到开发过程当中,好比能够采用统一的方法来构造用于持续集成的环境和开发环境的容器。


Docker与虚拟机的区别

       其实,docker和虚拟机都是属于虚拟化技术。而虚拟化技术又分了不少种类。好比VM、KVM这种全虚拟化和早期的Xen这种半虚拟化。而docker则是属于操做系统级虚拟化。

       像VM、KVM之类的虚拟出来的都是虚拟机,而docker做为一种轻量级的虚拟化方式,那么docker在运行应用上跟传统的虚拟机方式有哪些显著优点呢?

一、docker容器很快,启动和中止能够在秒级实现,这相比传统的虚拟机方式要快的不少

二、docker容器对系统资源需求不多,一台主机上能够同时运行数千个docker容器

三、docker经过相似git的操做来方便用户获取、分发和更新应用镜像,指令简明,学习成本很低

四、docker经过dockerfile配置文件来支持灵活的自动化建立和部署机制,提升工做效率


下面是docker容器技术和传统虚拟机技术的特性比较:

特性 容器 虚拟机
启动速度 秒级 分钟级
硬盘使用 通常为MB 通常为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 通常几十个
隔离性 安全隔离 安全隔离

       docker的这些优点是什么形成的呢?咱们能够先看下图:

wKiom1VONxiTVjjmAAF7viqcvXA143.jpg

       传统虚拟化是在硬件层面实现虚拟化,须要有额外的虚拟机管理应用和虚拟机操做系统层,而docker容器却不须要这两层,而是直接使用操做系统的系统调用接口。正由于这样子,docker容器除了运行其中的应用以外,基本不消耗额外的系统资源,保证应用性能的同时,尽可能减少系统开销。传统虚拟机方式,运行N个不一样的应用就要启动N个虚拟机(每一个虚拟机须要单独分配内存、磁盘等资源),而docker只须要启动N个隔离的容器,并将应用放到容器中便可,这样子就减小了不少的资源消耗。


docker在软件开发流程中的优点

       docker在设计之初就有如下几个目的:

一、增强开发人员写代码的开发环境和应用程序要部署的生产环境的一致性,从而下降那种"开发一切正常,确定是运维的问题"的风险。

二、缩短代码从开发、测试到部署、上线运行的周期,让你的程序具有能够执行,易于构建、并易于协做

三、docker鼓励面向服务的架构和微服务架构。docker推荐单个容器运行一个应用程序或进程,这样就造成了一个分布式的应用程序模型

       使用docker,开发人员只须要关心容器中运行的应用程序,而运维人员只须要关心如何管理容器。

       整体来说,docker在开发和运维过程当中,具备以下优点:

一、更快速的交付和部署

二、更高效的资源利用。docker容器的运行不须要额外的虚拟机管理程序(VMM,以及Hypervisor)支持,它是内核级的虚拟化,能够实现更高的性能,同时对资源的需求很低

三、更轻松的迁移和扩展

四、更简单的更新管理。使用dockerfile,只须要小小的配置修改,就能够替代以往大量的更新工做,而且全部修改都以增量的方式进行分发和更新,从而实现自动化而且高效的容器管理。


OK!

以上便是本文的所有内容,有关docker的其它内容,会在下篇博文出现。