docker镜像优化

        镜像的下载一般都是下载共有镜像,占用的空间比较大,这时我们可以去掉一些没有用的功能 例如可以去掉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

提取动态链接库方式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值