docker registry帶ssl認證的私有倉庫搭建

1.首先docker pull registry默認下載最新版的鏡像,我這邊是2.6.2版本這裏寫圖片描述
2.這邊考慮私有倉庫部署的服務器可能沒有網絡,可以使用docker save -o registry.tar registry:2.6.2保存一個鏡像,然後把registry.tar打包到部署包裏面,下次使用docker load -i registry.tar加載到本地鏡像
3.保證ssl已安裝,且/ect/ssl/openssl.cnf中關於生成密碼定義的字段都有(網上可以查)

docker run --entrypoint htpasswd registry:2.6.2 -Bbn ${username} ${password} > ${dir}/auth/htpasswd openssl req -x509 -days 3650 -subj "/C=CN/ST=GuangDong/L=ShenZhen/CN=Registry/O=Company/CN=test.io/" -nodes -newkey rsa:2048 -keyout ${dir}/certs/registry.key -out ${dir}/certs/registry.crt

4.這裏username password是你要設置ssl認證通過的用戶名和密碼,這裏需要你自己記住的幾個目錄dir下的auth,certs,data。auth是存放你生成的用戶名密碼文件,certs是存放生成的證書文件,data後續準備用來掛載私有倉庫的鏡像存放目錄的

docker run -d -p 5000:5000 --privileged=true --restart=always --name ${name} \
-v ${dir}/config.yml:/etc/docker/registry/config.yml \
-v ${dir}/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=registry on test.io" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v ${dir}/certs:/certs \
-v ${dir}/data:/var/lib/registry \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.key registry:2.6.2

這裏的name是你要創建的私有倉庫容器的名字,從掛載的三個目錄我們可以看到是爲了一一對應私有倉庫容器內的目錄結構的。這裏我們可以看到私有倉庫容器內存放鏡像的目錄爲/var/lib/registry。這裏說一下config.yml的映射原因:

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

相比默認配置文件增加了delete:enabled:true選項,這是爲了後面使用remote api支持刪除鏡像的,後面再說,到這裏私有倉庫就建好了。
5.現在要想使用私有倉庫連接私有倉庫並下載鏡像查詢刪除鏡像,你的主機需要的條件
/etc/hosts需要有xx.xx.xx.xx test.io的對應關係
/etc/ssl目錄下有certs目錄
你要在你的/etc/docker/certs.d目錄下新建一個文件夾,命名爲test.io:5000,然後把私有倉庫${dir}/certs目錄下的registry.crt證書拷貝到test.io:5000文件夾下(我這裏的crt證書名字是registry.crt看上面生成的shell),最後我們使用docker login -u username -p password test.io:5000登陸。就可以開始使用私有倉庫了。
6.如果你要上傳鏡像的話可以
docker tag test:latest test.io:5000/test:1.0
docker push test.io:5000/test:1.0
7.如果你要下載鏡像的話可以
docker pull test.io:5000/test:1.0
8.現在要重點說v2版本之後的remote api改變
查詢有哪些鏡像:curl -s –insecure –user username:password https://test.io:5000/v2/_catalog
這裏curl使用了-s選項,因爲有些情況下會出現%Total %Received %Xferd這些狀態信息
這裏寫圖片描述
查詢鏡像有哪些tag:curl -s –insecure –user username:password https://test.io:5000/v2/image_name/tags/list
刪除鏡像:curl –header “Accept: application/vnd.docker.distribution.manifest.v2+json” -I -X HEAD –insecure –user username:password https://test.io:5000/v2/image_name/manifests/image_tag
這裏寫圖片描述
這裏先拿到Docker-Content-Digest的值,後面從sha256都要帶上(注意帶上sha256)
curl –insecure –user username:password -X DELETE https://test.io:5000/v2/image_name/manifests/sha256:1583251f6052c35180381fbf28e93db0b9a26c2971f45532a5263c5dc4d18b61
這樣刪除就完成了。
但是,我測過有一個問題,使用curl刪除之後,你再來使用curl來查詢所有的鏡像它還是存在的,你使用curl查詢這個鏡像的tag你會看到tag變爲了null,然後你pull也是會失敗的。也就是說你刪除鏡像僅僅只是阻止了pull,然後查詢那裏只是讓tag變爲了null。我自己試過把私有倉庫容器的/var/lib/registry/docker/registry/v2/repositories/下對應鏡像名字的文件夾刪除掉,再查詢就查不到了。最後刪除了鏡像還要回收空間,使用docker exec name bin/registry garbage-collect /etc/docker/registry/config.yml,這裏name是你的私有倉庫容器名字,/var/lib/registry/docker/registry/v2/blob是存放鏡像的地方,使用gc垃圾回收這裏的佔用硬盤大小可以看到質的變化,我們可以在這裏看垃圾回收的效果。

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