Docker私服搭建及上传自己镜像到私服仓库

一、上传镜像到官方Docker Hub 上

Docker默认仓库地址是Docker Hub官网地址,要将镜像上传到官方公共仓库,首先要有一个帐号,注册地址:

https://hub.docker.com <https://hub.docker.com/>

注册成功后,先登录docker login按照提示输入用户名和密码,登录成功,然后上传自己的镜像,例如我要上传 java:exampledocker 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/
<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再次执行删除命令,删除成功