第一部曲:初选Docker
老的项目还需要开发维护,但新的硬件已经很难安装上旧的Linux OS。实际上,我们平时使用这个老系统,也仅是用来编译版本而已,是一个非常受限应用场合,不会很频繁地使用。那么可选的一个部署途径,就是安装虚拟机,使用上慢点就慢点吧。
但是,虚拟机是安装Docker类型的虚机mkimage-yum.sh,还是Virtualbox类型的虚机呢?
对于这个问题,我思考、犹豫了好几天,总觉得想不透彻。最后形成一个大致想法目标是想让镜像尽可能保持不变,以利于后期重复使用,而虚机又在使用中比较方便,符合平时使用习惯。
从镜像保持不变这个角度分析,docker的数据卷映射与Virtualbox的挂载共享目录都有自己的解决方案,但docker对于镜像不变的约束力,更是强大了很多!粗略验证了下virtualbox的共享目录的办法,操作上还是比较繁琐的和不自由,而docker的数据卷映射则自由的多。加上对比下,虚拟机的启动速度,docker又拥有无与伦比的优势,几乎是秒起,就像执行普通的shell命令一样;再加上docker+数据卷映射,几乎可以无缝地切换和编译。
那么,就选择Docker虚拟机这条道走到黑吧!!!
第二部曲:如何制作基础镜像base image
碰到的第二个拦路虎,就是如何制作一个docker的base image。虽然,docker hub提供了常见的CentOS、Ubuntu等基础镜像,但是,我用到的发行版是CentOS下游定制发行版,还是不能直接用docker hub上的CentOS基础镜像,特别是编译代码使用场合。某些一知半解的人,总想尽可能的环境一样,也懒得给他们多费口舌,那么,就剩下靠自己制作基础镜像了!
在网上研究了Docker制作基础镜像的方法,有不少误导,最后,发现只有一个是正途,其它可能都有点旁门左道了。。。,所以,觉得很有必要总结下,以利于扩大正能量。
+ 旁门左道A:对安装镜像ISO中的资料进行tar,然后导入docker。此种解决方法,误解了安装镜像ISO。就像在石钟山山上择石一二扣之,其声响亮,故曰石钟山一样。ISO安装镜像提供的是OS安装文件,而非可以运行的OS环境。而搜索引擎上搜索从安装ISO镜像如何制作docker镜像,经常遇到这些似是而非的网文。
+ 旁门左道B:利用同种OS环境的虚拟机或物理机,在环境里面进行打包镜像,而此种方法在docker官网中是禁止使用的。虽然,可能在实际中可以使用,但这种环境所带来的硬件依赖信息,还是会比较多地进入打包镜像中,污染较大。
在Docker官网中建议,对于CentOS体系的操作系统制作基础镜像,建议使用
febootstrap
方式或
yum
方式进行docker镜像打包。我所拥有的CentOS下游发行版,可能没有那么友好支持febootstrap,但是,考虑到此ISO镜像是能够支持作为yum安装包源的,那么,使用yum方式从iso镜像制作docker基础镜像base image将是可行的。
理论上推演很顺畅!
正途:
https://github.com/moby/moby/blob/master/contrib/mkimage-yum.sh
第三部曲:还有点小绕绕。
从
mkimage-yum.sh
脚本中的代码和默认值,可以看出脚本制作基础镜像所要求的操作系统环境,最好与打包镜像所对应的操作系统是一致的。
但是,很可惜,对于这点不能直接满足。
在mkimage-yum的脚本中依赖dockcer操作,而docker对于最低的Linux内核是有要求的,我们要打包镜像OS的Linux内核是不满足的。那么,还是有两种方法,一是将脚本操作步骤分开来做,产生tar包与docker导入和验证分开;二是可以选择支持docker的环境,进行交叉制作,就像
交叉编译
一样。mkimage-yum脚本也是支持此种使用方法,通过特殊配置yum的配置文件,以及二次修改脚本代码变更脚本中yum命令携带定制参数
–disableplugin=fastestmirror –disablerepo=\* –enablerepo=C6-base
,将yum安装所依赖的信息,按照打包的镜像OS环境进行配置。
最后,制作的Docker基础镜像base image,可以在ubuntu/centos两个系统上运行,如丝般顺滑:)
爱Docker,初来自不经意的选择;相识于懵懂;最后,爱她,源于她和你相知!