1. 程式人生 > 其它 >Docker映象倉庫registry

Docker映象倉庫registry

技術標籤:筆記

介紹

在安裝好docker後,我們執行docker pull去下載映象的時候,其實是預設從dockerhub上拉取的,這個是docker的公共倉庫,如果在公司中使用docker,我們不可能把自己的映象上傳到公共倉庫,這個時候就需要有一個企業自己是倉庫,在區域網之內搭建,既可以提升下載映象的速度,也可以避免內部的映象暴露出去。

目前常用 registry 版本為 v2,registry v2 擁有斷點續傳、併發拉取映象多層等特點。能併發拉取多層是因為映象的元資訊與映象層資料分開儲存,當 pull 一個映象時,先進行認證獲取到 token 並授權通過,然後獲取映象的 manifest 檔案,進行 signature 校驗。校驗完成後,依據 manifest 裡的層資訊併發拉取各層。其中 manifest 包含的資訊有:倉庫名稱、tag、映象層 digest 等

映象的完整內容分為兩部分,一部分是manifest,一部分是image blob,第一部分是映象的元資料,或者叫元資訊,第二部分叫做映象的二進位制檔案,也就是映象的真實檔案,可以認為某一個blob就是映象的某一層的真實二進位制檔案。

還涉及兩個概念,一個是sha256,另外一個是digest
sha256是一種校驗方法,docker用這種方法來計算映象層或者元資訊的sha256的sum值,用於校驗資訊,而digest就是manifest的校驗資訊值

環境

[[email protected] ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (
Core)

安裝Docker

yum -y install yum-utils
yum-config-manager     --add-repo     https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo     
yum -y install docker-ce
[[email protected] ~]# systemctl start docker
[[email protected] ~]# docker --version
Docker version 20.10.1, build 831ebea
[
[email protected] ~]# systemctl start docker

下載registry映象

[[email protected] ~]#  docker pull registry
Using default tag: latest
latest: Pulling from library/registry
0a6724ff3fcd: Pull complete 
d550a247d74f: Pull complete 
1a938458ca36: Pull complete 
acd758c36fc9: Pull complete 
9af6d68b484a: Pull complete 
Digest: sha256:d5459fcb27aecc752520df4b492b08358a1912fcdfa454f7d2101d4b09991daa
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[[email protected] ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
registry     latest    678dfa38fcfa   2 weeks ago   26.2MB

執行registry容器

[[email protected] ~]#  docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest 
10a89089c799a0ad8e2258f600c665f52293022c048078b42fb2c1f99e6b0e29
引數說明:
-itd:在容器中開啟一個偽終端進行互動操作,並在後臺執行;
-v:把宿主機的/data/registry目錄繫結 到 容器/var/lib/registry目錄(這個
      目錄是registry容器中存放映象檔案的目錄),來實現資料的持久化;
-p:對映埠;訪問宿主機的5000埠就訪問到registry容器的服務了;
--restart=always:這是重啟的策略,假如這個容器異常退出會自動重啟容器;
--name registry:建立容器命名為registry,你可以隨便命名;
registry:latest:這個是剛才pull下來的映象;

檢視映象倉庫中的所有映象

[[email protected] ~]# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}

docker client下載映象並打標籤

[[email protected] ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete 
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[[email protected] ~]# docker tag centos:latest 192.168.1.10:5000/centos:latest

docker client 修改配置檔案,設定私有倉庫

方式有兩種
[[email protected] ~]# vim /etc/docker/daemon.json 
{
  "registry-mirrors": ["http://f1361db2.m.daocloud.io"],
  "insecure-registries": [ "192.168.1.10:5000"]
}

[[email protected] ~]# vim /usr/lib/systemd/system/docker.service 
 14 ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.10:5000
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart docker

docker client 上傳映象

[[email protected] ~]# docker push 192.168.1.10:5000/centos
Using default tag: latest
The push refers to repository [192.168.1.10:5000/centos]
2653d992f4ef: Pushed 
latest: digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875 size: 529

測試是否可以下載映象

[[email protected] ~]# docker rmi 192.168.1.10:5000/centos
Untagged: 192.168.1.10:5000/centos:latest
Untagged: 192.168.1.10:5000/[email protected]:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
[[email protected] ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
registry     latest    678dfa38fcfa   2 weeks ago   26.2MB
centos       latest    300e315adb2f   3 weeks ago   209MB
[[email protected] ~]#  docker pull 192.168.1.10:5000/centos
Using default tag: latest
latest: Pulling from centos
Digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
Status: Downloaded newer image for 192.168.1.10:5000/centos:latest
192.168.1.10:5000/centos:latest
[[email protected] ~]# docker images
REPOSITORY                 TAG       IMAGE ID       CREATED       SIZE
registry                   latest    678dfa38fcfa   2 weeks ago   26.2MB
centos                     latest    300e315adb2f   3 weeks ago   209MB
192.168.1.10:5000/centos   latest    300e315adb2f   3 weeks ago   209MB

列出倉庫中的所有映象(在client上操作的,哪臺都可以)

[[email protected] ~]# curl http://192.168.1.10:5000/v2/_catalog
{"repositories":["centos"]}

刪除映象

docker registry預設情況下沒有開啟刪除映象的功能,需要修改配置檔案,進行開啟,下邊的操作是在docker registry上操作的

[[email protected] ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                    NAMES
10a89089c799   registry:latest   "/entrypoint.sh /etc…"   9 minutes ago   Up 3 minutes   0.0.0.0:5000->5000/tcp   registry
[[email protected] ~]# docker exec -it registry  /bin/sh
/ # vi /etc/docker/registry/config.yml 
末行新增
delete:         
    enabled: true
[[email protected] ~]# docker restart registry
registry

自己新增的內容:
在這裡插入圖片描述
docker client 執行刪除操作,如下,還是失敗,那就算了吧,這個只是為了讓你理解並且會用registry,企業用用到倉庫的時候使用的是harbor,一個圖形化介面的docker映象倉庫,而且還有賬號和密碼,安全級別也更高

[[email protected] ~]# curl -I -X DELETE http://192.168.1.10:5000/v2/centos/manifests/sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
HTTP/1.1 405 Method Not Allowed
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Mon, 04 Jan 2021 06:07:42 GMT
Content-Length: 78

對於企業公司用映象倉庫的話有條件還是推薦使用harbor,harbor是一款有圖形化介面的倉庫,便於管理,安裝,刪除映象等等,registry當你大量上傳映象而不清理的時候還會出現這個容器大量佔用伺服器磁碟空間,當你刪除映象的時候也不會像harbor可以有選擇性的刪除,registry映象刪除方法親自實驗過,當佔用過大的時候直接全部刪除

#這個是去到registry容器所對映的主機目錄,所有的映象檔案都存放到/data/registry目錄下
[[email protected] ~]# cd /data/registry
[[email protected] registry]# ls
docker
先來看一下目錄構成情況
[[email protected] registry]# tree docker/
docker/
└── registry
    └── v2
        ├── blobs
        │   └── sha256
        │       ├── 30
        │       │   └── 300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55
        │       │       └── data
        │       ├── 7a
        │       │   └── 7a0437f04f83f084b7ed68ad9c4a4947e12fc4e1b006b38129bac89114ec3621
        │       │       └── data
        │       └── db
        │           └── dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
        │               └── data
        └── repositories
            └── centos
                ├── _layers
                │   └── sha256
                │       ├── 300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55
                │       │   └── link
                │       └── 7a0437f04f83f084b7ed68ad9c4a4947e12fc4e1b006b38129bac89114ec3621
                │           └── link
                ├── _manifests
                │   ├── revisions
                │   │   └── sha256
                │   │       └── dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
                │   │           └── link
                │   └── tags
                │       └── latest
                │           ├── current
                │           │   └── link
                │           └── index
                │               └── sha256
                │                   └── dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
                │                       └── link
                └── _uploads

27 directories, 8 files
主要就是進入/data/registry/docker/registry/v2/blobs以及/data/registry/docker/registry/v2/repositories刪除下面的所有
操作如下:
[[email protected] repositories]# cd /data/registry/docker/registry/v2/blobs
[[email protected] blobs]# ls
sha256
[[email protected] blobs]# rm -rf *
[[email protected] blobs]# cd /data/registry/docker/registry/v2/repositories
[[email protected] repositories]# ls
centos
[[email protected] repositories]# rm -rf *
檢視映象倉庫是否還有映象:
[[email protected] repositories]# curl http://192.168.1.10:5000/v2/_catalog
{"repositories":[]}
完畢!成功!