删除docker容器中内容后打包镜像不变小问题及解决

 更新时间:2025年03月07日 08:44:57   作者:一米阳光zw  
文章讨论了在Docker中处理大压缩包时遇到的问题,以及如何通过分层存储和使用`docker load`与`docker import`命令来解决镜像大小过大的问题

问题

之前一直有这个问题困扰我,不知道大家有没有遇到过,当我们在容器中部署某个软件时如果软件的压缩包比较大那我们可能需要把压缩包删除后再去做镜像,此时你会发现镜像还是两个压缩包左右的大小,甚至删除后镜像可能会更大,这个问题就很容易导致镜像越来越大无法维护,最近找到了一个解决方法,在这里分享一下

分析

这个跟docker的原理有关系,因为镜像是按照层存储,这样做最大好处很直观,版本更新时只需要下载软件的下一层相当于是软件的增量包大概是这个意思,而如果你不分层就需要下载软件的全量包这样的话十分麻烦。

用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。

这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

解决

知道了原因的话那解决也会相对简单一些,既然docker load会保存文件的历史记录和原数据,那我们使用docker import导入容器的快照就可以了。

大概就是恢复到打包容器时候的样子,是一个快照,没有历史记录。

导出容器

如果要导出本地某个容器,可以使用 docker export 命令

格式如下:

docker export ContainerId > containerPackage.tar

ContainerId 代表容器id,containerPackage.tar压缩包名称这个无所谓

查看容器id:

导出容器快照为tar文件

这样将导出容器快照到本地文件,等待完成,查看文件

导入容器快照

使用 docker import 从容器快照文件中再导入为镜像

格式如下:

cat edas.tar  | docker import - luntek/centos_edatest:1.0

edas.tar为容器快照,luntek应该是仓库名称,centos_edatest是项目名称

上传镜像

docker push luntek/images_name:tag

如果docker镜像太大上传的过程中可能会报错Retrying in 10 second

解决:

编辑/etc/selinux/config文件,关闭SELINUX,将值设置为disabled

vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

总结

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

相关文章

  • 使用Maven打包构建Docker镜像并推送到仓库

    使用Maven打包构建Docker镜像并推送到仓库

    这篇文章主要介绍了使用Maven打包构建Docker镜像并推送到仓库问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 关于Docker网络配置及部署SpringCloud项目详解

    关于Docker网络配置及部署SpringCloud项目详解

    这篇文章主要介绍了关于Docker网络配置及部署SpringCloud项目详解,Docker在创建容器时有四种网络模式,bridge为默认不需要去指定,其他三种模式需要在创建容器时使用–net去指定,需要的朋友可以参考下
    2023-07-07
  • Rancher+Docker+SpringBoot实现微服务部署、扩容、环境监控

    Rancher+Docker+SpringBoot实现微服务部署、扩容、环境监控

    Rancher 是一套容器管理平台,可以在生产环境中快捷的部署和管理容器,方便的对容器进行cpu内存环境监控、日志监控、扩容缩容,自动重启,这篇文章主要介绍了Rancher+Docker+SpringBoot实现微服务部署、扩容、环境监控,需要的朋友可以参考下
    2022-04-04
  • docker实践之docker-compose部署mysql方式

    docker实践之docker-compose部署mysql方式

    这篇文章主要介绍了docker实践之docker-compose部署mysql方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • docker push遇到unknown blob问题解决

    docker push遇到unknown blob问题解决

    这篇文章主要为大家介绍了docker push遇到unknown blob问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Docke中安装redis的方法

    Docke中安装redis的方法

    这篇文章主要介绍了Docke中安装redis的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • docker如何查询镜像版本信息

    docker如何查询镜像版本信息

    这篇文章主要介绍了docker如何查询镜像版本信息问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 非docker方式部署openwebui的完整过程记录

    非docker方式部署openwebui的完整过程记录

    这篇文章主要介绍了从使用Docker部署OpenWebUI到直接部署的切换过程,包括停止并删除未使用的Docker镜像以释放硬盘空间,并记录了直接部署的具体步骤,需要的朋友可以参考下
    2025-02-02
  • 使用Docker快速搭建你的Gitbook

    使用Docker快速搭建你的Gitbook

    这篇文章主要介绍了使用Docker快速搭建你的Gitbook的相关资料,需要的朋友可以参考下
    2023-11-11
  • 详解docker镜像centos7配置Java运行环境

    详解docker镜像centos7配置Java运行环境

    基于docker官网centos7镜像配置java运行环境,自己安装jdk和tomcat,解决docker容器与宿主机时间不一致问题
    2017-05-05

最新评论