优化docker镜像造成命令丢失


        在昨天的《如何让Docker基础镜像变得更小?》中镜像确实是做小了很多,但是进入镜像时发现很多linux命令已经失效了,虽然一般情况下都不怎么会进到镜像里使用命令。但是这样会导致我很不爽,于是从新制作了一个新的镜像。最新的Cnetos6.5系统镜像大小为:68.77 MB ,没错居然比昨天的还小了近40M的空间。

       首先,系统环境跟昨天的一样,就是同一个系统,只是在安装的包做了一些优化。

1、配置内网源:

  1. cat >>/etc/yum.repos.d/centos6.repo<-EOF 
  2. [c6-media]     
  3. name=CentOS-local     
  4. baseurl=http://192.168.18.53/repo6     
  5. gpgcheck=0     
  6. enabled=1     
  7. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 
  8. EOF 

 

2、定义环境变量,也可以不定义;

#定义一个目录,此目录就是要制作成镜像的一个系统;

  1. export centos_root=/data/centos65          
  2. export rpm_repo=http://192.168.18.53/repo6/  

 

#为了方便一会优化镜像系统,所以安装了以下几个包,其实vim可以安装,反正一会都会卸载的。

  1. 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变量配置;

  1. cp /etc/skel/.bash* /data/centos65/root/ 

4、切换shell环境到/data/centos65 下; 这里要确定已经切换了shell环境,不然会把系统弄坏了;

  1. chroot ${centos_root} /bin/bash  

 #因为上面定义了一个环境变量,所以直接使用变量;

5、清除yum安装后的rpm文件和临时文件;

  1. rm -rf /var/cache/yum/x86_64/\$releasever/c6-media/* 

6、修改时区,把一些没用的删除;

  1. cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
  2.  
  3. #只保留亚洲区域的; 
  4. ls -l /usr/share/zoneinfo |grep "^d"|egrep -v "Asia"|xargs rm -rf 

 

7、删除没用的doc里的说明文档,和man文档;因为没人会在docker容器里看文档;

  1. rm -rf /usr/share/doc/* 
  2. rm -rf /usr/share/man/* 

8、删除多余的语言支持,此操作瞬间减少90M;

  1. rm /usr/lib/locale/locale-archive 

#只保留以下几个,因为上面直接把文件删除了,这里重新把需要的语言添加进去;

  1. localedef -i en_US -f UTF-8 en_US.UTF-8  
  2. localedef -i zh_CN -f UTF-8 zh_CN.UTF-8  
  3. localedef -i zh_CN -f GB2312 zh_CN  
  4. localedef -i zh_CN -f GB2312 zh_CN.GB2312  
  5. localedef -i zh_CN -f GBK zh_CN.GBK  

#再次查看文件里的列表,就只有刚才添加的那几个了;

  1. localedef --list-archive  

卸载一些用不着的包:

  1. rpm -e --nodeps gzip-1.3.12-19.el6_4.x86_64 
  2. rpm -e --nodeps findutils-4.4.2-6.el6.x86_64 
  3. rpm -e --nodeps openldap-2.4.23-32.el6_4.1.x86_64 
  4. rpm -e --nodeps curl-7.19.7-37.el6_4.x86_64 
  5. rpm -e --nodeps vim-minimal-7.2.411-1.8.el6.x86_64 
  6. rpm -e --nodeps sed-4.2.1-10.el6.x86_64 
  7. rpm -e --nodeps make-3.81-20.el6.x86_64 
  8. rpm -e --nodeps tzdata-2013g-1.el6.noarch 
  9. rpm -e --nodeps grep-2.6.3-4.el6.x86_64 
  10. rpm -e --nodeps less-436-10.el6.x86_64 
  11. rpm -e --nodeps info-4.13a-8.el6.x86_64 
  12. rpm -e --nodeps cracklib-dicts-2.8.16-4.el6.x86_64 
  13. rpm -e --nodeps db4-utils-4.7.25-18.el6_4.x86_64 
  14. rpm -e --nodeps ca-certificates-2013.1.94-65.0.el6.noarch 

 

#添加rpm命令的一些历史记录:

  1. rpm --rebuilddb 

最后把rpm也给卸载了;

  1. 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;
 
  1. exit  #退出上面chroot里的shell,回到系统的shell环境; 
  2.  
  3. [root@docker ~]# abcd=`rpm -ql coreutils|grep "locale"|awk -F'/' '{print $5}'|sort|uniq -c|awk '{print $2}'` 
  4. [root@docker ~]# for i in ${abcd};do rm -rf /data/centos65/usr/share/locale/${i};done 
 
 
完成上面删除后,目前系统占用空间:
 
  1. [root@docker ~]# du -sh /data/centos65 
  2. 77M /data/centos65 

打包成docker镜像,再试试效果;

  1. [root@docker ~]# tar -C ${centos_root} -c . | docker import - tomcat708 
  2. 7fb80e99c7a214e6f85dd7d3d8ec63cb2d69dee3f3068fb27e6a2ae68876abb0 

从速度明显感觉到快了,因为只有68.77MB,跟昨天的明显差好远了。

  1. [root@docker webapps]# docker images 
  2.  
  3. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE 
  4. tomcat3000          latest              c2fc06525dcc        7 minutes ago       282.5 MB 
  5. tomcat708           latest              7fb80e99c7a2        11 minutes ago      68.77 MB 
  6. tomcat706           latest              e9cc4df780e2        6 hours ago         323.5 MB 
  7. tomcat7             latest              da447b9181ff        6 hours ago         323.7 MB 
  8. centos65            0605                3ab3553c7606        25 hours ago        109.8 MB 

最后也是最重要的一步,验证镜像是否正常跑起来;

  1. [root@docker webapps]# docker ps 
  2. CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES 
  3. 548649820f9a        tomcat3000          "/bin/bash start_tom   20 minutes ago      Up 20 minutes       0.0.0.0:9991->8080/tcp   s1    

成功启动,并访问成功,这里我在tomcat中优化了一下配置并做了版本号隐藏处理。