镜像的下载一般都是下载共有镜像,占用的空间比较大,这时我们可以去掉一些没有用的功能 例如可以去掉vim 功能 用vi就可以 ,以此来精简镜像大小,优化过的镜像既节省了空间,有能省带宽,加快了传输的速度,等。
例如网易推出蜂巢Logo镜像,大小只有585字节
镜像层(Layers)
首先我们了解一下镜像层,镜像层是依赖一系列的底层技术,比如文件系统(filesystems)、写时复制(copy-on-write)、联合挂载、“(union mounts)等。
在构建dockerfile的时候,dockerfile中的每一条指令会生成一个镜像层,镜像层的多少,会影响镜像的整体大小
[root@localhost ~]# mkdir nginx
[root@localhost ~]# cd nginx/
[root@localhost nginx]# docker pull nginx
#默认会下载最新版本的nginx镜像[root@localhost nginx]# vim Dockerfile
FROM nginx:latest
#指定基础镜像来源,如果本地没有指定的镜像,会在网上下载
RUN mkdir /tmp/test
RUN dd if=/dev/zero of=/tmp/test/file bs=1M count=100
#/dev/zero 取之不尽
#/dev/null 垃圾桶 黑洞
RUN rm /tmp/test/file#基于一个官方nginx镜像,只有140MB
#创建一个文件(/tmp/test)和一个文件(file),并为该文件分配了100M大小
#在把这个文件删除,实际上相当一什么都没有做
[root@localhost nginx]# docker build -t nginx:test .
[root@localhost nginx]# docker images
#这时没想到镜像大小到了(245MB)
[root@localhost nginx]# docker history nginx:test
#查看刚才新建镜像的层级
优化镜像
优化镜像,可以从这五个点来入手
基础镜像
层级尽量
去除不必要的功能和垃圾文件
复用镜像层
分阶段构建
以开源的初始redis为例
1.构建初始redis镜像
docker pull ubuntu:trusty
cd
mkdir redis
cd redis
vim Dockerfile
FROM ubuntu:trusty ENV VER 3.0.0 ENV TARBALL http://download.redis.io/releases/redis-$VER.tar.gz # ==> Install curl and helper tools... RUN apt-get update RUN apt-get install -y curl make gcc # ==> Download, compile, and install... RUN curl -L $TARBALL | tar zxv WORKDIR redis-$VER RUN make RUN make install #... # ==> Clean up... WORKDIR / RUN apt-get remove -y --auto-remove curl make gcc RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /redis-$VER #... CMD ["redis-server"]
[root@localhost redis]# docker build -t redis:test-1 .
[root@localhost redis]# docker images redis:test-1
更换基础镜像
构建时可以选用更小的基础镜像,常用的Linux系统镜像一般有centos、debian、ubuntu其中debian更轻量
docker pull debian
将基础镜像替换为debian:jessie
优化Dockerfile
cd redis
vim Dockerfile
串联Dockerfile指令
Docker中的RUN指令&&和\指令串联在一起使用,也会达到精简镜像的效果
mkdir -pv /redis/debian
cd /redis/debian
vim Dockerfile
FROM debian:jessie ENV VER 7.0.2 ENV TARBALL http://download.redis.io/releases/redis-$VER.tar.gz RUN echo "==> Install curl and helper tools..." && \ apt-get update && \ apt-get install -y curl make gcc && \ \ echo "==> Download, compile, and install..." && \ curl -L $TARBALL | tar zxv && \ cd redis-$VER && \ make && \ make install && \ echo "==> Clean up..." && \ apt-get remove -y --auto-remove curl make gcc && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /redis-$VER #... CMD ["redis-server"]
docker build -t redis:test3 .
docker images|grep test
#查看镜像大小
镜像压缩
docker run -d redis:test3
docker export 容器id | docker import - redis:test-4
docker images|grep test
这种方式精简会比较麻烦,而且过程中会丢失镜像有的一些信息
docker-squash命令更简单方便不会丢失原有的镜像自带信息
官网:https://github.com/jwilder/docker-squash
[root@localhost ~]# wget https://github.com/jwilder/docker-squash/releases/download/v0.2.0/docker-squash-linux-amd64-v0.2.0.tar.gz
[root@localhost ~]#tar xf docker-squash-linux-amd64-v0.2.0.tar.gz
[root@localhost ~]# mv docker-squash /usr/local/bin/
[root@localhost ~]# chmod +x /usr/local/bin/docker-squash压缩操作
使用最精简的base image
使用scrath或者busybox作为基础镜像
alpine镜像没有库文件
scrath:一个空镜像
busybox:只有1~5M大小
Distroless:没有shell,二进制文件组成,优点:比较安全 缺点:不好调试
docker pull busbox
docker run -it busybox /bin/sh