利用Squash功能 (1.13 后新增的试验功能)
1、Docker Daemon 进程启动前,要将 experimental 参数设置为 true;
docker v20版本是通过修改/etc/docker/daemon.json
开启:
{
"experimental": true
}
2、编写的dockerfile没有与之前没有差异
3、编译时,增加--squash
参数
docker build --squash -t xxx:xxx .
squash功能一方面压缩了镜像的大小,另一方面保存了镜像的构建信息,但是该方法属于实验特性,需要谨慎使用。
使用较小的基础镜像
- 系统镜像使用Ubuntu、CentOs、Alpine、scratch、buybox等
- 许多官网镜像都提供slim版本
上述方式的缺点在于,基础镜像由于体积小,可能会缺失我们需要的依赖或工具,需要逐步补充,耗费的工作量较大。
Dockerfile指令优化
指令拼接
定义 Dockerfile 时,多次使用RUN
指令会生成多个镜像层,使得镜像臃肿。应该将多个指令拼接合并为一个RUN
(通过运算符&&
和/
来实现).
指令优化
如果在 RUN 命令中执行 apt
、apk
或者 yum
,可以借助指令自身的配置选项减少镜像层数量及镜像大小。
- 执行
apt-get install -y
时增加选项--no-install-recommends
,可以不用安装建议性(非必须)的依赖,也可以在执行apk add
时添加选项--no-cache
达到同样效果; - 执行
yum install -y
时候, 同时安装多个工具,比如yum install -y gcc gcc-c++ make
; - 组件的安装和清理要串联在一条指令里面,如
apt-get install zip && rm -rf /var/cache/apk/*
利用export和import指令
# 启动一个容器
docker run -d --name test test:2.0
# 利用export和import将容器导出变为镜像
docker export test | docker import - test:3.0
该方法也能有效降低镜像大小,但会丢失镜像的构建信息。