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
再次执行删除命令,删除成功来源:CSDN
作者:两年经验的小码农
链接:https://blog.csdn.net/qq_39623859/article/details/79752803