docker save镜像时进行gzip压缩方式

 更新时间:2025年08月30日 08:39:28   作者:学亮编程手记  
文章介绍了三种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文件耗磁盘空间,速度慢⭐(不推荐)

给你的建议:

  1. 日常使用:直接采用 docker save | gzip,这是最均衡的选择。
  2. 传输给他人或上传:如果镜像非常大,并且你不介意等待,使用 docker save | xz 来获得最小的文件。
  3. 绝对要避免:直接使用 docker save -o 而不加压缩,除非你有特殊需求。

所以,下次保存镜像时,请务必使用管道压缩,这能为你节省大量的时间和磁盘空间。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 在Ubuntu15.04上安装Docker的步骤以及基本用法

    在Ubuntu15.04上安装Docker的步骤以及基本用法

    Docker是一种轻量型的的类虚拟机的平台,在开发项目上还是很有优势的,这仅是我的一种直观理解。所以这篇文章主要给大家介绍了在Ubuntu15.04上安装Docker的步骤以及基本用法,有需要的朋友们可以参考借鉴。
    2016-10-10
  • Docker MySQL无法被宿主机访问的问题解决

    Docker MySQL无法被宿主机访问的问题解决

    本文主要介绍了Docker MySQL无法被宿主机访问的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Windows远程连接Docker服务的操作方法

    Windows远程连接Docker服务的操作方法

    本文介绍了在Windows系统下如何通过配置远程连接到Docker服务端,实现Docker客户端远程访问和管理Docker容器,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-11-11
  • Docker 解决获取容器获取的时间不是本地时间的问题

    Docker 解决获取容器获取的时间不是本地时间的问题

    这篇文章主要介绍了Docker 解决获取容器获取的时间不是本地时间的问题的相关资料,需要的朋友可以参考下
    2016-11-11
  • 详解docker强制批量删除none的image镜像

    详解docker强制批量删除none的image镜像

    这篇文章主要介绍了详解docker强制批量删除none的image镜像,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 前端项目容器化Docker打包部署方式详解

    前端项目容器化Docker打包部署方式详解

    这篇文章主要为大家介绍了前端项目容器化Docker打包部署方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • docker容器中cron任务未执行的原因分析及解决

    docker容器中cron任务未执行的原因分析及解决

    在Ubuntu 22.04镜像中cron任务执行失败,可能与pam权限或文件权限设置有关,解决方法包括动态加载任务至crontab及将文件权限设为600(容器默认umask=0022),后者因权限冲突导致执行失败,推荐此方案
    2025-08-08
  • Docker中部署Mino并挂载配置文件的项目实践

    Docker中部署Mino并挂载配置文件的项目实践

    本文主要介绍了Docker中部署Mino并挂载配置文件的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 如何监控docker容器运行状态 shell 脚本

    如何监控docker容器运行状态 shell 脚本

    这篇文章主要介绍了如何监控docker容器运行状态 shell 脚本的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • docker中多阶段构建与单阶段构建的具体使用

    docker中多阶段构建与单阶段构建的具体使用

    本文主要介绍了docker中多阶段构建与单阶段构建的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09

最新评论