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"]}
至此大功告成。