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

Docker(四)_导出容器(不含历史层)

常用的导出并起容器步骤为

1、docker commit
2、docker save -o 
3、docker load -i 
4、docker run

1.镜像空间变大

发现每次调试后容器占用空间都会变大,如下图:

原始的34.5、多次调试后44.1,增长了约10G,其实并没有

使用以下命令清理了下缓存后,由44.1减小到41.8

# 清 apt 缓存
rm -rf /var/lib/apt/lists/*
rm -rf /var/cache/apt/*# 清 pip 缓存
rm -rf ~/.cache/pip# 清日志
find /var/log -type f -name "*.log" -delete# 清 tmp
rm -rf /tmp/*

2.排查空间增大原因

感觉还是不对劲,因为我并没有增加什么文件,于是用以下命令排查所有目录

du -h --max-depth=1 / | sort -hr | head -n 20
  1. du -h --max-depth=1 /
  • du:Disk Usage,磁盘使用情况命令,用于查看文件或目录占用的磁盘空间大小。
  • h:human-readable,人类可读的格式,用KB、MB、GB等单位显示大小,方便理解。
  • -max-depth=1:只显示指定目录 / 下的一级子目录及文件的大小总和,而不递归显示更深层的子目录。
  • /:目标路径,这里是根目录。

总结: 这部分的作用是列出根目录 / 下一级子目录和文件各自占用的空间大小,以易读的格式显示。


  1. |

管道符,把前面命令 du -h ... 的输出结果传递给后面命令作为输入。


  1. sort -hr
  • sort:排序命令。
  • h:human numeric sort,按人类可读的数字排序,能够识别 K, M, G 等单位正确排序(否则只按字母顺序排序,结果会不对)。
  • r:reverse,倒序排序,也就是从大到小排序。

总结:du 输出的目录大小进行从大到小排序。


  1. head -n 20
  • head:显示文本的前几行。
  • n 20:显示前20行。

总结: 只输出排序后的前20条数据,也就是占用空间最大的20个目录或文件。


输出结果

2.9T    /
2.8T    /data
19G     /usr
990M    /opt
570M    /workspace
530M    /root
332M    /dev
16M     /var
2.4M    /etc
96K     /run
16K     /.singularity.d
12K     /proc
8.0K    /tmp
4.0K    /srv
4.0K    /mnt
4.0K    /media
4.0K    /home
4.0K    /boot
0       /sys

为什么 /data 是挂载目录(外部 volume),但容器 commit 后镜像仍有 42G(commit不会把挂载目录打包)

计算下,除了/data目录,其余文件加起来约21G,多出来的21G哪里来的?

3.原因解释

  • Docker 层叠文件系统导致 “已删除但未释放”空间仍在镜像里

    容器内删除某些大文件(如 .tar.gz, .whl, .pt)后,如果没 docker export 或 docker squash,它们的空间仍保留在镜像层中。如:

    pip install torch  # 下载几GB安装包
    rm -rf ~/.cache/pip  # 看似删除了
    

    但实际上,在 AUFS/overlay2 文件系统中,这部分空间依旧在旧的层中,占用镜像空间。

  • docker commit 会完整保留容器的层结构,而不是自动合并或精简

    也就是说:

    • 每次对容器的变更都会成为新的一层
    • 哪怕后来你删除了文件,旧层依然存在
    • 最终 commit 镜像会包含所有层的总大小

如何验证?

可以运行以下命令来查容器文件系统真实占用情况(包括已删除文件):

lsof | grep deleted

这会列出仍被某些进程占用、但实际上已经被 rm 掉的文件 这些文件的空间仍然占着,会被 Docker commit 进镜像!

4.解决办法

使用 docker export + import

docker export <your_container_id> -o file_name.tar
docker export e8bb6fd8875f -o /data/plate/zip_tar/handwrite_v2.0.tar

docker export 是导出容器的文件系统内容,包括容器内部所有的文件和目录(不包括挂载的外部卷数据)。它会将容器的文件系统打包成一个 tar 归档文件。

docker import /data/handwrite_v2.0.tar handwrite:v2.0
  • 这是 Docker 的一个命令,用于从一个 tar 包(归档文件)导入文件系统快照,创建成一个新的镜像。
  • 该 tar 包通常是通过 docker export 导出的容器文件系统快照,或者由其他方式打包的 Linux 文件系统。
  • 注意: docker import 只导入文件系统,不会包含 Docker 镜像历史(比如每一层的提交记录),也不会包含镜像元数据(比如环境变量、默认命令等),只相当于从 tar 直接生成一个干净的镜像。

5. save 与 import导出方式区别

docker save 与 docker import 有何不同?

方面docker exportdocker save
导出对象容器的当前文件系统镜像(image)
是否包含镜像层历史
包含挂载数据吗
用于重新生成文件系统快照(docker import备份镜像,迁移镜像(docker load
生成文件大小通常较小,包含运行时修改通常较大,包含完整镜像层
参数要求容器ID或名字镜像名或镜像ID
  • 如果你想备份当前容器状态,docker export 是首选,但会丢失镜像历史和配置。
  • 如果你想备份或迁移镜像,docker save 更合适。

http://www.dtcms.com/a/569960.html

相关文章:

  • GitHub Copilot CLI: How to get started
  • Android ANR的解决方案
  • 亚马逊云科技与OpenAI战略合作深度分析:算力联盟重塑AI产业格局
  • 个人接外包的网站心悦俱乐部官方网站怎么做任务
  • 【Ros2学习】话题的发布与请求
  • 肥猫网站建设广西省河池建设局网站
  • CentOS7安装docker教程
  • 论文网站建设与运营拖曳式网站建设
  • Jenkins持续集成入门指南:自动化构建与部署的最佳实践
  • 山西省建设信息网站汇点远程app下载安装
  • 阿里云手机网站建设打电话拉客户用网站做广告怎么做 好做吗
  • hexo做网站wordpress内容分页在哪改
  • 游戏网站后台建设美橙云建站
  • 数据备份策略:全量 / 增量 / 差异备份、备份周期规划
  • LeetCode 322. 零钱兑换
  • Redis黑马点评 Feed流
  • 域名后缀cn做网站河北手机网站建设
  • U-Net保姆级教程:从原理到医学细胞分割实战(PyTorch版)!
  • mini-bitcask学习笔记
  • 东莞网站建设公司哪家好电商平面设计主要做什么
  • 解决远程调用微服务之后无法通过上下文获取用户id问题
  • 网站代付系统怎么做大型网站seo策略
  • 国家住房城乡建设部网站住房和城乡建设部网站北京
  • 制作网站的程序网站查找工具
  • 网站建设 图片压缩网站开发多少费用
  • React Native App 自动检测版本更新完整实现指南
  • 网站建站是 什么企业网站托管运营
  • 字母象形的力量:单词速记之多种意象融合一体
  • xtuoj Binary
  • 南沙网站开发企业网站建设需要多少钱知乎