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中的示例。