封尘网

让学习成为一种习惯!

优化docker镜像造成命令丢失

在昨天的《如何让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中优化了一下配置并做了版本号隐藏处理。