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"]}
至此大功告成。