Docker学习笔记八:删除镜像&构建私有Registry

删除镜像

如果要删除本地的镜像,可以使用 docker rmi (注意rm为删除容器,而rmi为删除镜像,其中i代表image)命令,它的具体语法如下:

docker rmi [OPTIONS] IMAGE [IMAGE...]

其中:

  • docker rmi:Docker删除镜像的命令关键词;
  • OPTIIONS: 命令选项,-f强制删除镜像;
  • IMAGE:需要删除的镜像。这里的镜像可以用“镜像短ID”、“镜像长ID”、“镜像名”、“镜像的digest”来标识。

使用docker images --digests查看镜像的具体信息,包括镜像的digest;如下图所示:

[root@localhost Desktop]# docker images --digests ubuntu
REPOSITORY          TAG                 DIGEST   IMAGE ID            CREATED             SIZE
ubuntu              latest             sha256:84c334414e2bfdcae99509a6add166bbb4fa4041dc3fa6af08046a66fed3005f   14f60031763d        2 weeks ago         120 MB

删除ubuntu:latest镜像,有以下几种方法:

  1. 镜像短ID:docker rmi 14f6;(这个代表镜像id以14f6开头的镜像,一般而言,前四位可以唯一标志,如果不可以,docker会提示的)
  2. 镜像长ID:docker rmi 14f60031763d
  3. 镜像名: docker rmi ubuntu:latest
  4. 镜像的digest:docker rmi ubuntu@sha256:84c334414e2bfdcae99509a6add166bbb4fa4041dc3fa6af08046a66fed3005f

以上的方法都能删除掉ubuntu:v1镜像。但日常生活中,我们比较常用的是短ID以及镜像名,因为用起来最方便。

删除多个镜像

我们可以使用 docker images -q来配合使用docker rmi,这样可以成批的删除希望删除的镜像。
docker images -q redis会输出所有仓库名为redis的镜像id,所以如果想要删除所有仓库名为redis的镜像,可以这么写:

docker rmi $(docker images –q redis)

如果想要删除所有镜像,可以这么写:

docker rmi $(docker images –qa)

如果想要使用docker rmi删除一个镜像,需要注意需要先将使用该镜像的容器删除掉,否则该镜像不能删除成功。当然也可以使用docker rmi -f强制删除该镜像!

扩展阅读(帮助理解镜像的存储机制)

首先拉取一个ubuntu镜像到本地(开始时本地没有任何镜像的)

[root@localhost Desktop]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
e0a742c2abfd: Pull complete
486cb8339a27: Pull complete
dc6f0d824617: Pull complete
4f7a5649a30e: Pull complete
672363445ad2: Pull complete
Digest: sha256:84c334414e2bfdcae99509a6add166bbb4fa4041dc3fa6af08046a66fed3005f
Status: Downloaded newer image for ubuntu:latest
[root@localhost Desktop]#

然后基于ubuntu:latest创建一个镜像,ubuntu:v1.0(Dockerfile看不懂没关系,你只需要该镜像是基于ubuntu镜像,而且构建了三层即可了)。

# [root@localhost Desktop]# docker build -t ubuntu:v1.0 .
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM ubuntu
 ---> 14760031763d
Step 2/2 : RUN touch 1.txt
 ---> f3caf7be8365
Removing intermediate container 8b1ddd72ce60
Successfully build f3caf7be8365

删除ubuntu镜像,发现只输出了Untagged。

[root@localhost Desktop]# docker rmi ubuntu
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:84c334414e2bfdcae99509a6add166bbb4fa4041dc3fa6af08046a66fed3005f

删除ubuntu:v1.0,除了Untagged信息外,还有Deleted信息。

Untagged: ubuntu:v1.0
Deleted: sha256:f3caf7be8365d8565ccd
Deleted: sha256:ccb3e410a39a587a2221
Deleted: sha256:14760031763da664d5d6
Deleted: sha256:e48d2779c8c8c3200fac
Deleted: sha256:4c66a8c9cd74cd55b98b
Deleted: sha256:55cb055d70722e6f41bc
Deleted: sha256:28a900eeeb199b0ebc40
Deleted: sha256:e5d2f035d714888cfe23

因此当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以删除镜像标签的信息,这就是我们看到的Untagged 的信息。
而Deleted信息,是删除镜像层后输出的信息。

因为我们的ubuntu镜像对应了2个标签,因此当我们删除latest标签后,还有v1.0指向了这个镜像,而如果还有其他标签指向镜像层的话,那些镜像层是不会被删除的,所以docker rmi ubuntu只输出了Untagged信息。

当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。当执行docker rmi ubuntu:v1.0,首先将该镜像标签删除掉,所以先输出Untagged信息。因为所有标签都被取消了,所以会触发删除行为(也就是Deleted信息),将ubuntu:v1.0使用的所有镜像层都删除掉了。(实际上从输出信息看创建ubuntu:v1.0的时候只构建了三层,而删除ubuntu:v1.0时,删除了八层,其他的五层,就是ubuntu:latest构建时创建的层)。

创建一个私人仓库

在Docker Hub中提供了创建私人仓库的镜像Resposity(镜像仓库):Registry,本例将以Registry:2镜像为例,构建一个私人仓库。

docker run -d -p 5000:5000 --restart=always --name registry registry:2

只需要上面这一条命令,一个私人仓库就创建好了。从这条命令可以看出,这个私人仓库以容器的形式运行着。其中--restart=always是指在Docker服务重启或者registry容器退出时会重新启动。而-p是指将宿主机的5000端口映射到容器的5000端口,这样就可以通过宿主机ip:5000访问到容器的5000端口了。(registry容器默认会监听5000端口)。-d参数是指在后台运行。

当然还有其他的配置,例如-v指定私人仓库的存储位置,添加-v /mnt/registry:/var/lib/registry可以将私人仓库的存储位置设置为宿主机的/mnt/registry。

更多更详细的配置可以参考:
docker官方文档

将镜像推送到私人仓库

(1)使用docker tag 给镜像加上一个标签
如果想要将镜像推送到私人仓库而不是Docker Hub,首先必须使用docker tag命令,使用主机名和端口来标记一个镜像,如下所示,为ubuntu:latest镜像加上一个localhost:5000/my-ubuntu:latest的标签。

docker tag ubuntu:latest localhost:5000/my-ubuntu

(2)使用docker push将镜像推送到私人仓库
使用docker push命令可以将镜像推送到仓库,默认情况下会将镜像推送到官方仓库Docker Hub中去,但是如果推送一个“用主机名和端口来标记”的镜像,那么就会推送到私人仓库。

docker push localhost:5000/my-ubuntu

从私人仓库拉取一个镜像

除了推送以外,当然还可以从私人仓库拉取镜像,docker pull可以从仓库拉取某个镜像,默认情况下,也是从官方仓库拉取。当我想从私人仓库拉取my-ubuntu:latest镜像。执行以下命令就行了。

docker pull localhost:5000/my-ubuntu

查看或者删除私人仓库中的镜像

Docker提供的Registry镜像没有提供查看镜像和删除镜像的指令,但是有第三方的软件可以提供这些功能,例如:harbor。

harbor提供一个可视化的界面来操作私人仓库,包括查看私人仓库中的镜像以及删除私人仓库中的镜像,除此以外,还有日志等非常有用的功能。
具体的安装与介绍请参照:
Github地址

删除私人仓库

私人仓库实质上就是一个容器,所以删除私人仓库就是删除私人仓库对应的容器。我们可以使用docker rm -f强制删除删除它,但是这样删除之后,私人仓库中存储的镜像并不会被删除掉。如果你想在删除私人仓库的同时,也将镜像删除,需要添加-v参数,也就是docker rm -f -v。例如删除本地的私人仓库,可以执行以下语句:

docker rm -vf myregistry
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值