Docker 的 Image 太大,怎么变小?
铛~铛~铛~Docker即将颠覆整个软件产业,从云计算平台到软件开发、测试,整个SDLC都会极度依赖Docker。
圈子里面一定有很多讨论Docker的话题,简而言之,Docker其实只解决一个问题:
QA:程序无法启动!!!
DEV:不可能,我的机器上可以运行
大家可以慢慢体会以上对话。但无论怎样,对于已经投入 SSD 怀抱的同学们来说,要在宝贵的SSD上存放50个大小为800MB左右不等的Docker Image 是绝对不可以接受的!!但偏偏从 Docker Hub上下载到的Image,大部分都是这个数字,甚至远大于这个。看着逐渐被Docker侵蚀的磁盘空间,楼主决定给Docker文件进行大瘦身。结果发现效果很显著,请看下图

颤抖吧,凡人!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. # 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:::root:/:/bin/sh > etc/passwd
RUN echo root:x:: > 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-.so. 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
ENTRYPOINT ["/usr/bin/redis-server"]
CMD ["--port", ""]
Dockerfile
3. 运行一下试试
docker run --rm -it -p : microbox/redis
这个方法生成出来的镜像和普通的redis镜像没有任何区别,尽情使用,楼主已经先行释放了30GB的空间了。
如果你还有更多的探索欲望,请移步楼主的开源项目 http://microbox.io
晚安
Docker 的 Image 太大,怎么变小?的更多相关文章
- PS 如何把大嘴变小嘴
Photoshop整容教程:让MM美唇大嘴变小嘴 2009-06-17 14:15作者:佚名出处:天极网软件频道责任编辑:王健 下面就开始实际操作了. 1.首先从Photosh ...
- 部署的docker image总是太大,怎么办?
sudo docker images REPOSITORY TAG IMAGE ID CREATED ...
- Docker目录/var/lib/docker/containers文件太大
Docker在不重建容器的情况下,日志文件默认会一直追加,时间一长会逐渐占满服务器的硬盘的空间,内存消耗也会一直增加,本篇来了解一些控制日志文件的方法. 查出占用磁盘较大的文件 Docker 的日志文 ...
- PDF太大怎么办?缩小PDF的4种常用方法
PDF太大怎么变小?我们在平时学习或生活中经常需要上传或提交一些资料,现在网站都是默认需要提交PDF格式的电子文档,有时提交资料会提示超过系统大小,如何才能使PDF缩小呢? 一.在线压缩 首先搜索sp ...
- CSS3动画@keyframes图片变大变小颜色变化
在我做公司官网的时候也会帮着写一些游戏的静态页,今天产品要求为了突出一个按钮,他要有颜色的变化而且要变大变小,然后我就在网上搜了下呼吸灯和其他的案例,写了个小damo,看着还有些魔性嘞. html: ...
- 【技术贴】xp任务栏字体变大变小
今天远程到服务器上,发现任务栏字体变小了,百度了很久,发现百度就是个渣渣,什么答案都搜不到.就自己摸索了一下. 方法一: 桌面右击属性-外观-字体大小, 下拉匡 方法二 :桌面右击[属性]-[外观]- ...
- 使用Docker容器的十大误区
转自:http://www.dockone.io/article/1264 对于用户来说,可能一开始在不了解的情况下会对容器报以拒绝的态度,但是在尝到容器的甜头.体验到它的强大性能之后,相信大家最终是 ...
- <实训|第十天>从底层解释一下U盘内存为什么变小的原因附数据恢复的基本原理
[root@localhost~]#序言 我们平时不论是买一个U盘硬盘,或者自己在电脑上创建一个分区,大小总是比我们创建的要小一点,有些人会说,这个正常啊,是因为厂家规定的1M=1000k,真正的是1 ...
- [word]2010中插入公式自动编号并且公式不自动缩小/变小
要实现在word2010中插入公式自动编号,就要用到自动图文集功能,具体操作如下: 1.先制定制表位位置:单击一个空白段落,然后双击标尺线的底部:这会激活"制表位"对话框,如图所示 ...
随机推荐
- 【JS】FOR循环通关只循环一次length提高性能
问题来源于jqueryAPI 原文: Iteration An array has a length property that is useful for iteration: for ( var ...
- 从AutoCAD和.NET开始
引自并参考Kean's blog:http://through-the-interface.typepad.com/through_the_interface/2006/07/getting_star ...
- Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules的解决办法
前提:用eclipse做项目,新建“Dynamic Web Project”时,“Dynamic web module version”栏里选了3.0版本,部署项目的时候出现了如题的错误. 解决办法: ...
- web view调h5的方法死活调不到
(WebViewJavascriptBridge注册方法都能调用,只有callhandlename时无论如何也没响应)这个问题真是纠缠我好久了 webview评论区刷新问题终于找到原因了 ,我试着把咨 ...
- 自己瞎捣腾的Win7下Linux安装之路-----图例篇
写在前面 网上很多这方面的教程,我也是参考他们的文章和一些书籍才弄成功.没啥创新性,只为记录下来,以供自已理解和以后复习. 所谓工欲善其事,必先利其器.俺想学习Linux,当然是要先装一个Linux( ...
- CE 内存申请
char ch_ReadByte='H'; char *ptr_OneLineData; unsigned ); if ((ptr_OneLineData = (char *)malloc(bufsi ...
- 3、C#入门第3课
1.c#中一个解决方案 里面两个程序 怎么一个启动另一个? 我一个解决方案下,有两个工程,我想让A工程在适当时候,启动B工程,比如A中有个按钮,一点,B工程就启动了. System.Diagnosti ...
- 嵌入式系统添加无线wifi模块
开发环境:fl2440开发板,linux3.0内核,交叉编译器路径/opt/buildroot-2011.11/arm920t/usr/bin/arm-linux-,无线网卡RT3070 平时开发板联 ...
- 自定义HttpModule的一些经验--配置篇
http://www.cnblogs.com/MyaSky/articles/2134954.html 自定义HttpModule的一些经验--配置篇 自定义web模块,需继承System.Web.I ...
- QT实现HTTP JSON高效多线程处理服务器
QT实现HTTP JSON高效多线程处理服务器 Legahero QQ:1395449850 现在一个平台级的系统光靠web打天下是不太现实的了,至少包含APP和web两部分,在早期APP直接访问we ...