1. 程式人生 > >docker私有倉庫搭建與管理

docker私有倉庫搭建與管理

docker私有倉庫

(一) 安裝並執行registry

下載registry映象

docker pull registry:2

執行registry

docker run -d -p 5000:5000 -v /app/env/docker/registry:/var/lib/registry -v /app/env/docker/config.yml:/etc/docker/registry/config.yml registry:2

-p 5000:5000 是主機與docker容器的埠對映 -v 是主機目錄掛載到docker容器中,類似虛擬機器的共享目錄mount,這裡的 /app/env/docker/registry是我本地存放映象的倉庫地址,如果不加的預設會存放在/var/lib/registry下,另一個是config.yml,可以對registry容器做一些啟動配置。

檢查容器啟動狀態

docker ps -a

在這裡插入圖片描述 可以看到容器已經正常啟動。

(二) 上傳和拉取映象

先從預設倉庫拉取任意一個映象,比如拉取tomcat映象 在這裡插入圖片描述 等待全部layer下載成功。 接下來我們要將該映象推送到自己的私有倉庫上,我的registry機器域名是10.104.233.50,你們可以按照你們機器的ip做不同的操作。

docker tag tomcat 10.104.233.50:5000/tomcat

用docker image ls,此時可以看到tomcat映象有兩個標籤了 在這裡插入圖片描述 接下來將tomcat映象推送到我們的私有倉庫上

docker push 10.104.233.50:5000/tomcat

這裡可能會出現報錯:

The push refers to a repository [10.104.233.50:5000/tomcat7]
unable to ping registry endpoint https://10.104.233.50:5000/v0/
v2 ping attempt failed with error: Get https://10.104.233.50:5000/v2/: http: server gave HTTP response to HTTPS client
v1 ping attempt failed with error: Get https://10.104.233.50:5000/v1/_ping: http: server gave HTTP response to HTTPS client

出現上面錯誤的原因分析: 因為Docker從1.3.X之後,與docker registry互動預設使用的是https,然而此處搭建的私有倉庫只提供http服務,所以當與私有倉庫互動時就會報上面的錯誤。 為了解決這個問題,需要在啟動docker server時增加啟動引數為預設使用http訪問。 找到docker.service檔案,centos上預設是在/var/lib/systemd/system/docker.service,ubuntu上預設是在/lib/systemd/system/docker.service。 以ubuntu為例,開啟docker.service,可以看到 在這裡插入圖片描述 在/etc/default/docker檔案下配置DOCKER_OPTS變數 在這裡插入圖片描述 然後重啟docker,執行registry容器即可。 再push一次

docker push 10.104.233.50:5000/tomcat

可以看到正常push映象了,等待執行完畢即可。 在這裡插入圖片描述 校驗一下映象是否push成功

curl -XGET 10.104.233.50:5000/v2/_catalog

在這裡插入圖片描述 可以看到在我們搭建的私有倉庫上已經有tomcat這個映象了。

(三)刪除私有倉庫上的映象

在上面我們提到啟動registry

docker run -d -p 5000:5000 -v /app/env/docker/registry:/var/lib/registry -v /app/env/docker/config.yml:/etc/docker/registry/config.yml registry:2

這裡有個config.yml掛載,是啟動倉庫時需要的一些引數,下面是我的config.yml檔案:

version: 0.1
log:
  fields:
    service: registry
storage:
  delete:
    enabled: true
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

私有倉庫映象刪除需要配置一個引數項是storage-delete-enable: true,預設是false。

docker倉庫在2.1版本之後支援映象api刪除,但這個只是對元資料進行刪除,不會對層資料進行刪除,不過在2.4版本之後支援垃圾回收,可以刪除未被引用的層數。

下面我們來對剛剛上傳的tomcat映象進行刪除: 在這裡插入圖片描述 官網上面說可以對映象進行刪除,需要拿到name和digest。name我們是知道的,只要獲取digest即可。 獲取digest的方式是

curl -XGET -I --header "Accept: application/vnd.docker.distribution.manifest.v2+json" 10.104.233.50:5000/v2/tomcat/manifests/latest

結果可以看到 在這裡插入圖片描述 這裡需要注意的是頭部內容(–header “Accept: application/vnd.docker.distribution.manifest.v2+json” )是必須的,否則的話請求也可以成功,但是無法獲取正確的digest。

現在digest已經拿到,我們可以嘗試刪除映象

curl -XDELETE 10.104.233.50:5000/v2/tomcat/manifests/sha256:9ef634cce472273e2a0dda2ea8a166c3772c5723c8d621bfb6138915cf285de4

執行命令成功,校驗

curl -XGET 10.104.233.50:5000/v2/tomcat/tags/list

可以觀察到tomcat的tags為null。 在這裡插入圖片描述 走到這裡看似已經刪除成功,但其實只是刪除了元資料,還需要對registry裡面的層資料進行刪除。 檢視容器執行狀態

docker ps -a 

獲取需要的容器id,我這邊是68522b6a6d7f 在這裡插入圖片描述 進入容器

docker exec -it 68522b6a6d7f sh

進入容器之後

[email protected]:/etc/docker# docker exec -it 68522b6a6d7f sh
/ # 
/ # cd /var/lib/registry/
/var/lib/registry # du -sch
229.0M	.
229.0M	total
/var/lib/registry # registry garbage-collect /etc/docker/registry/config.yml
/var/lib/registry # du -sch
46.0M	.
46.0M	total

可以看到在執行完garbage-collect命令之後佔用的記憶體空間明顯變小了許多,達到了我們的目的。

以上全部是參照各路大神的帖子,自己操作一番之後寫下來的。最後一個是我自己的理解,僅當參考。

完成了上述步驟之後,用

curl -XGET 10.104.233.50:5000/v2/_catalog

命令去請求,還是可以發現tomcat的註冊資訊條目存在

[email protected]:~# curl 10.104.233.50:5000/v2/_catalog
{"repositories":["httpd","tomcat"]}

進入啟動容器時倉庫掛載目錄,我這裡是 /app/env/docker/registry,然後把tomcat資料夾刪除,再請求一次

curl -XGET 10.104.233.50:5000/v2/_catalog

可以看到tomcat條目已經不存在了

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

至此大功告成。