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 

晚安

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM