registry

如何使用docker的方式,搭建registry私库供自己项目上使用。另外,registry暴露了哪些接口,可以用来搜索镜像呢?

资源

http://www.javashuo.com/article/p-alkhhygq-ng.html

https://www.jianshu.com/p/fbf2ac59d653

docker搭建本地私有仓库

registry,通过find -type d -name current进行搜索,

本地的存储在,宿主机:

/var/lib/docker/volumes/很长一段hash/_data/docker/registry/v2/repositories/base/php-git/_manifests/tags/latest/current

容器内路径:

/var/lib/registry/docker/registry/v2/repositories/base/php-git/_manifests/tags/latest/current

docker pull registry

docker run -d -p 5000:5000 --restart always --name registry registry:latest

Registry 配置用户名密码

# 建立一个存放密码的文件
$mkdir auth
# 存入用户名:root,密码:123456
docker run --entrypoint htpasswd registry:2 -Bbn root 123456 > auth/htpasswd
# 查看生成结果
# myuser:$2y$05$8IpPEG94/u.gX4Hn9zDU3.6vru2rHJSehPEZfD1yyxHu.ABc2QhSa
cat auth/htpasswd
# 使用用户启动
docker run -d -p 5000:5000 --restart=always --name registry_private  -v `pwd`/auth:/auth  -e "REGISTRY_AUTH=htpasswd"  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd"  registry:2
# 登陆私有仓库
docker login localhost:5000
# 等出
docker logout

Registry操做

镜像打tag指定仓库mysql

docker tag mysql 192.168.204.71:5000/mysql:1.0.0

推送一个镜像到registrysql

# docker push <registry_ip>:<registry_port>/<image_name>:<image_tag>
docker push 192.168.37.100:5000/busybox:0.0.1

从registry拉取一个镜像docker

# docker pull <registry_ip>:<registry_port>/<image_name>:<image_tag>
docker pull 192.168.37.100:5000/busybox:0.0.1

搜索镜像

在registry中搜索一个镜像
Registry V2 不支持经过docker search 去搜索镜像。json

若是执行下面的命令会遇到“Error response from daemon: Unexpected status code 404” 的错误。bash

docker search 192.168.37.100:5000/busybox

需要经过Registry V2的REST API去查询。

列出全部的镜像仓库(repositories):curl

# curl -X GET http://<registry_ip>:<registry_port>/v2/_catalog
curl -X GET http://192.168.37.100:5000/v2/_catalog

结果示例:

{"repositories":["busybox"]}

列出指定镜像的全部标签:url

下面的busybox 可以是:other/qingcloud这样的/分隔的名称。

# curl -X GET http://<registry_ip>:<registry_port>/v2/<image_name>/tags/list
curl -X GET http://192.168.37.100:5000/v2/busybox/tags/list

结果示例:

{"name":"busybox","tags":["latest","0.0.1","0.0.2"]}

删除registry中的镜像
删除registry比较复杂,须要先查到指定标签的镜像的digest (sha256校验和),再根据这个digest来删除。spa

下面以删除192.168.37.100:5000/busybox/:0.0.1 镜像为例。rest

先执行如下命令找到该镜像的digest:

curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET  http://192.168.37.100:5000/v2/busybox/manifests/0.0.1 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'

Digest输出例子:

Docker-Content-Digest: sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335

执行如下命令,根据digest删除镜像:

curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE http://192.168.37.100:5000/v2/busybox/manifests/sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335

这里的删除镜像只是删除了一些元数据,须要执行下面的垃圾回收才能真正地从硬盘上删除镜像数据。

由于缺省Docker private registry不容许删除镜像,若是遇到“405 Unsupported” 错误,须要在运行registry容器时设置REGISTRY_STORAGE_DELETE_ENABLED环境变量或参数为true。

docker-compose.yaml 例子:

environment:
   REGISTRY_STORAGE_DELETE_ENABLED: "true"

docker run 例子:

-e REGISTRY_STORAGE_DELETE_ENABLED="true"

垃圾回收
进入registry容器,执行garbage-collect 命令执行垃圾回收。

docker exec -it registry  /bin/registry garbage-collect  /etc/docker/registry/config.yml

搜索脚本

另外,自己编写的搜索脚本,见dockersearch

DOCKER_HUB=10.131.9.15:5000
# 其中n是显示多少条数据    b上一次的数据最后的数据
curl -s http://$DOCKER_HUB/v2/_catalog?n=100000000

# $each image镜像, 如 a01-other/scc、busybox等
curl -s -X GET http://$DOCKER_HUB/v2/$each/tags/list

# 镜像manifests文件 <name> 镜像名称   <reference> 标签
curl -s -X GET http://$DOCKER_HUB/v2/<name>/manifests/<reference>

还有另外一种方式,直接到文件夹中去搜索,具体见find.md中的示例。