当前位置: 首页 > news >正文

docker save如何迁移镜像更节省空间?

文章目录

    • 方法一:使用`docker save`命令
    • 方法二:直接保存多个镜像到一个tar文件
    • 哪个方法更节省磁盘空间?
      • 空间效率对比
      • 实际测试示例
      • 其他优势
      • 结论
    • 如何用脚本迁移
    • 加载镜像

迁移镜像时候,往往会碰到基础镜像相同的很多镜像需要迁移,这个时候如果单独docker save的话,镜像tar包的尺寸会很大,因此为了解决这个问题,你需要换种姿势使用docker save! docker镜像是分层的,将基础镜像的相同的层合并到一起, 就可以节省空间了。

方法一:使用docker save命令

  1. 首先保存各个镜像到单独的tar文件:

    docker save -o image1.tar image1:tag
    docker save -o image2.tar image2:tag
    docker save -o image3.tar image3:tag
    
  2. 然后将这些tar文件打包到一个tar包中:

    tar -cvf all_images.tar image1.tar image2.tar image3.tar
    

方法二:直接保存多个镜像到一个tar文件

Docker的save命令本身就支持一次保存多个镜像到一个文件:

docker save -o all_images.tar image1:tag image2:tag image3:tag

哪个方法更节省磁盘空间?

方法二(直接使用docker save保存多个镜像到一个tar文件)更节省磁盘空间,原因如下:

空间效率对比

  1. 方法二更优

    • 当多个镜像共享相同的层时,docker save会自动去重
    • 生成的单个tar文件只包含唯一的镜像层,共享层不会重复存储
    • 例如如果image1和image2都基于相同的Ubuntu基础层,这个基础层只存储一次
  2. 方法一更耗空间

    • 每个docker save命令会独立保存完整的镜像(包括所有层)
    • 之后再用tar打包时,相同的镜像层会被重复存储
    • 例如如果三个镜像共享同一个基础层,这个基础层会被存储三次

实际测试示例

假设有三个镜像:

  • image1 (包含基础层300MB + 专属层100MB)
  • image2 (包含相同基础层300MB + 专属层200MB)
  • image3 (独立镜像500MB)

方法一结果:

  • image1.tar = 400MB
  • image2.tar = 500MB
  • image3.tar = 500MB
  • 最终all_images.tar ≈ 1.4GB (基础层被存储了两次)

方法二结果:

  • all_images.tar ≈ 300MB(基础层) + 100MB + 200MB + 500MB = 1.1GB

其他优势

方法二还有额外优点:

  1. 操作更简单(单条命令完成)
  2. 加载更方便(单条docker load命令)
  3. 更好地保持镜像间的依赖关系

结论

推荐总是使用方法二docker save -o output.tar img1 img2 img3),除非你有特殊需求需要保持镜像完全独立存储。

如何用脚本迁移

很简单,将镜像列表写入一个文本文件(e.g. imagelist)中:

  • imagelist
nginx:v1.20.1
redis:v5.0
mysql:v8.0.21

执行脚本,即可将全部镜像保存:

docker save -o all_images.tar $(cat imagelist.txt)

加载镜像

要从组合的tar文件中加载镜像:

docker load -i all_images.tar

相关文章:

  • 数据结构与算法:2,冒泡排序
  • 配置完nfs后vmware虚拟机下ubuntu/无法联网问题
  • iPaaS集成平台如何帮助制造业实现数字化转型
  • 某投行日志记录解决方案二之日志异步落盘: 自定义注解+反射+AOP+异步多线程,实现高并发场景下的统一日志治理方案
  • 【Android】屏幕刷新机制(概览)
  • vs2017开启性能探测器失败
  • 【计算机操作系统】线程的概念和特点
  • 如何通过python将视频转换为字符视频
  • 优化 Docker 构建之方法(Methods for Optimizing Docker Construction)
  • 验证码通过“Canvas 绘制”与“Base64 图片”渲染两种不同的实现方式显示
  • 城电科技|零碳园区光伏太阳花绽放零碳绿色未来
  • 《论语别裁》第02章 为政(08) 诗的伟大
  • GenBI 中如何引入 LLM 做意图路由,区分查数据还是闲聊
  • 【ManiSkill】环境success条件和reward函数学习笔记
  • 解决HuggingFaceEmbeddings模型加载报错:缺少sentence-transformers依赖包
  • 作业(6)
  • WebGL图形编程实战【3】:矩阵操控 × 从二维到三维的跨越
  • 将网页操作的脚本自动保存成yaml ,然后修改使用
  • vueRouter的hash模式跟history的区别
  • pip show protobuf ValueError: invalid literal for int() with base 10: ‘‘
  • 网站建设调研/百度免费下载
  • 青海西宁高端网站建设/项目外包平台
  • 有哪些网站是静态网站/郑州网络推广
  • 网站建设与推广的步骤/关键词优化排名详细步骤
  • 建设旅游网站/搜外网友情链接
  • 汽车行业网站建设/百度搜索网