删除镜像
如果要删除本地的镜像,可以使用 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镜像,有以下几种方法:
- 镜像短ID:
docker rmi 14f6
;(这个代表镜像id以14f6开头的镜像,一般而言,前四位可以唯一标志,如果不可以,docker会提示的) - 镜像长ID:
docker rmi 14f60031763d
; - 镜像名:
docker rmi ubuntu:latest
; - 镜像的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