本文主要详细介绍一下Docker私有仓库的建立,Docker不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有仓库,提供镜像资源,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。
1.私有仓库搭建与配置
(1)拉取私有仓库镜像1
docker pull registry
(2)启动私有仓库容器1
docker run -di --name=registry -p 5000:5000 registry
(3)打开浏览器 输入地址http://192.168.184.141:5000/v2/_catalog看到`{"repositories":[]}` 表示私有仓库搭建成功并且内容为空
(4)修改daemon.json1
vim /etc/docker/daemon.json
添加以下内容,保存退出。1
{"insecure-registries":["192.168.184.141:5000"]}
此步用于让 docker信任私有仓库地址
(5)重启docker 服务1
systemctl restart docker
2.镜像上传至私有仓库
(1)标记此镜像为私有仓库的镜像1
docker tag jdk1.8 39.96.38.187:5000/jdk1.8:1.8
(2)再次启动私服容器1
docker start registry
(3)上传标记的镜像1
docker push 39.96.38.187:5000/jdk1.8:1.8
3.私有仓库镜像的删除
首先,在默认情况下,docker registry 是不允许删除镜像的,需要在配置config.yml中启用:1
2delete:
enabled: true
1 | version: 0.1 |
修改config.yml的配置的步骤1
2
3
4
5
6
7
8
9
10
11
12
13docker exec -it registry /bin/sh
cat /etc/docker/registry/config.yml
vi /etc/docker/registry/config.yml
按字母a进行修改
修改完成后按Esc退出编辑模式
按Shift+: 输入wq退出并保存
exit退出容器
然后,使用 API GET /v2/<镜像名>/manifests/来取得要删除的镜像:Tag所对应的 digest。
Registry 2.3 以后,必须加入头 Accept: application/vnd.docker.distribution.manifest.v2+json,否则取到的 digest 是错误的,这是为了防止误删除。
删除jdk1.8:latest镜像,那么取得 digest 的命令是:1
2
3curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
-I -X HEAD 39.96.38.187:5000/v2/jdk1.8/manifests/1.8 \
| grep Digest
得到结果1
2
3
4 % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 949 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
Docker-Content-Digest: sha256:2da77476de2ee9f14fe5a0aeeb36f7b7f6bb433112cfe9a81867666d244599b8
Docker仓库在2.1版本中支持了删除镜像的API,但这个删除操作只会删除镜像元数据,不会删除层数据。在2.4版本中对这一问题进行了解决,增加了一个垃圾回收命令,删除未被引用的层数据。
进入registry仓库容器中,通过du命令查看大小,可以看到当前仓库数据大小为294.2M。1
2
3
4docker exec -it registry /bin/sh
du -sch
294.2M .
294.2M total
然后调用 API DELETE /v2/<镜像名>/manifests/来删除镜像。比如:1
curl -I -X DELETE http://39.96.38.187:5000/v2/jdk1.8/manifests/sha256:2da77476de2ee9f14fe5a0aeeb36f7b7f6bb433112cfe9a81867666d244599b8
进行容器执行垃圾回收命令1
2
3
4du -sch
cd /var/lib/registry
registry garbage-collect /etc/docker/registry/config.yml
du -sch
查看镜像1
2curl -XGET http://39.96.38.187:5000/v2/_catalog
curl -XGET http://39.96.38.187:5000/v2/jdk1.8/tags/list
删不掉最后一招1
2
3
4docker exec -it registry /bin/sh
cd /var/lib/registry/docker/registry/v2/repositories
ls
rm -rf jdk1.8
相关资料:
http://www.docker.org.cn/faq/global/c83.html#faq87
https://blog.csdn.net/u010884123/article/details/56838644
https://blog.51cto.com/302876016/1966816