Docker私服搭建及上傳自己鏡像到私服倉庫
一、上傳鏡像到官方Docker Hub 上
Docker默認倉庫地址是Docker Hub官網地址,要將鏡像上傳到官方公共倉庫,首先要有一個帳號,註冊地址:
註冊成功後,先登錄
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
再次執行刪除命令,刪除成功