5个月前 (07-16) 铁匠  Docker
文章评分 1 次,平均分 5.0

铛~铛~铛~Docker即将颠覆整个软件产业,从云计算平台到软件开发、测试,整个SDLC都会极度依赖Docker

圈子里面一定有很多讨论Docker的话题,简而言之,Docker其实只解决一个问题:

 

QA:程序无法启动!!!

DEV:不可能,我的机器上可以运行

 

大家可以慢慢体会以上对话。但无论怎样,对于已经投入 SSD 怀抱的同学们来说,要在宝贵的SSD上存放50个大小为800MB左右不等的Docker Image 是绝对不可以接受的!!但偏偏从 Docker Hub上下载到的Image,大部分都是这个数字,甚至远大于这个。看着逐渐被Docker侵蚀的磁盘空间,楼主决定给Docker文件进行大瘦身。结果发现效果很显著,请看下图

Docker 的 Image 太大,怎么变小?

颤抖吧,凡人!100MB 的 Redis 压缩到只有7MB !!!

 

首先纠正一下基本概念:

1. Docker 不是虚拟机 (切记)

2. Docker 里面的程序运行时不需要完整的操作系统!

3. CoreOS,RHEL, Ubuntu, CentOS,等等等,它们都是一个操作系统!

 

怎么做到的,基本就是以下几个步骤

1. 使用 Busybox 的 Install 命令创建一个最小化的系统环境

2. 删除不必要的各种系统文件,具体哪些是不必要的,那就得需要具体程序具体分析,楼主花了大量时间来分析每个程序,现在楼主几乎可以把这些APP的依赖项倒着背出来。

3. 将这些文件打包成 rootfs.tar

4. 使用 Dockerfile 的 ADD 指令用 rootfs.tar 生成 Image

 

楼主不码字了,开始码代码,

1. 基于 Redis 2.8.13 ,生成一个最简 rootfs.tar

FROM redis:2.8.13

# switch to root to build image
# =================================================
USER root

# prepare rootfs
# =================================================
RUN mkdir /rootfs
WORKDIR /rootfs
RUN mkdir bin etc dev dev/pts lib usr proc sys tmp
RUN mkdir -p usr/lib64 usr/bin usr/local/bin
RUN touch etc/resolv.conf
RUN cp /etc/nsswitch.conf etc/nsswitch.conf
RUN echo root:x:0:0:root:/:/bin/sh > etc/passwd
RUN echo root:x:0: > etc/group
RUN ln -s lib lib64
RUN ln -s bin sbin

# install busybox
# =================================================
ADD http://busybox.net/downloads/binaries/1.21.1/busybox-x86_64 /sbin/busybox
RUN chmod +x /sbin/busybox
RUN cp /sbin/busybox bin
RUN busybox --install -s bin

# extract redis-server
# =================================================
RUN cp /usr/local/bin/redis-server usr/bin/redis-server

# extract redis-server's dependencies
# =================================================
RUN bash -c "cp /lib/x86_64-linux-gnu/lib{m,dl,pthread,c}.so.* lib64"
RUN cp /lib64/ld-linux-x86-64.so.2 lib64/

# build rootfs
RUN tar cf /rootfs.tar .

Dockerfile

2. 使用这个 rootfs.tar 生成最小的Redis镜像文件

FROM scratch
MAINTAINER e2tox <e2tox@microbox.io>
ADD rootfs.tar /
WORKDIR /data
VOLUME /data
# Define default command.
EXPOSE 6379
ENTRYPOINT ["/usr/bin/redis-server"]
CMD ["--port", "6379"]

Dockerfile

3. 运行一下试试

docker run --rm -it -p 6379:6379 microbox/redis

这个方法生成出来的镜像和普通的redis镜像没有任何区别,尽情使用,楼主已经先行释放了30GB的空间了。

如果你还有更多的探索欲望,请移步楼主的开源项目 http://microbox.io

晚安


//下面这个css和插件后台设置的主题有关系,如果需要换样式,则需要修改以下CSS名称

  
 

除特别注明外,本站所有文章均为铁匠运维网原创,转载请注明出处来自http://www.tiejiang.org/24246.html

关于

发表评论

  1. 你好,问下就是docker官方也是用busybox构建的rootfs?可以做一下关于这个busybox的文章?除了busybox还有其他可以制作rootfs的工具吗?

    nong 评论达人 LV.1 4周前 (11-13) [0] [0]
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册

扫一扫二维码分享