Docker私服搭建及上傳自己鏡像到私服倉庫

Docker私服搭建及上傳自己鏡像到私服倉庫

一、上傳鏡像到官方Docker Hub 上

Docker默認倉庫地址是Docker Hub官網地址,要將鏡像上傳到官方公共倉庫,首先要有一個帳號,註冊地址:

https://hub.docker.com

註冊成功後,先登錄
docker login
按照提示輸入用戶名和密碼,登錄成功,然後上傳自己的鏡像,例如我要上傳 java:example
docker tag java:example chicu/java:example
我先將鏡像打了一個標籤,相當於重命名一樣,讓名稱儘可能規範
docker push chicu/java:example

二、上傳鏡像到私有倉庫

首先搭建一個docker私有庫服務
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2

docker私服的搭建非常簡單,這裏在啓動鏡像的時候會先去下載registry 2.0,--restart=alwarys 標識當docker daemon啓動的時候一起啓動。這樣一個docker私服就已經創建並啓動好了。

將鏡像上傳到docker私服
docker push localhost:5000/java:my

發現報錯了


由於docker默認鏡像倉庫是dockerhub,所以java:my相當於docker.io/java:my,因此,想要將鏡像推送到私服倉庫中,需要修改鏡像標籤。

docker tag java:my localhost:5000/java:my
修改鏡像標籤後再次執行命令


ok,已經上傳完成,可以看到創建了一個倉庫名叫java,並將鏡像給推送到java倉庫中去了.

 獲取私有倉庫鏡像
docker pull localhost:5000/java:my

對私有倉庫的操作,其提供了HTTP API 地址爲:https://docs.docker.com/registry/spec/api/

查看私服鏡像所有倉庫
curl http://localhost:5000/v2/_catalog

查看倉庫中鏡像的所有標籤列表
curl http://localhost:5000/v2/java/tags/list

   刪除倉庫中的鏡像

由此可以看出API需要一個name參數和一個摘要參數,下面提示說如果是2.3及以後的服務,HEAD 必須包含下面的內容才能獲取到正確的摘要,我們先來獲取這個摘要

curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X HEAD  http://localhost:5000/v2/java/manifests/my

獲取內容如下


刪除鏡像
curl -X DELETE localhost:5000/v2/java/mainfests/sha256:872c787ce4922289a2dcec812d0b1386b8cffc239e58494f398604852369abcc
此時,返回了一個錯誤信息:{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}

這是由於registry默認對刪除操作是不允許的,需要對配置文件進行配置,我們看官方說怎麼配置的


簡單翻譯一下,這裏說是要覆蓋特定的配置參數,可以在docker run 的時候通過-e參數或者dockerfile構建鏡像的時候通過ENV來設置環境變量達到覆蓋配置的目的,下面給出了參數書寫格式,docker的配置文件是yml格式,如上圖所示,如果要覆蓋storage.filesystem.rootdirectory=/var/lib/registry 那麼在-e設置環境變量的時候該參數需要寫成-e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry。

還有一種配置registry的方式


此種方式是完全覆蓋docker默認配置的方式,需要自己創建一個config.yml文件,在run的時候通過-v命令來指定配置文件路徑。

在這裏,我只想能夠刪除鏡像,我選擇的是比較簡單的通過-e參數來覆蓋指定的配置項,首先查看關於刪除的配置屬性

storage:
  filesystem:
    rootdirectory: /var/lib/registry
  azure:
    accountname: accountname
    accountkey: base64encodedaccountkey
    container: containername
  gcs:
    bucket: bucketname
    keyfile: /path/to/keyfile
    rootdirectory: /gcs/object/name/prefix
  s3:
    accesskey: awsaccesskey
    secretkey: awssecretkey
    region: us-west-1
    regionendpoint: http://myobjects.local
    bucket: bucketname
    encrypt: true
    keyid: mykeyid
    secure: true
    v4auth: true
    chunksize: 5242880
    multipartcopychunksize: 33554432
    multipartcopymaxconcurrency: 100
    multipartcopythresholdsize: 33554432
    rootdirectory: /s3/object/name/prefix
  swift:
    username: username
    password: password
    authurl: https://storage.myprovider.com/auth/v1.0 or https://storage.myprovider.com/v2.0 or https://storage.myprovider.com/v3/auth
    tenant: tenantname
    tenantid: tenantid
    domain: domain name for Openstack Identity v3 API
    domainid: domain id for Openstack Identity v3 API
    insecureskipverify: true
    region: fr
    container: containername
    rootdirectory: /swift/object/name/prefix
  oss:
    accesskeyid: accesskeyid
    accesskeysecret: accesskeysecret
    region: OSS region name
    endpoint: optional endpoints
    internal: optional internal endpoint
    bucket: OSS bucket
    encrypt: optional data encryption setting
    secure: optional ssl setting
    chunksize: optional size valye
    rootdirectory: optional root directory
  inmemory:
  delete:
    enabled: false
  cache:
    blobdescriptor: inmemory
  maintenance:
    uploadpurging:
      enabled: true
      age: 168h
      interval: 24h
      dryrun: false
    readonly:
      enabled: false
  redirect:
    disable: false

可以看出其配置屬性爲storage.delete.enabled=false,然後根據文檔來敲命令

docker run --name registry -d -p 5000:5000 -e REGISTRY_STORAGE_DELETE_ENABLED=true registry:2
再次執行刪除命令,刪除成功





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