一、四大对象

命名空间(Namespaces) 、控制组(Control Groups)和联合文件系统(Union File System)为底层提供的实现,Docker将其封装,开发者并不直接操作。在Docker中,另外提供出了一些软件层面的概念,是操作Docker所针对的对象。

它们分别是:镜像(Image)、容器Container)、网络Network)、数据卷Volume)。

A、镜像

镜像(Image)是其他虚拟化技术(特别是虚拟机)中常常被使用的一个概念,所谓镜像,可以理解为一个只读的文件包,其中包含了虚拟环境运行最原始文件系统的内容

Docker的镜像与虚拟机中的镜像还是有一定区别的。Docker中的一个创新是利用了AUFS作为底层文件系统实现,通过这种方式,Docker实现了一种增量式的镜像结构。

037e250270fb9df9dc17d246db0c4d8a.png

每次对镜像内容的修改,Docker都会将这些修改铸造成一个镜像层,而一个镜像其实就是由其下层所有的镜像层所组成的。每一个镜像层单独拿出来,与它之下的镜像层都可以组成一个镜像。

另外,由于这种结构,Docker的镜像实质上是无法被修改的,因为所有对镜像的修改只会产生新的镜像,而不是更新原有的镜像。

B、容器

容器(Container),用来隔离虚拟环境的基础设施,而在Docker里,被引申为隔离出来的虚拟环境。

如果把镜像理解为编程中的类,那么容器就可以理解为类的实例。镜像内存放的是不可变化的东西,当以它们为基础的容器启动后,容器内也就成为了一个「活」的空间。

用更官方的定义,Docker 的容器应该有三项内容组成:

  • 一个Docker镜像
  • 一个程序运行环境
  • 一个指令集合

C、网络

对于大部分程序来说,它们的运行都不是孤立的,而是与其他程序进行交互,绝大多数情况下指的就是数据信息的交换,网络通讯是目前最常用的一种程序间的数据交换方式了。

由于计算机网络领域拥有相对统一且独立的协议等约定,其跨平台性非常优秀,所有的应用都可以通过网络在不同的硬件平台或操作系统平台上进行数据交互。特别是在分布式云计算的时代,应用或服务间的通讯更是充分依赖于网络传输,所以自然拥有一套完善的网络体系支撑,是承载应用运行所必须的基础设施。

在Docker中,实现了强大的网络功能,不但能够十分轻松的对每个容器的网络进行配置,还能在容器间建立虚拟网络,将数个容器包裹其中,同时与其他网络环境隔离。

af7e7101d7dfdcd345be09a226a37e1b.png

另外,利用一些技术,Docker能够在容器中营造独立的域名解析环境,这使得可以在不修改代码和配置的前提下直接迁移容器,Docker会为完成新环境的网络适配。对于这个功能,甚至能够在不同的物理服务器间实现,让处在两台物理机上的两个Docker所提供的容器,加入到同一个虚拟网络中,形成完全屏蔽硬件的效果。

D、数据卷

除了网络之外,文件也是重要的进行数据交互的资源。在以往的虚拟机中,通常直接采用虚拟机的文件系统作为应用数据等文件的存储位置。然而这种方式其实并非完全安全的,当虚拟机或者容器出现问题导致文件系统无法使用时,虽然可以很快的通过镜像重置文件系统使得应用快速恢复运行,但是之前存放的数据也就消失了。

为了保证数据的独立性,通常会单独挂载一个文件系统来存放数据。这种操作在虚拟机中是繁琐的,因为不但要搞定挂载在不同宿主机中实现的方法,还要考虑挂载文件系统兼容性,虚拟操作系统配置等问题。值得庆幸的是,这些在Docker里都已经轻松的实现了,只需要简单的一两个命令或参数,就能完成文件系统目录的挂载。

简单的实现挂载,主要还是得益于Docker底层的Union File System技术。在UnionFS的加持下,除了能够从宿主操作系统中挂载目录外,还能够建立独立的目录持久存放数据,或者在容器间共享。

在Docker中,通过这几种方式进行数据共享或持久化的文件或目录,称为数据卷(Volume)。

二、Docker Engine

Docker生态已经远比它诞生之初要庞大许多,目前这款实现容器化的工具是由Docker官方进行维护的,Docker官方将其命名为Docker Engine,同时定义其为工业级的容器引擎。在Docker Engine中,实现了Docker技术中最核心的部分,也就是容器引擎这一部分。

docker daemon和docker CLI

虽然Docker Engine是一款软件,但其实算是由多个独立软件所组成的软件包。在这些程序中,最核心的就是docker daemondocker CLI

所有通常认为的Docker所能提供的容器管理、应用编排、镜像分发等功能,都集中在了docker daemon中,而之前所提到的镜像模块、容器模块、数据卷模块和网络模块也都实现在其中。在操作系统里,docker daemon通常以服务的形式运行以便静默的提供这些功能,所以也通常称之为Docker服务。

a3188890e98efb68580541c3dd8eb6c7.png

在docker daemon管理容器等相关资源的同时,它也向外暴露了一套RESTful API,能够通过这套接口对docker daemon进行操作。或者更确切的说,是通过这套RESTful API对docker daemon中运行的容器和其他资源进行管理。

7dc18e7bccff4736626d864c60343495.png

docker daemon和docker CLI所组成的,是一个标准 C/S结构的应用程序。衔接这两者的,正是docker daemon所提供的这套RESTful API。


参考:

https://draveness.me/docker

http://blog.poetries.top/2018/11/20/docker-base/

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐