Docker的基础理论与关键点理解

  • 来源:新网
  • 更新日期:2018-03-28

摘要:摘要: 如果说主机时代比拼的是单个服务器的物理性能(如CPU主频和内存大小),那么云时代看中的则是利用虚拟化技术所构建的集群处理能力。

一般来说,虚拟化既可以通过硬件模拟来实现,例如 Vmware、KVM等,主要是通过虚拟硬件的方式,重新创建一个操作系统,操作系统本身并不知道当前的硬件是否真的存在,这种形式又称为操作系统级虚拟化。

而现在以Docker为代表的容积技术,为虚拟化技术提供了创新和突破。

1 (29).jpg

1、什么是Docker?

Docker 是使用容器技术实现应用虚拟化的一个开源项目。

它与传统的虚拟机技术有本质的区别,虚拟机技术虚拟出来的单个虚拟机可以部署各种应用,本质来说就是多了一台可迁移的操作系统;而Docker是一个轻量级容器,主要是针对应用进行定制,一个Docker容器封装一个应用,提供了这个应用运行的环境,所以被称为“应用的集装箱”,这样细粒度更高。

2、为什么要使用Docker?

Docker是基于操作系统的软件,他利用了操作系统已有的特性,可以实现远超传统虚拟机的轻量级虚拟化,主要有如下几点:

1、更快的交付和部署,开发人员可以通过镜像快速构建开发环境,测试人员可以通过完全相同的环境来进行测试,通过Docker部署也会变的简单高效。

2、更高效的资源利用,Docker本身对资源的消耗极低,这方面的性能传统虚拟机是无法比拟的,这样一台服务器可以构建更多的Docker应用。

3、更轻松的扩展和迁移,Docker几乎可以在任何平台上运行。

4、更简单的更新管理,通过Dockerfile,可以通过简单的修改可以实现以往大量的更新工作。

3、Docker的核心概念

使用Docker所有的时间基本都是在处理它的三大核心要素:镜像、容器、仓库。

镜像 是一个只读模版,是对容器的定义,就像Java 中 的类一样,通过类可以创建实例,实例就是容器,容器则是我们真正运行起来提供服务的应用,通过提交容器可以形成新的镜像,迁移镜像又可以在其他服务器生成容器。

仓库是指存放镜像的地方,目前Docker的仓库(Docker Hub)中存放了非常多的基础镜像文件,我们可以直接下载作为应用的基础模版。

当然我们也可以搭建我们的私人仓库,在内部网络内共享我们的镜像。

4、Docker 核心技术实现

Docker 是诞生于 Linux的一种容器化虚拟化技术,深度运用了Linux操作系统的多向底层支持技术,通过这些技术来实现 Docker 的容器级虚拟化。

1、使用Namespace实现资源隔离

命名空间(Namespace)是Linux内核的一个强大特性,利用这一特性每个容器都拥有自己独立的命名空间,运行在其中的应用就像在独立的操作系统环境中一样,容器之间资源独立、互不影响。

这种资源隔离特性隔离了主机名与域名、进程编号、内存、网络设备、文件系统、用户和用户组,虽然所有的容器都通过操作系统共享了主机的硬件资源,但是通过Namespace实现了基于操作系统级别的资源隔离,这种形式效率很高。

2、使用 Control Group 实现资源限制

控制组(Control Group)也是Linux内核的一个特性、主要对共享资源进行隔离、限制。Docker通过控制分配到容器的资源,实现了避免多个容器同事运行是对宿主机系统的资源竞争。

控制组主要提供了如下功能:

资源限制,可以将组设置为不超过设定的内存限制。 优先级,设置优先级可以让一些组优先得到更多的CPU资源。 资源审计,对每个组分配的资源进行统计。 隔离,是一个组不能看到另一个组的资源(包括进程,网络连接和文件系统)。 控制,控制挂起,重新启动等操作。 3、使用联合文件系统使镜像管理变得快速和轻量级

联合文件系统是Linux一种高性能分层文件系统,目前有多种实现技术方案,它具有两个基本特性:

每一次修改作为一次提交,并层层叠加 将不同的目录挂在到同一个虚拟文件系统下

联合文件系统是Docker实现的基础技术,Docker镜像可以通过分层来继承,例如 用户基于基础镜像制作各种不同的应用镜像,这些镜像通用了一个基础镜像,这些应用只用记录这些分层信息,从而大大提升了存储效率。

我们可以通过 docker history 命令查看一个镜像的分层组成。

将不同的目录挂在到同一个虚拟文件系统下,这样就实现了外置数据卷的挂载。

对于Docker镜像来说构成镜像的这些层是不可修改的,只读的,当Docker利用镜像启动一个容器时,将在镜像文件系统的最顶端挂载一个新的可读写层给容器,容器中内容的更新会发生在可读写层。当所操作的对象位于较深的层时,需要先复制到最上面的可读写层,当数据对象较大时,IO性能会较差,所以一般通过数据卷挂载的方式,而不是直接修改镜像内的数据就是这个原因。