docker save镜像时进行gzip压缩方式
作者:学亮编程手记
文章介绍了三种Docker镜像压缩方法:管道压缩(推荐,使用gzip/pigz,速度快)、xz压缩(高压缩比但慢)、及先保存再压缩(不推荐,占空间),建议日常用管道gzip,传输用xz,避免直接保存未压缩文件
可以在 docker save
过程中进行压缩。你有几种方法可以实现,从最简单到最高压缩比,具体如下:
方法一:使用管道直接压缩(最推荐、最常用)
这是最经典和高效的方法。它将 docker save
输出的 tar 流直接通过管道传递给压缩工具,无需产生巨大的中间临时文件。
命令格式:
docker save <镜像名或ID> | gzip > <输出文件名.tar.gz>
实际操作示例:
# 压缩单个镜像 docker save my-app:latest | gzip > my-app-latest.tar.gz # 压缩多个镜像(Docker允许save多个镜像到一个文件) docker save my-app:latest redis:alpine | gzip > my-app-and-redis.tar.gz
解压并加载:
要加载这个被压缩的镜像,你需要先解压,或者使用管道反向操作:
# 方法A:先解压,再加载(两步) gunzip -c my-app-latest.tar.gz | docker load # 方法B:使用管道一步到位(更优雅) zcat my-app-latest.tar.gz | docker load # 或者 gunzip < my-app-latest.tar.gz | docker load
方法二:使用不同的压缩算法以获得更高压缩比(速度更慢)
如果你的网络带宽是瓶颈,并且你愿意用更长的压缩时间来换取更小的文件体积,可以使用比 gzip
更高效的压缩工具,如 pigz
(并行gzip) 或 xz
。
- 使用
pigz
(多线程gzip,速度快):
docker save my-app:latest | pigz --best > my-app-latest.tar.gz
- 使用
xz
(极高压缩比,速度慢):
docker save my-app:latest | xz -z --threads=0 -9 > my-app-latest.tar.xz
-z
: 进行压缩。--threads=0
: 使用所有可用的CPU核心。-9
: 使用最高压缩等级。- 解压并加载 xz 文件:
xz -d -c my-app-latest.tar.xz | docker load # 或者 unxz < my-app-latest.tar.xz | docker load
方法三:先保存再手动压缩(不推荐)
这种方法会产生一个巨大的临时 tar 文件,通常只在你需要保留未压缩的 tar 包时才使用。
# 1. 先保存为未压缩的tar docker save -o my-app-latest.tar my-app:latest # 2. 再用任何工具压缩它 gzip my-app-latest.tar # 会生成 my-app-latest.tar.gz
不推荐的原因:
- 浪费磁盘空间: 会在磁盘上产生一个巨大的临时文件(可能几十GB),可能会占满磁盘空间。
- 速度慢: 需要等待
docker save
完全写完,然后再启动压缩过程,总耗时更长。
方法一通过管道流式处理,避免了这些问题。
总结与建议
方法 | 命令 | 优点 | 缺点 | 推荐度 |
---|---|---|---|---|
管道 + gzip | `docker save … | gzip > file.tar.gz` | 速度快,通用性好,节省磁盘空间 | 压缩比不是最高 |
管道 + pigz | `docker save … | pigz > file.tar.gz` | 多线程,比gzip快 | 需要额外安装pigz |
管道 + xz | `docker save … | xz > file.tar.xz` | 压缩比最高,文件最小 | 速度非常慢,耗CPU |
先save后压缩 | docker save -o ... && gzip ... | 可保留中间tar文件 | 耗磁盘空间,速度慢 | ⭐(不推荐) |
给你的建议:
- 日常使用:直接采用
docker save | gzip
,这是最均衡的选择。 - 传输给他人或上传:如果镜像非常大,并且你不介意等待,使用
docker save | xz
来获得最小的文件。 - 绝对要避免:直接使用
docker save -o
而不加压缩,除非你有特殊需求。
所以,下次保存镜像时,请务必使用管道压缩,这能为你节省大量的时间和磁盘空间。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。