当前位置:   article > 正文

docker镜像优化

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

  1. FROM ubuntu:trusty
  2. ENV VER 3.0.0
  3. ENV TARBALL http://download.redis.io/releases/redis-$VER.tar.gz
  4. # ==> Install curl and helper tools...
  5. RUN apt-get update
  6. RUN apt-get install -y curl make gcc
  7. # ==> Download, compile, and install...
  8. RUN curl -L $TARBALL | tar zxv
  9. WORKDIR redis-$VER
  10. RUN make
  11. RUN make install
  12. #...
  13. # ==> Clean up...
  14. WORKDIR /
  15. RUN apt-get remove -y --auto-remove curl make gcc
  16. RUN apt-get clean
  17. RUN rm -rf /var/lib/apt/lists/* /redis-$VER
  18. #...
  19. 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

  1. FROM debian:jessie
  2. ENV VER 7.0.2
  3. ENV TARBALL http://download.redis.io/releases/redis-$VER.tar.gz
  4. RUN echo "==> Install curl and helper tools..." && \
  5. apt-get update && \
  6. apt-get install -y curl make gcc && \
  7. \
  8. echo "==> Download, compile, and install..." && \
  9. curl -L $TARBALL | tar zxv && \
  10. cd redis-$VER && \
  11. make && \
  12. make install && \
  13. echo "==> Clean up..." && \
  14. apt-get remove -y --auto-remove curl make gcc && \
  15. apt-get clean && \
  16. rm -rf /var/lib/apt/lists/* /redis-$VER
  17. #...
  18. 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

提取动态链接库方式

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号