由于Docker项目是由go语言编写,根据我前一段时间的研究思路的整理,我大致划分来一下我的研究思路。
我研究了Docker的架构模式如下:
研究了该架构后我初步了解了docker背后的容器管理技术(http://www.cnblogs.com/plxx/p/5483100.html),Docker 是通过调用libcontainer这一对lxc封装好的容器管理接口来实现对Docker容器的管理。libcontainer目前已经整合CRIU项目基于检查点的checkpoint/restore的保存恢复的解决方案,仅就libcontainer而言已经可以实现容器的热迁移功能。然而对于docker容器,由于criu的解决方案并不能支持nested namespace的热迁移,故docker容器在迁移后,docker daemon与docker容器之前的父子关系将无法恢复,使得迁移后的docker容器脱离了docker daemon的控制,docker无法对该容器进行任何操作。
根据上述分析,Docker容器热迁移目前的主要问题就是在与当前CRIU项目的解决方案不能支持nested namespace(嵌套命名空间)的迁移,虽然libcontainer自身可以实现热迁移,可无法维持Docker容器的父子关系。
我对该问题进行初步的思考,对症下药,既然要Docker原生支持容器的热迁移,我需要从Docker的源码进行解析,Docker是一款基于Go语言开发的工具,所以我需要了Go语言的基础知识来对Docker源码进行解读。进一步充分了解namespace的机制,解析nested namespace 的迁移的难点所在。最后通过在Docker execdriver层完成对libcontianer的热迁移接口调用并可以维持docker容器内部的嵌套父子关系。
由此开始进入Go语言的基础知识的学习~