所有文章

手工构建基础镜像

前段时间,老大说要把目前正在开发的产品放在Docker容器中跑,而且容器的系统版本必须跟开发一致(CentOS6.5),然后我跑去Docker Hub上找一圈,发现Centos官方并没有提供这个版本!纳尼??开什么玩笑?好吧,然后又搜了一圈,找到了下面这个链接,解释了为什么没有CentOS6.5: https://github.com/CentOS/sig-cloud-instance-images/issues/13 ,大意是说,官方觉得没必要用CentOS6.5,因为有更高的版本能可以用,并且修复了低版本中的Bug,如果他们提供了6.5的版本,那可能还需要提供6.4,6.3等等,所以直接就不提供低版本了。

好吧,但最终要用哪个版本不是我说了算的,然后上Docker官网看看怎么手动构建自已的基础镜像,不幸的是,它虽提供了构建CentOS的基础镜像,但并不能构建出6.5版本的,于是乎又是一顿google,最终还是找到一个比较靠谱的文章,英文,且简略,地址我写在本文最后的部分,下面是我结合自已的需求构建镜像的全部过程。

需要的环境

  1. 一个正常运行的CentOS6.5系统,这里我用的是我们产品的开发环境系统
  2. 可以联外网,因为要下载东西3. 一个CentOS6.5的yum源,这里我用的是一个ISO文件直接mount到本地就可以用了

开始构建

安装febootstrap与xz

yum install -y febootstrap xz

挂载自己的repo镜像,以下是一个例子:

mount -t iso9660 -o loop /data/CentOS-6.5-x86_64-DVD.iso /data/iso

另注:如果你没有这样的iso文件,可以去CentOS官方下载一个,下载这个就行:CentOS-6.5-x86_64-minimal.iso,然后按以上方式挂载。 当然,如果你有自已的yum源服务器也可以,那它应该长这个样子:http://your.host.com/repodir,或者这样子:file:///var/www/html/repodir
开始生成镜像文件夹

febootstrap -i bash -i coreutils -i tar -ai bzip2 -i gzip \
-i vim-minimal -i wget -i patch -i diffutils -i iproute \
-i yum centos6.5 centos6.5-base-image file:///data/iso

说明:
file:///data/iso:自己的repo源
centos6.5:镜像版本
centos6.5-base-image:文件夹名字

在文件夹内创建三个文件

touch centos6.5-base-ks/etc/resolv.conf touch centos6.5-base-ks/sbin/init echo -e 'NETWORKING=yes\nHOSTNAME=build' /etc/sysconfig/network

打包文件夹

tar --numeric-owner -Jcpf centos6.5-base.tar.xz -C centos6.5-base-image . 

把打包好的文件发送到Docker环境下,并导入到Docker

scp centos6.5-base.tar.xz docker.host.com:/root

然后去对应的机器上(docker.host.com),把包导入到Docker,使之成为一个Docker镜像

cat centos6.5-base.tar.xz | sudo docker import - kxdmmr/centos6.5-base:v1 

启动镜像

docker run -dti --name build -h build \ kxdmmr/centos6.5-base:v1 bash 

验证版本

docker exec -ti build cat /etc/redhat-release

大功告成,现在可以往里面加自己需要的服务了!

参考资料

  1. (http://qiita.com/hnakamur/items/8e3136488fcfe763802c)
  2. (https://github.com/CentOS/sig-cloud-instance-images/issues/13)
  3. (https://github.com/docker/docker/blob/master/contrib/mkimage-yum.sh)

编写日期:2017-01-07