docker简介

docker简介

评价

美国奢饰品电商Gilt的CTO说:“使用Docker以后,突然之间,传统方式中的各种问题都消失了,我们接下来要考虑如何进一步提高软件生产效率,让软件开发更加安全和创新。这种转变太不可思议了!”


解决问题

Docker使用容器引擎解决平台依赖问题,它在每台宿主机上都启动一个Docker的守护进程,守护进程屏蔽了与具体平台相关的信息,对上层应用提供统一的接口。这样,Docker化的应用,就可以在多个平台下运行,Docker会针对不同的平台,解析给不同平台下的执行驱动、存储驱动和网络驱动去执行。

Java曾提出“Write Once, Run Anywhere”,而Docker则提出了“Build once,Run anywhere, Configure once, Run anything”。虽然,Java和Docker是为了解决不同领域的问题,但在平台移植方面却面临相同的问题,使用的解决方式也相似。

应用环境不再分解为一个个包和配置文件,而是作为一个有机的整体,这个有机的整体包含应用需要的所有软件包、配置文件和它依赖的运行环境(操作系统和依赖库),带有版本控制功能,也可以提交到中心仓库供大家共享。由于Docker的镜像中包含应用运行需要的所有包、配置和系统环境,下发镜像后不需要做任何安装配置,应用就可以直接运行,不会随着应用中包和配置数量的增加,导致安装部署变得复杂。


原理

Docker引入分层的概念。把一个应用分为任意多个层,比如操作系统是第一层,依赖的库和第三方软件是第二层,应用的软件包和配置文件是第三层。如果两个应用有相同的底层,就可以共享这些层。

假如应用A和应用B操作系统版本是一样的,它们就可以使用共享这一层,安装应用A时需要下载操作系统层,安装B应用就不用下载操作系统层,只需要下载它的依赖包和自身的软件包。

但这种共享层存在冲突问题,比如,应用A需要修改操作系统的某个配置,应用B不需要修改。如何解决这个冲突呢?我们规定层次是有优先级的,上层和下层有相同的文件和配置时,上层覆盖下层,数据以上层的数据为准。我们给每个应用一个优先级最高的空白层,如果需要修改下层的文件,就把这个文件拷贝到这个优先级最高的空白层进行修改,保证下层的文件不做任何改变。这样,从应用A的角度来看,文件已经修改成功了,而从应用B的角度来看,文件没发生任何改变。

Docker的分层和写时拷贝策略,解决了包含操作系统的应用程序比较大的问题。但我们知道,主流的虚拟机(KVM、Xen、VMWare、VirtualBox等)一般比较笨重,除了虚拟机本身运行要消耗大量的系统资源(CPU、内存等)外,启动一个虚拟机也需要花费数分钟,如何把虚拟机做到轻量化呢?以OpenVZ、VServer、LXC为代表的容器类虚拟机,是一种内核虚拟化技术,与宿主机运行在相同Linux内核,不需要指令级模拟,性能消耗非常小,是非常轻量级的虚拟化容器,虚拟容器的系统资源消耗和一个普通的进程差不多。Docker就是使用LXC(后来又推出libcontainer)让虚拟机变得轻量化。在Docker的官方仓库里,只需它有完整的文件系统和程序包,没有动态生成新文件的需求;当把它下载到宿主机上运行对外提供服务时,有可能修改文件(比如输出新日志到日志文件中),需要有空白层用于写时拷贝。Docker把这两种不同状态做了区分,分别叫作镜像(image)和容器(container)。

Docker不仅具有版本控制功能,并且还能够利用分层特性做到增量更新。每次更新就在原有版本的基础上新加一层,主机想要更新到最新版,只需要下载最新的一层即可。


posted @ 2021-03-02 17:59  Aokigahara  阅读(65)  评论(0编辑  收藏  举报