在昨天的《如何让Docker基础镜像变得更小?》中镜像确实是做小了很多,但是进入镜像时发现很多linux命令已经失效了,虽然一般情况下都不怎么会进到镜像里使用命令。但是这样会导致我很不爽,于是从新制作了一个新的镜像。最新的Cnetos6.5系统镜像大小为:68.77 MB ,没错居然比昨天的还小了近40M的空间。
首先,系统环境跟昨天的一样,就是同一个系统,只是在安装的包做了一些优化。
1、配置内网源:
cat >>/etc/yum.repos.d/centos6.repo<-EOF
[c6-media]
name=CentOS-local
baseurl=http://192.168.18.53/repo6
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
EOF
2、定义环境变量,也可以不定义;
定义一个目录,此目录就是要制作成镜像的一个系统;
export centos_root=/data/centos65
export rpm_repo=http://192.168.18.53/repo6/
为了方便一会优化镜像系统,所以安装了以下几个包,其实vim可以安装,反正一会都会卸载的。
yum -y --installroot=${centos_root} install bash coreutils findutils vim-minimal rpm
共会安装69个包: Install 68 Package(s)
bash 最基本的shell环境
coreutils :常用的系统命令,如:ls、du、env等等
findutils : find命令;
3、复制系统的shell变量配置;
cp /etc/skel/.bash* /data/centos65/root/
4、切换shell环境到/data/centos65 下; 这里要确定已经切换了shell环境,不然会把系统弄坏了;
chroot ${centos_root} /bin/bash
因为上面定义了一个环境变量,所以直接使用变量;
5、清除yum安装后的rpm文件和临时文件;
rm -rf /var/cache/yum/x86_64/\$releasever/c6-media/*
6、修改时区,把一些没用的删除;
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
只保留亚洲区域的;
ls -l /usr/share/zoneinfo |grep "^d"|egrep -v "Asia"|xargs rm -rf
7、删除没用的doc里的说明文档,和man文档;因为没人会在docker容器里看文档;
rm -rf /usr/share/doc/*
rm -rf /usr/share/man/*
8、删除多余的语言支持,此操作瞬间减少90M;
rm /usr/lib/locale/locale-archive
只保留以下几个,因为上面直接把文件删除了,这里重新把需要的语言添加进去;
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
localedef -i zh_CN -f GB2312 zh_CN
localedef -i zh_CN -f GB2312 zh_CN.GB2312
localedef -i zh_CN -f GBK zh_CN.GBK
再次查看文件里的列表,就只有刚才添加的那几个了;
localedef --list-archive
卸载一些用不着的包:
rpm -e --nodeps gzip-1.3.12-19.el6_4.x86_64
rpm -e --nodeps findutils-4.4.2-6.el6.x86_64
rpm -e --nodeps openldap-2.4.23-32.el6_4.1.x86_64
rpm -e --nodeps curl-7.19.7-37.el6_4.x86_64
rpm -e --nodeps vim-minimal-7.2.411-1.8.el6.x86_64
rpm -e --nodeps sed-4.2.1-10.el6.x86_64
rpm -e --nodeps make-3.81-20.el6.x86_64
rpm -e --nodeps tzdata-2013g-1.el6.noarch
rpm -e --nodeps grep-2.6.3-4.el6.x86_64
rpm -e --nodeps less-436-10.el6.x86_64
rpm -e --nodeps info-4.13a-8.el6.x86_64
rpm -e --nodeps cracklib-dicts-2.8.16-4.el6.x86_64
rpm -e --nodeps db4-utils-4.7.25-18.el6_4.x86_64
rpm -e --nodeps ca-certificates-2013.1.94-65.0.el6.noarch
添加rpm命令的一些历史记录:
rpm --rebuilddb
最后把rpm也给卸载了;
rpm -e --nodeps rpm-4.8.0-37.el6.x86_64
说明:卸载包的时候最好看看用途,特别有这类的文件就别动了;
[root@docker usr]# rpm -ql coreutils-libs-8.4-31.el6.x86_64
/usr/lib64/coreutils
/usr/lib64/coreutils/libstdbuf.so #依赖库文件
下面是删除一些系统文件,上一次实验删除了所有导致很多命令都失效了,后面才发现,所以这里是一个重点地方;这样可以保留coreutils包里的命令都能正常使用;
因此把这一步放到最后操作:
退回到当前系统的shell环境,因为上面的目录下没有awk;
exit #退出上面chroot里的shell,回到系统的shell环境;
[root@docker ~]# abcd=`rpm -ql coreutils|grep "locale"|awk -F'/' '{print $5}'|sort|uniq -c|awk '{print $2}'`
[root@docker ~]# for i in ${abcd};do rm -rf /data/centos65/usr/share/locale/${i};done
完成上面删除后,目前系统占用空间:
[root@docker ~]# du -sh /data/centos65
77M /data/centos65
打包成docker镜像,再试试效果;
[root@docker ~]# tar -C ${centos_root} -c . | docker import - tomcat708
7fb80e99c7a214e6f85dd7d3d8ec63cb2d69dee3f3068fb27e6a2ae68876abb0
从速度明显感觉到快了,因为只有68.77MB,跟昨天的明显差好远了。
[root@docker webapps]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
tomcat3000 latest c2fc06525dcc 7 minutes ago 282.5 MB
tomcat708 latest 7fb80e99c7a2 11 minutes ago 68.77 MB
tomcat706 latest e9cc4df780e2 6 hours ago 323.5 MB
tomcat7 latest da447b9181ff 6 hours ago 323.7 MB
centos65 0605 3ab3553c7606 25 hours ago 109.8 MB
最后也是最重要的一步,验证镜像是否正常跑起来;
[root@docker webapps]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
548649820f9a tomcat3000 "/bin/bash start_tom 20 minutes ago Up 20 minutes 0.0.0.0:9991->8080/tcp s1
成功启动,并访问成功,这里我在tomcat中优化了一下配置并做了版本号隐藏处理。