Docker私有仓库

  本文主要详细介绍一下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.json

1
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
2
delete:
enabled: true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

修改config.yml的配置的步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
docker 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
3
curl --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
4
docker 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
4
du -sch
cd /var/lib/registry
registry garbage-collect /etc/docker/registry/config.yml
du -sch

查看镜像

1
2
curl -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
4
docker 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