天天看點

Docker 搭建私有倉庫

如果不想用私有鏡像庫,你可以用docker的庫 https://hub.docker.com

環境準備

環境:兩個裝有Docker 17.09.0-ce 的centos7虛拟機

虛拟機一:192.168.0.154 使用者開發機

虛拟機二:192.168.0.153 用作私有倉庫

搭建私有倉庫

在153機器上下載下傳registry鏡像

docker pull registry

下載下傳完之後我們通過該鏡像啟動一個容器

docker run -d -p 5000:5000 registry

預設情況下,會将倉庫存放于容器内的/tmp/registry目錄下,這樣如果容器被删除,則存放于容器中的鏡像也會丢失,是以我們一般情況下會指定本地一個目錄挂載到容器内的/tmp/registry下,

不過具體的情況還是要到容器裡去看

先啟動容器

docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

b4c21ca8cf8a23ea72e0471909742541ffc312ea5cf492486b5bdc3130179864

Docker 搭建私有倉庫

可以看到容器存放位置不在/tmp 下

我們接着來查找下,挂載位置到底在哪裡

Docker 搭建私有倉庫

可以看到registry 挂載目錄是 在 /var/lib/registry 下

我們重新啟動下 registry

docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry  -v /data/config.yml:/etc/docker/registry/config.yml  registry 

/data/config.yml 這個是什麼呢?我們在下面删除倉庫鏡像介紹

這裡需要說明一點,在啟動倉庫時,需在配置檔案中的storage配置中增加delete=true配置項,允許删除鏡像。預設的鏡像是沒有這個參數

cat 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:

    interval: 10s

    threshold: 3

可以看到我們啟動了一個容器,位址為:192.168.0.153:5000。

測試

接下來我們就要操作把一個本地鏡像push到私有倉庫中。首先在153機器下pull一個比較小的鏡像來測試(此處使用的是busybox)。

docker pull busybox

接下來修改一下該鏡像的tag。

docker tag busybox 192.168.0.153:5000/busybox

接下來把打了tag的鏡像上傳到私有倉庫。

docker push 192.168.0.153:5000/busybox

可以看到 push 失敗:

Error: Invalid registry endpoint https://192.168.0.153:5000/v1/: Get https://192.168.0.153:5000/v1/_ping: dial tcp 192.168.0.153:5000: connection refused. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 192.168.112.136:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/192.168.0.153:5000/ca.crt

因為Docker從1.3.X之後,與docker registry互動預設使用的是https,然而此處搭建的私有倉庫隻提供http服務,是以當與私有倉庫互動時就會報上面的錯誤。為了解決這個問題需要在啟動docker server時增加啟動參數為預設使用http通路。修改docker啟動配置檔案:

vim  /usr/lib/systemd/system/docker.service

找到ExecStart

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.0.153:5000

紅色字型為添加的

重新開機docker:

systemctl daemon-reload

systemctl restart docker

重新開機完之後我們再次運作推送指令,把本地鏡像推送到私有伺服器上。

接下來我們從私有倉庫中pull下來該鏡像。

sudo docker pull 192.168.0.153:5000/busybox

檢視鏡像

# curl -XGET http://registry:5000/v2/_catalog

# curl -XGET http://registry:5000/v2/image_name/tags/list

Registry删除鏡像、垃圾回收

Docker倉庫在2.1版本中支援了删除鏡像的API,但這個删除操作隻會删除鏡像中繼資料,不會删除層資料。在2.4版本中對這一問題進行了解決,增加了一個垃圾回收指令,删除未被引用的層資料

打包上傳鏡像

[root@master scripts]# docker tag alpine:v1 192.168.0.153:5000/fbgweb:v1

[root@master scripts]# docker push 192.168.0.153:5000/fbgweb:v1

The push refers to a repository [192.168.0.153:5000/fbgweb]

e30c8796115a: Pushed

9922d8737f34: Pushed

c3cc0aba53da: Pushed

f73b42f6c905: Pushed

4a3fe911d00f: Pushed

187a385eda60: Pushed

0e23c00d0c30: Pushed

d221a7f5318b: Pushed

7e2d3752fd4f: Pushed

v1: digest: sha256:6a67ba482a8dd4f8143ac96b1dcffa5e45af95b8d3e37aeba72401a5afd7ab8e size: 2204

檢視倉庫鏡像 (檢視倉庫鏡像

腳本 get.py

[root@master scripts]# python get.py                          192.168.0.153:5000/fbgweb:v1192.168.0.153:5000/nginx:1.7.9192.168.0.153:5000/nginx:1.8

檢視資料進行倉庫容器中,通過du指令檢視大小

[root@master ~]# docker exec -it f70d0c79e6d546d4 sh

~ # du  -chs  /var/lib/registry/

182.4M  /var/lib/registry/

182.4M  total

删除鏡像

删除鏡像對應的API如下:

DELETE /v2//manifests/

name:鏡像名稱

reference: 鏡像對應sha256值

發送請求,删除剛才上傳的鏡像

[root@master scripts]#  curl -I -X DELETE http://192.168.0.153:5000/v2/fbgweb/manifests/sha256:6a67ba482a8dd4f8143ac96b1dcffa5e45af95b8d3e37aeba72401a5afd7ab8e

HTTP/1.1 202 Accepted

Docker-Distribution-Api-Version: registry/2.0

X-Content-Type-Options: nosniff

Date: Mon, 13 Nov 2017 13:04:24 GMT

Content-Length: 0

Content-Type: text/plain; charset=utf-8

[root@master scripts]# python get.py

192.168.0.153:5000/nginx:1.7.9

192.168.0.153:5000/nginx:1.8

192.168.0.153:5000/nginx:latest

可以看到鏡像索引已經被删除

檢視資料大小

可以看到資料大小沒有變化(隻删除了中繼資料)

垃圾回收

進行容器執行垃圾回收指令

~ # registry garbage-collect /etc/docker/registry/config.yml

31 blobs marked, 5 blobs eligible for deletion

blob eligible for deletion: sha256:5e7cf06c8745d0985f94191c60aad8b87371c8a674162525bff0efccdb805931

INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/5e/5e7cf06c8745d0985f94191c60aad8b87371c8a674162525bff0efccdb805931  go.version=go1.7.6 instance.id=c38f4c35-9914-4b77-a59f-ea584137fae0

blob eligible for deletion: sha256:6a67ba482a8dd4f8143ac96b1dcffa5e45af95b8d3e37aeba72401a5afd7ab8e

INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/6a/6a67ba482a8dd4f8143ac96b1dcffa5e45af95b8d3e37aeba72401a5afd7ab8e  go.version=go1.7.6 instance.id=c38f4c35-9914-4b77-a59f-ea584137fae0

blob eligible for deletion: sha256:966e2fb5980b2a854c03551418af0b2ee2bef082dfaae075026d00fa36620960

INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/96/966e2fb5980b2a854c03551418af0b2ee2bef082dfaae075026d00fa36620960  go.version=go1.7.6 instance.id=c38f4c35-9914-4b77-a59f-ea584137fae0

blob eligible for deletion: sha256:a122ad1ef7a033582abfc7bae980cc11bdcc2d19bed7d8ea5b7efc50d16456c8

INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/a1/a122ad1ef7a033582abfc7bae980cc11bdcc2d19bed7d8ea5b7efc50d16456c8  go.version=go1.7.6 instance.id=c38f4c35-9914-4b77-a59f-ea584137fae0

blob eligible for deletion: sha256:b29205236f1d3eb6143e95f3a412a8f21a16a10b09c7aee28ecba3d803832285

INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/b2/b29205236f1d3eb6143e95f3a412a8f21a16a10b09c7aee28ecba3d803832285  go.version=go1.7.6 instance.id=c38f4c35-9914-4b77-a59f-ea584137fae0

159.5M  /var/lib/registry/

159.5M  total

可以看到鏡像資料已被删除