zoukankan      html  css  js  c++  java
  • 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

     1 FROM redis:2.8.13
     2 
     3 # switch to root to build image
     4 # =================================================
     5 USER root
     6 
     7 # prepare rootfs
     8 # =================================================
     9 RUN mkdir /rootfs
    10 WORKDIR /rootfs
    11 RUN mkdir bin etc dev dev/pts lib usr proc sys tmp
    12 RUN mkdir -p usr/lib64 usr/bin usr/local/bin
    13 RUN touch etc/resolv.conf
    14 RUN cp /etc/nsswitch.conf etc/nsswitch.conf
    15 RUN echo root:x:0:0:root:/:/bin/sh > etc/passwd
    16 RUN echo root:x:0: > etc/group
    17 RUN ln -s lib lib64
    18 RUN ln -s bin sbin
    19 
    20 # install busybox
    21 # =================================================
    22 ADD http://busybox.net/downloads/binaries/1.21.1/busybox-x86_64 /sbin/busybox
    23 RUN chmod +x /sbin/busybox
    24 RUN cp /sbin/busybox bin
    25 RUN busybox --install -s bin
    26 
    27 # extract redis-server
    28 # =================================================
    29 RUN cp /usr/local/bin/redis-server usr/bin/redis-server
    30 
    31 # extract redis-server's dependencies
    32 # =================================================
    33 RUN bash -c "cp /lib/x86_64-linux-gnu/lib{m,dl,pthread,c}.so.* lib64"
    34 RUN cp /lib64/ld-linux-x86-64.so.2 lib64/
    35 
    36 # build rootfs
    37 RUN tar cf /rootfs.tar .
    Dockerfile

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

    1 FROM scratch
    2 MAINTAINER e2tox <e2tox@microbox.io>
    3 ADD rootfs.tar /
    4 WORKDIR /data
    5 VOLUME /data
    6 # Define default command.
    7 EXPOSE 6379
    8 ENTRYPOINT ["/usr/bin/redis-server"]
    9 CMD ["--port", "6379"]
    Dockerfile

    3. 运行一下试试

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

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

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

    晚安

  • 相关阅读:
    JavaScript 判断 URL
    AppCan 文件上传实例
    IIS6.0手动安装与配置asp.net2.0全过程
    轻松搭建一个Windows SVN服务器
    IIS6.0上某些文件类型不能下载
    JavaScript 数组转字符串,字符串转数组
    百度地图API 应用实例
    IIS7.5 下:HTTP 错误 404.17 Not Found 请求的内容似乎是脚本 解决方法
    SQL 交集 差集 并集 笛卡尔积 应用实例
    Win7 64位 IIS未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项
  • 原文地址:https://www.cnblogs.com/e2tox/p/4027756.html
Copyright © 2011-2022 走看看