docker镜像完全卸载的操作步骤

1.docker ps -a查看运行的镜像进程

[root@mylinux~]# docker ps -a
CONTAINER ID  IMAGE      COMMAND     CREATED    STATUS    PORTS        NAMES
98acb9dcb2a2  redis:5      "docker-entrypoint.s…" 8 minutes ago  Up 8 minutes  0.0.0.0:6379->6379/tcp    redis
1b1ff7f08583  mysql:5.7     "docker-entrypoint.s…" 8 minutes ago  Up 8 minutes  0.0.0.0:3306->3306/tcp, 33060/tcp mysql
035129f60a64  mongo:3.6     "docker-entrypoint.s…" 8 minutes ago  Up 8 minutes  0.0.0.0:27017->27017/tcp   mongo

2.docker stop CONTAINER ID例如要删除mysql镜像,停止该镜像进程

docker stop 035129f60a64

3.docker rm CONTAINER ID卸载镜像

docker rm 035129f60a64

4.docker images 查看当前docker的镜像IMAGE ID

[root@mylinux ~]# docker images
REPOSITORY     TAG     IMAGE ID   CREATED    SIZE
redis      5     a4fe14ff1981  25 hours ago  95MB
mysql      5.7     7faa3c53e6d6  29 hours ago  373MB
mongo      3.6     0f29e46dab41  2 days ago   432MB

5.docker rmi IMAGE ID 删除镜像

[root@mylinux ~]# docker rmi 7faa3c53e6d6
Untagged: mysql:5.7
Untagged: mysql@sha256:204f5c77fe589c202e2ebc8b6b7dcdc442d67c07168916a302ede26b3e9ab168
Deleted: sha256:7faa3c53e6d699fe92d49a361e427c3af937c6cea9517f092e8013b1fff1c4d9
Deleted: sha256:bada5edfe9c6f4637d3ef1f4797561867be56282a750c0f1d4a83c227bc7a153
Deleted: sha256:cb6436acc7f930ab22d387016b2296e6c191fc4ebbb1611f84e3e15073588fc7
Deleted: sha256:1716d22cd68158fa78c60cf78d8e25457fb384de45de7775abf3a31502b6f00e
Deleted: sha256:daeb1195813697ab0182eb75de7f5a0f5bbfc4f8eb91be9f844777841e759984
Deleted: sha256:64ffa0ccfe7f5ecb4fb721913499a8e0b1af9897b69a0dbec0922f5b70666e76
Deleted: sha256:3b3af32bd87b74f389198eab8514d9f32f3e513dae313748b165333b286bd171
Deleted: sha256:c75ab456a585af40ca2ec8488164230deb81a1739d868604cb7b6661c24e37b5
Deleted: sha256:50a75eb6a0b2254fe5d96f999cc2087e72d515c93509a816bbd9ffb707a3b1b0
Deleted: sha256:1ae6616333a66450738a72a75c03bdf0236e0425ba0336ac5cdbe470ab6f4a3e
Deleted: sha256:68e318bd9263aedd19d9d73b051a262fa57e2a16f9c81c8b39163601020cd405
Deleted: sha256:6270adb5794c6987109e54af00ab456977c5d5cc6f1bc52c1ce58d32ec0f15f4

补充:Docker彻底删除私有库镜像

首先看看网上一般的做法

私有库默认是不支持删除镜像的,需要修改config.yml配置文件,在storage节点下加入 delete: enabled: true ,然后重启私有库。

docker 提供的镜像删除api为:

DELETE ip:端口/v2/<repository>/manifests/<reference>

repository 为镜像的repository

reference 为镜像push成功后生成的 digest:sha256 值

获取 digest :

curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET <私有库ip>:端口号/v2/<镜像repository>/manifests/<镜像tag>

注意:

--header "Accept: application/vnd.docker.distribution.manifest.v2+json" 这个header 是必须要加的,不加的话Content-Type 是v1+prettyjws,获取的digest是错误的!!

例:curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET 192.168.120.107:5000/v2/my-registry/manifests/1.0

删除镜像:

例:curl -I -X DELETE http://192.168.120.107:5000/v2/my-repository/manifests/sha256:4d523adb3c653bab7dfd0326081860b3cba24dc393f69d6731daa513c435ec0c

删除后我们查看下私有库

curl 192.168.120.107:5000/ v2/my-repository/tags/list

就会发现刚删除的那个tag不见了。但是如果在执行命令的前后车库内私有库镜像存储目录的文件大小,会发现并没有多大的变化

显然数据并没有被真的删除,我们还需要运行docker提供的垃圾回收命令。

垃圾回收

我们需要登录 私有库所在的服务器,然后执行命令:

docker exec -it <私有库的容器ID或者容器名> sh -c ' registry garbage-collect /etc/docker/registry/config.yml'

当然,也可以进入到私有库的容器中,再执行:

docker exec -it <私有库的容器ID或者容器名> sh

registry garbage-collect /etc/docker/registry/config.yml

这种方法特别麻烦,只能删tag,不会删repository,删除之后会在blobs目录下留下很多空文件夹,而且如果一个repository下有多个tag,而这些tag的数据相同的话,删除其中一个tag会同时把所有tag都删了

虽然网上有删除私有库镜像的python脚本,但是我感觉并不好用。

我是不会满足于此的,于是我自己写了个sh脚本,先来看看效果。

脚本还有一些人性化的提示,而且sh脚本通俗易懂,容易扩展,脚本我也上传到gitHub上了,有兴趣的可以下载试试。

gitHub地址:https://github.com/hushuai86/docker-delete

下载运行:

#先下载脚本到/usr/local/bin/目录下
curl https://raw.githubusercontent.com/hushuai86/docker-delete/master/docker-delete-2.0.sh | sudo tee /usr/local/bin/docker-delete >/dev/null

#赋予可执行权限
chmod a+x /usr/local/bin/docker-delete

#私有库镜像存储目录路径全局环境变量(该路径就是运行私有库容器时,用-v 命令将私有库容器内 /var/lib/registry目录挂载到本机的路径)
#例: /opt/data/registry是我运行容器时私有库镜像存储目录挂载到本地的目录
echo "export DOCKER_REGISTRY_DIR=/opt/data/registry" >>/etc/profile

#运行私有库容器ID全局环境变量设置(正在运行的私有库容器的 ID)
#例: 89b9b3c9054ay是我的私有库库容器的id
echo "export DOCKER_REGISTRY_CONTAINER_ID=89b9b3c9054a" >>/etc/profile

#使配置生效
source /etc/profile

然后就可以使用docker-delete命令了,如果你觉得脚本有哪些用着不舒服的地方,可以编辑脚本自己改改

原理解析:

(在以下的截图中 /opt/data/registry是我运行容器时私有库镜像存储目录挂载到本地的目录)

私有库镜像存储目录下有两个文件夹 blobs和 repositories

其中repositories目录下是以镜像repository命名的几个文件

也就是说想要知道私有库有哪些镜像,直接看这个文件夹有哪些子文件夹就知道了

而在每个镜像repository文件夹/_manifests/tags目录下可以 看到该镜像有哪些tag

但是镜像的真实数据并不在repositories目录下,而是以数据块的方式存储在blobs目录下,一个镜像被分成多个数据块,也就是执行垃圾回收命令时输出的 ‘marking blob …‘那样的关联关系,而镜像和数据块之间的关联关系就是在 repositories/镜像

repository/_manifests/revisions/sha256/ 目录下的sha256值。

在以sha256值命名的目录下有个link的文件,内容就是这个sha256值

经过我测试发现,只要这个link文件被删除,然后在私有库容器内执行垃圾回收命令‘ registry garbage-collect /etc/docker/registry/config.yml',那么这个sha256值关联的blobs就会被彻底删除

但是,一个镜像可能有很多个tag,那么这个sha256值关联的 blobs数据 到底属于哪个 tag呢?

我们进到镜像的某个tag/index/sha256/ 目录,会发现 有个 sha256值命名的文件夹,而且这个sha256值 在之前的revisions/sha256/ 下存在。在这个文件夹下也有个link文件,保存了该sha256值。

所以根据我的理解,当我们调用docker提供的API 删除一个tag时,会在这个镜像的tag/index/sha256/<sha256值>/link文件中获取sha256值,然后看是不是还有其他tag也关联了这个sha256值,如果有的话,只删除这个tag文件夹,如果没有的话,那么在删除这个tag的文件的同时还会删掉 revisions/sha256/ 目录下的 改sha256对应的link文件,这样的话,当在容器内执行垃圾回收的命令时,就会彻底删除该sha256值关联的blobs数据。

特别注意:

在彻底删除一个镜像的数据后,需要重启下私有库容器,如果不重启的话,你再push该镜像到私有库时,总是会输出 Layer already exists ,似乎是push上去了,但是如果你删除本地的该镜像,然后再pull ,就会报错。当然,我写的脚本里是有这个步骤的

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 删除docker images中为none的镜像操作

    由于平时一直使用docker build 命令才生成一个镜像,有时候由于代码跟新频繁就会产生很多的none的image,最近想着清除一下. 于是就写了以下脚本: docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm docker images|grep non

  • 使用docker build kit构建树莓派上可用的Docker镜像

    Docker安装 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG ${user_name} build-kit是什么 参考build ARM based Docker Images 简单来说就是扩展docker build的一个实验性的功能 以bind为案例进行构建 docker-bind项目是一个开源的自定义DNS部署服务,但是并没有提供基于linux/aarch

  • Docker镜像构建原理解析(不装docker也能构建镜像)

    在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image. docker client 会先检查本地有没有image,如果没有帮你 从镜像仓库 pull 下来 然后解析你写的dockerfile构建新的image. 本文带你了解 pull 命令 背后是怎么做的? build 命令 背后是怎么做的? 下篇文章带你解析: 如果我不用docker 我如何构建一个镜像? 我们以微软的aspnet2.2为基础构建一个

  • docker下载镜像太慢的解决方案

    docker下载镜像卡死或太慢 找了网上很多方法,使用镜像中国也是下载卡死. 最后一种成功了,下载速度很满意 1.先再阿里云注册账号 不需要绑定什么,直接注册就可以了,有账号的直接登录就好. 地址:https://cr.console.aliyun.com 点击跳转 搜索 容器镜像服务 2.创建镜像仓库 3.创建好之后点到这个选项卡 在终端输入 vim /etc/docker/daemon.json 将"registry-mirrors": ["https://......c

  • Docker和镜像的操作方法

    查找镜像 我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/ 我们也可以使用 docker search 命令来搜索镜像.比如我们需要一个 httpd 的镜像来作为我们的 web 服务.我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像. docker search httpd 拖取镜像 我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像.

  • Docker镜像的导入导出代码实例

    Docker镜像的导入导出 本文介绍Docker镜像的导入导出,用于迁移.备份.升级等场景,准备环境如下: CentOS 7.0 Docker 1.18 导入导出命令介绍 涉及的命令有export.import.save.load save 命令 docker save [options] images [images...] 示例 docker save -o nginx.tar nginx:latest 或 docker save > nginx.tar nginx:latest 其中-o和

  • 解决docker images 镜像消失的问题

    1.50,93存在镜像消失情况 [root@h50 /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 24G 0 24G 0% /dev tmpfs 24G 0 24G 0% /dev/shm tmpfs 24G 428M 24G 2% /run tmpfs 24G 0 24G 0% /sys/fs/cgroup /dev/mapper/cl-root 50G 43G 8.0G 85% / root剩下85% overlay 50G 43G 8.0G 85% /v

  • 使用脚本一键打包并上传docker镜像的实现代码

    笔者搞了一年多微前端项目,一个团队管理十个微应用,换成docker镜像部署后,发布操作一下从原来的脚本直连服务器的1分钟变成了几十分钟,尤其上传每个应用到各自的阿里云仓库.这里就再写个脚本一键打包docker镜像并上传阿里云. 本文只讲怎么制作一个脚本帮助去减轻开发人员负担,关于docker-compose的配置见: 使用各种姿势舒服的部署微前端项目(上:打包与上传) 效果图 直接上代码 /** * @name docker镜像打包上传脚本 * @author weilan * @time 20

  • docker镜像完全卸载的操作步骤

    1.docker ps -a查看运行的镜像进程 [root@mylinux~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 98acb9dcb2a2 redis:5 "docker-entrypoint.s-" 8 minutes ago Up 8 minutes 0.0.0.0:6379->6379/tcp redis 1b1ff7f08583 mysql:5.7 "docke

  • Alpine Docker镜像字体的问题解决操作

    1.运行 fonts ,打开字体文件夹,找到要用的字体文件: 2.修改Dockerfile,例如: FROM alpine-jdk ADD ./test.jar /opt/App/test.jar #拷贝字体文件 COPY ./simhei.ttf /usr/share/fonts/simhei.ttf #设置字符集 ENV LANG en_US.UTF-8 #安装字体软件,完成字体配置 RUN apk add --update ttf-dejavu fontconfig && rm -r

  • Docker容器从镜像恢复代码的操作步骤

    有时候代码丢失了需要从容器运行的镜像中恢复出所需代码,此时仅需在容器运行的服务器进行简单的几步操作,就能提取出打包镜像时使用的代码 查看所有容器: docker container ls -a 根据容器id进入到指定容器: docker exec -ti id /bin/bash 拷贝容器内目录到服务指定文件夹: docker container cp id:/usr/local/tomcat/webapps/province-admin /home/test/province-admin 经过

  • Docker镜像制作详解介绍

    最近由于工作原因,需要对Docker镜像进行制作,这里记录下,也许对大家也有一定帮助! 写在前面:本文docker镜像制作方法更适用于基于已有docker镜像一次性修改. 推荐用Docker File制作docker镜像. 原理是一样的,但是用docker file制作docker镜像能够记录下操作步骤,方便以后更改或者镜像丢失后重新创建. 本文以Ubuntu为基础镜像,预启动一个django项目和ssh服务,制作一个新的镜像. 1.基础镜像 我选用的是从Docker官网下载的ubuntu镜像.

  • 树莓派3B+安装64位ubuntu系统和docker工具的操作步骤详解

    想在树莓派3B上安装一些64位应用(例如64位JDK),因此首先要安装64位的操作系统,今天咱们就一起来实战: 原文地址:https://blog.csdn.net/boling_cavalry/article/details/80716098 环境要求一台树莓派3B设备:网络环境是内网,需要有线网络和网线一根:当树莓派通过网线连接到内网后,能够在路由器管理软件上查到树莓派的IP,例如我用的是小米路由器,通过路由器管理页面或者小米路由器的APP就能看到树莓派的接入情况:读卡器:电脑一台,系统是w

  • docker安装并持久化postgresql数据库的操作步骤

    安装docker步骤略过 1.拉取postgresql镜像 docker pull postgresql 2.创建本地卷,数据卷可以在容器之间共享和重用,默认会一直存在,即使容器被删除(docker volume inspect pgdata可查看数据卷的本地位置) docker volume create pgdata 3.启动容器 docker run --name postgres2 -e POSTGRES_PASSWORD=password -p 5432:5432 -v pgdata:

  • 通过Dockerfile构建Docker镜像的方法步骤

    Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. Dockerfile支持Shell类的行尾添加"\"的命令换行方式,以及行首"#"进行注释的格式. 使用Dockerfile构建Docker镜像时注意事项: (1).尽量选取满足需求但较小的基础系统镜像; (2).清理编译生成文件.安装包的缓存等临时文件; (3).安装各个软件时候要指定准确的版本号,并避免引入不

  • Docker镜像的commit操作示例及作用

    目录 Docker 镜像是什么 UnionFS(联合文件系统) Docker 镜像加载原理 分层的镜像 Docker 镜像 commit 操作 docker commit 能做什么 案例演示 Docker 镜像是什么 UnionFS(联合文件系统) UnionFS(联合文件系统):Union文件系统是一种分层.轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a

  • 第一次构建、运行、发布、获取docker镜像的步骤详解

    1.前言 过去,如果您要开始编写Python应用程序,第一步就是把Python的运行环境安装到您的机器上,而且安装的环境还要和线上的一致,比较麻烦. 使用Docker,您可以从docker的官方registry或者其他仓库,获取一个可移植的Python运行环境镜像,无需安装.然后,你可以基于这个镜像开发你的应用程序,这样可以确保您的应用程序,依赖项和运行时都一起运行. 2.构建一个python镜像 2.1.为了构建您自己的镜像,首先需要创建一个名称为Dockerfile的文件,用于定义创建镜像并

  • 使用docker -v 和 Publish over SSH插件实现war包自动部署到docker的操作步骤

    上篇文章在docker容器挂载宿主主机目录 中介绍了运行docker时的一个重要命令 -v sudo docker run -p 8822:8080 --name tomcat_xiao_volume -v /home/xiaochangwei/test:/usr/local/tomcat/webapps xiaochangwei/tomcat:v1 将容器内部目录和宿主主机目录进行关联,这样操作宿主主机关联目录时,就会同步关联操作了容器对应目录, 这在发布war包时尤其有用, 容器启动后就无需

随机推荐