进入21世纪,继互联网以后,云计算开始大放异彩。云计算是互联网发展后期的必然方向,反过来,云计算也进一步推进了互联网的发展。云计算模式最关键的突破就是资源使用方式的改变。html
云计算是一种融合了多项计算机技术的、以数据和处理能力为中心的密集型计算模式,它的主要技术包括虚拟化、分布式资源管理、分布式并发编程模式、信息安全等。其中,虚拟化做为云计算的核心元素,其价值日益体现:一方面,集中部署 IT 资源并抽象化以实现多用户共享,极大程度地提升了资源的利用率,下降了使用成本;另外一方面,缓解了复杂的软硬件适配问题。因此, 虚拟化技术是云计算中最关键、最核心的技术原动力。docker
在早期,主流的虚拟化技术是虚拟机,它实现了极高的隔离度和标准化, 可是这种基于硬件隔离的虚拟化方案也给宿主机资源带来了极大的压力。编程
为了解决虚拟机的种种问题,得到比虚拟机更快、更少资源的虚拟化方法, 就须要对资源进行比虚拟机更高级别的抽象。经过更细的粒度对资源进行分配和控制,是一种可行的思路。为此,Linux内核添加了新的技术,这即是众所周知的控制组(cgroup) 。经过这一技术来对服务进行运行时隔离,这种被隔离起来的运行时环境,被称为Linux容器(LXC)。安全
Docker是基于LXC容器技术的封装,Go语言开发实现。Docker与虚拟机的详细对比,可参见阮一峰老师的《Docker入门教程》,这里再也不赘述。网络
在Docker生态环境的不断完善下,Docker技术的最佳实践场景也愈来愈多,除了基础云服务平台,在CaaS、CI、CD、DevOps、微服务架构等方面也吸引了愈来愈多的目光。架构
Docker做为一种轻量级虚拟化技术,其本质是一个进程以及运行该进程所须要的依赖,而Docker内的全部进程是这个容器进程的子进程。在这种虚拟化模型下,经过资源隔离、资源控制等技术手段,来解决Docker在实现虚拟化目标过程当中遇到的种种障碍。并发
Docker容器间的资源隔离,经过Linux内核的 namespace实现。这里的资源包括:网络空间(net)、文件系统空间(mnt)、用户空间(user)、进程空间(pid)、进程通讯空间(ipc)和域名空间(uts)。这些空间的隔离需求都是虚拟化的基本需求,都很好理解,这里只简单讲一下域名空间。经过域名空间的隔离,每一个Docker就能够拥有独立的主机名和域名,在网络上能够被视做一个独立的节点,而再也不是宿主机上的一个进程。app
对 Docker 而言, 一方面要实现各容器的良好隔离, 另外一方面还须要对容器使用的资源进行限制和管理。运维
Docker 依靠 Linux 提供的 cgroup 技术来实现资源控制。cgroup 是由 Linux内核提供的一种对各进程组所使用的物理资源( 包括CPU、Memory、IO等) 进行记录、限制和隔离的技术。cgroup的实现本质上是给任务挂上钩子,当任务运行的过程当中使用某种资源时,就会触发钩子上锁附带的子系统进行检测,根据资源类别的不一样,使用对应的技术进行资源限制和优先级分配。分布式
换个角度看,Docker也是一个执行环境,一个与宿主机共享内核但与系统中其余进程资源相隔离的执行环境,这就是Docker容器。
从上图官网给出Docker架构图能够看出,这个执行环境须要提供这几个基本要素:
Docker 中有两个重要概念, 一个是镜像( Image) , 另外一个是容器( Container)。能够这么理解,镜像是容器的静态表现形式或通用的存储文件,而容器是镜像的运行态表现形态或部署环境上的文件。
之因此抽象出镜像这个概念,是为了解决LXC容器的可移植性问题,即没法经过标准化的镜像/模板实现虚拟容器的制、复制、重建。 于是 Docker 在 LXC 基础上进行了进一步封装,经过文件系统存储技术(如aufs、device mapper、overlayfs)实现镜像的分层、写时复制、联合挂载、内容寻找等关键技术特性,很好地解决了容器的快速移动和更新问题。
这里特别提一下为何把分层做为镜像的重要特性。镜像中大部分文件都是相同的(如rootfs等),若是不分层,势必存在众多的文件冗余,形成镜像大小沉重。经过分层技术,实如今不一样镜像之间共享镜像层,实现轻量级别的镜像配置,提升Docker镜像构建、存储和分发的效率,节省了用户的时间和存储空间。
回到最开始的问题:Docker是什么?这取决于看它的视角。从操做系统的视角来看,它是进程;从用户的角度来看,它是运行环境;从开发的角度来看,它是虚拟化技术。
Docker做为云计算虚拟化的一环,打开了云计算的大门。进入云计算的大门后,发现门后的新的生态系统是如此庞大。在分布式的生产使用中,容器相关的网络、存储、集群、高可用性等都是不得不面对的问题。从容器到容器云的进化应运而生。
容器云以容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布和运行分布式应用的平台。
Docker只是个单机下的容器管理工具,经过命令行进行手动管理。在企业使用场景中,容器有了跨主机(即分布式)的使用需求,并且可能容器数量庞大,拓扑关系复杂。手动操做方式的低效和不可移植性是个严重的应用障碍。Docker容器的编排和部署工具在这种背景下应运而生,Fig/Compose,Machine,Swarm,Fleet,Kubernetes都属于此类。
编排即依赖关系管理,部署则是在目标机器上按依赖关系进行动做。经过编排和部署工具,能够在一个新的环境上快速重现容器的配置和集群。
可见它们对管理对象的抽象层次愈来愈高,对Docker云的运维能力也是愈来愈强。
(完)