Docker容器关键技术
1 DockerDaemon
技术人员一般会将Docker的技术堆栈分成好几层,用来进一步阐明Docker技术本身。相对于整个技术堆栈而言,Docker容器OS层的关键技术显得尤为重要。要了解Docker,首先看看Docker总架构图,如图5-4所示。
由图可知,用户可以从DockerClient建立与DockerDaemon的通信连接,发送容器的管理请求,这些请求最终被DockerServer接受,而请求处理则交给Engine处理。而在与系统调用方面,Docker则是通过更底层的工具LibContainer与内核交互。Libcontainer是真正的容器引擎,是容器管理的解决方案,涉及大量的Linux内核方面的特性,如namespace、cgroups、apparmor等。LibContainer很好地抽象了这些特性,提供接口给Dockerdaemon。
用户执行启动容器的命令后,一个DockerContainer实例就运行起来了,这个实例拥有隔离的运行环境、网络空间以及配置好的受限资源。DockerDaemon是一个常驻在后台的系统进程,实际上就是驱动整个Docker功能的核心引擎。简单地说,DockerDaemon实现的功能就是接收客户端发来的请求,并实现请求所要求的功能,同时针对请求返回相应的结果。在功能的实现上,因为涉及容器、镜像、存储等多方面的内容,实现复杂,涉及多个模块的交互。
2 Docker容器
Container(容器)是整个Docker技术堆栈的核心内容,相对传统虚拟化,这项基础技术在性能上给Docker带来了极大优势。DockerDaemon通过LibContainer对容器运行实例实现了生命周期的管理,配置信息的设置、查询、监控以及通信等丰富的功能。概念上来说,容器诠释了Docker提倡的集装箱的概念:存放任何货物,通过货轮运输到各个不同的码头。而运输、装载、卸载集装箱的码头都不用关心集装箱中的货物是什么,这种标准的应用封装形式真正意义上打破了原有云计算世界中虚拟机镜像格式的束缚,极大地方便开发人员的工作。Docker容器作为一个集装箱,可以安装指定的软件和库,以及任意环境配置。当开发和运维人员在部署和管理应用的时候,可以直接把应用容器运行起来,不用关心容器里是什么。容器技术不是一个新的技术,但是通过Docker的神奇封装,与集装箱概念联系起来,开创了云计算领域的新的时代,并迅速推广到全世界。
3 Docker镜像
运行中的容器实例,提供了一个完整的、隔离状态的运行环境,与之相对应的DockerImage技术,则是整个运行环境的静态体现。相比较传统虚拟机繁杂、多样的镜像格式而言,Docker的镜像要轻量化很多,并且简单很多。从技术层面俯视,这就是一个可以定制的RootFS。Docker公司在镜像上的另外一个创新就是分层复用。其在一些实际场景中非常有用,大部分的镜像需要相同的OS发行版环境,而许多文件的内容都是一致的,因此复用这些基础文件将会减少很多制作镜像时候的工作。DockerImage做到了这点,采用UnionFS的特性,通过一个基础版本的分层机制,不断开发新的版本堆叠在上面即可,减少磁盘和内存的开销。开发人员通常会使用Dockerfile来创建DockerImage,这是一个定制镜像内容的配置文件,同时也能在内容上体现层级关系的建立关系。可以使用dockercommit这样的命令行方式来手动修改镜像内容并提交生成新的镜像。
4 DockerRegistry
有了DockerImage之后,就需要考虑镜像仓库了,DockerRegistry就是这样的功能设定。在Docker的世界中,开发人员可以很容易地从这里下载镜像,Registry通常被部署在互联网服务器或者云端。在DockerImage的传输过程,Registry就是中转站。例如,在公司里,我们可以把一个软件的运行环境制作成为镜像,上传到Registry中,然后就可以很方便地在可以接入到网络的地方从Registry上把镜像下载下来并运行,当然这些操作都是和Docker结合在一起的,使用者甚至不会感知到Registry的存在,简单的命令行就可以显示所有的操作了。Docker公司提供的官方镜像Registry叫做DockerHub,提供了大部分的常用软件和OS发行版的官方镜像,同时也存有无数的个人用户提供的镜像文件。Registry本身也是一个开源项目,任何开发人员可以在下载该项目后,自己部署一个Registry,许多企业都会选择独立部署DockerRegistry并且做二次开发,或者购买更强大的企业版DockerHub。