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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章