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

℡╲_俬逩灬. 提交于 2019-12-07 14:35:59

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
再次执行删除命令,删除成功





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!