docker私有仓库搭建与管理

docker私有仓库

(一) 安装并运行registry

下载registry镜像

docker pull registry:2

运行registry

docker run -d -p 5000:5000 -v /app/env/docker/registry:/var/lib/registry -v /app/env/docker/config.yml:/etc/docker/registry/config.yml registry:2

-p 5000:5000 是主机与docker容器的端口映射
-v 是主机目录挂载到docker容器中,类似虚拟机的共享目录mount,这里的 /app/env/docker/registry是我本地存放镜像的仓库地址,如果不加的默认会存放在/var/lib/registry下,另一个是config.yml,可以对registry容器做一些启动配置。

检查容器启动状态

docker ps -a

在这里插入图片描述
可以看到容器已经正常启动。

(二) 上传和拉取镜像

先从默认仓库拉取任意一个镜像,比如拉取tomcat镜像
在这里插入图片描述
等待全部layer下载成功。
接下来我们要将该镜像推送到自己的私有仓库上,我的registry机器域名是10.104.233.50,你们可以按照你们机器的ip做不同的操作。

docker tag tomcat 10.104.233.50:5000/tomcat

用docker image ls,此时可以看到tomcat镜像有两个标签了
在这里插入图片描述
接下来将tomcat镜像推送到我们的私有仓库上

docker push 10.104.233.50:5000/tomcat

这里可能会出现报错:

The push refers to a repository [10.104.233.50:5000/tomcat7]
unable to ping registry endpoint https://10.104.233.50:5000/v0/
v2 ping attempt failed with error: Get https://10.104.233.50:5000/v2/: http: server gave HTTP response to HTTPS client
v1 ping attempt failed with error: Get https://10.104.233.50:5000/v1/_ping: http: server gave HTTP response to HTTPS client

出现上面错误的原因分析:
因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。
为了解决这个问题,需要在启动docker server时增加启动参数为默认使用http访问。
找到docker.service文件,centos上默认是在/var/lib/systemd/system/docker.service,ubuntu上默认是在/lib/systemd/system/docker.service。
以ubuntu为例,打开docker.service,可以看到
在这里插入图片描述
在/etc/default/docker文件下配置DOCKER_OPTS变量
在这里插入图片描述
然后重启docker,运行registry容器即可。
再push一次

docker push 10.104.233.50:5000/tomcat

可以看到正常push镜像了,等待执行完毕即可。
在这里插入图片描述
校验一下镜像是否push成功

curl -XGET 10.104.233.50:5000/v2/_catalog

在这里插入图片描述
可以看到在我们搭建的私有仓库上已经有tomcat这个镜像了。

(三)删除私有仓库上的镜像

在上面我们提到启动registry

docker run -d -p 5000:5000 -v /app/env/docker/registry:/var/lib/registry -v /app/env/docker/config.yml:/etc/docker/registry/config.yml registry:2

这里有个config.yml挂载,是启动仓库时需要的一些参数,下面是我的config.yml文件:

version: 0.1
log:
  fields:
    service: registry
storage:
  delete:
    enabled: true
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

私有仓库镜像删除需要配置一个参数项是storage-delete-enable: true,默认是false。

docker仓库在2.1版本之后支持镜像api删除,但这个只是对元数据进行删除,不会对层数据进行删除,不过在2.4版本之后支持垃圾回收,可以删除未被引用的层数。

下面我们来对刚刚上传的tomcat镜像进行删除:
在这里插入图片描述
官网上面说可以对镜像进行删除,需要拿到name和digest。name我们是知道的,只要获取digest即可。
获取digest的方式是

curl -XGET -I --header "Accept: application/vnd.docker.distribution.manifest.v2+json" 10.104.233.50:5000/v2/tomcat/manifests/latest

结果可以看到
在这里插入图片描述
这里需要注意的是头部内容(–header “Accept: application/vnd.docker.distribution.manifest.v2+json” )是必须的,否则的话请求也可以成功,但是无法获取正确的digest。

现在digest已经拿到,我们可以尝试删除镜像

curl -XDELETE 10.104.233.50:5000/v2/tomcat/manifests/sha256:9ef634cce472273e2a0dda2ea8a166c3772c5723c8d621bfb6138915cf285de4

执行命令成功,校验

curl -XGET 10.104.233.50:5000/v2/tomcat/tags/list

可以观察到tomcat的tags为null。
在这里插入图片描述
走到这里看似已经删除成功,但其实只是删除了元数据,还需要对registry里面的层数据进行删除。
查看容器运行状态

docker ps -a 

获取需要的容器id,我这边是68522b6a6d7f
在这里插入图片描述
进入容器

docker exec -it 68522b6a6d7f sh

进入容器之后

root@VM-233-50-ubuntu:/etc/docker# docker exec -it 68522b6a6d7f sh
/ # 
/ # cd /var/lib/registry/
/var/lib/registry # du -sch
229.0M	.
229.0M	total
/var/lib/registry # registry garbage-collect /etc/docker/registry/config.yml
/var/lib/registry # du -sch
46.0M	.
46.0M	total

可以看到在执行完garbage-collect命令之后占用的内存空间明显变小了许多,达到了我们的目的。

以上全部是参照各路大神的帖子,自己操作一番之后写下来的。最后一个是我自己的理解,仅当参考。

完成了上述步骤之后,用

curl -XGET 10.104.233.50:5000/v2/_catalog

命令去请求,还是可以发现tomcat的注册信息条目存在

root@VM-233-50-ubuntu:~# curl 10.104.233.50:5000/v2/_catalog
{"repositories":["httpd","tomcat"]}

进入启动容器时仓库挂载目录,我这里是 /app/env/docker/registry,然后把tomcat文件夹删除,再请求一次

curl -XGET 10.104.233.50:5000/v2/_catalog

可以看到tomcat条目已经不存在了

root@VM-233-50-ubuntu:~# curl 10.104.233.50:5000/v2/_catalog
{"repositories":["httpd"]}

至此大功告成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值