centos7.4 docker 1.13.1

mkdir /registry-var

mkdir /registry-var/my_registry

docker run --restart=always --name registry -d -p 5000:5000 -v /registry-var/my_registry:/var/lib/registry registry

push到该容器的镜像会保存在宿主机的/registry-var/my_registry下 如果使用比如nfs 分布式的存储等大概 就能双活了

registry版本默认就是v2的了 并且我试验下来 镜像保存目录不是很多文章里的tmp 而是/var/lib

Create or modify /etc/docker/daemon.json

{ "insecure-registries":["192.168.2.200:5000"] }

注意 192.168.2.200是我仓库的ip 也可以是域名,请勿照抄。 如果使用域名配合内部dns 加速分布式存储 应该就能多仓库实例多活了 (或者双docker+虚ip方案灾备高可用) 注意:1.12以后 这里这个json文件会影响是否能登录http而非https的仓库,如果你的仓库是http的,没在这个json文件里加上端口域名或者ip,会报: Error response from daemon: Get https://registry.x.com:5000/v2/: http: server gave HTTP response to HTTPS client 这个错

加了以后就可以http协议登陆而不用把服务器端改成https systemctl restart docker.service

完美解决。

上传到私有仓库示例:

首先存在 比如centos 镜像

然后重新tag标记

docker tag centos 192.168.2.200:5000/centos

然后就可以推送到私库了

docker push 192.168.2.200:5000/centos

下载示例:

docker pull 192.168.2.200:5000/centos

补充方案:

下面是老的docker 大概1.10以前的做法 在1.12没用了

vi /usr/lib/systemd/system/docker.service

改这句 加后缀参数

ExecStart=/usr/bin/dockerd --insecure-registry=192.168.2.200:5000

[root@localhost ~]# systemctl daemon-reload [root@localhost ~]# systemctl restart docker.service

查询有哪些镜像:(registry.x.com:5000是我假定的镜像地址和端口,-u是用户名密码)

curl -u xxx:123abc -X GET http://registry.x.com:5000/v2/_catalog

返回:{"repositories":["centos"]}

centos是我测试上传的一个centos最新版的镜像

查看一个镜像有哪些tag 也就是版本吧

curl -u xxx:123abc -X GET http://registry.x.com:5000/v2/centos/tags/list

返回

{"name":"centos","tags":["latest"]}

目前我只有唯一的tag latest

构建仓库用的密码文件:username 123abc是用户名密码

docker run --entrypoint htpasswd registry -Bbn username 123abc >> /registry-var/auth/htpasswd)

下面是完整的加上自定义配置文件、存储目录的命令了:

docker run -d -p 5000:5000 --restart=always -v /registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -v /registry-var/my_registry:/var/lib/registry/ -v /registry-var/config.yml:/etc/docker/registry/config.yml --name registry registry

docker run -d -p 5000:5000 --restart=always -v /registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" -e "REGISTRY_STORAGE_DELETE_ENABLED=true" -v /registry-var/my_registry:/var/lib/registry/ --name registry registry

登陆测试:

docker login -u 用户名-p 密码 registry.x.com:5000

出来Login Succeeded

就是成功了 可以随意push和pull了 当然 要加上registry.x.com:5000

比如 docker pull registry.x.com:5000/centos

删除镜像

首先获取镜像名和tag

获取到镜像名列表

curl -u xxx:123abc -X GET http://registry.x.com:5000/v2/_catalog

{"name":"centos","tags":["latest"]}

name就是景象名 tag 就是tag了 连接起来 用: 才是具体的某个镜像

根据镜像名获取tag列表 这里是镜像名centos 为例

curl -u xxx:123abc -X GET http://registry.x.com:5000/v2/centos/tags/list

然后获取digest_hash参数

curl -u xxx:123abc --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://registry.x .com:5000/v2/centos/manifests/latest

拿到:

{ "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "config": { "mediaType": "application/vnd.docker.container.image.v1+json", "size": 1833, "digest": "sha256:3bee3060bfc81c061ce7069df35ce090593bda584d4ef464bc0f38086c11371d" }, "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 72267384, "digest": "sha256:d3aeceeb0289bf97c2474366cfcdaf66e29b409d45d6ed91be3335f16915f1b0" } ]

根据某个sha删除

(失败 表现为第二次运行可以发现不同的回复信息 表示找不到

{"errors":[{"code":"MANIFEST_UNKNOWN","message":"manifest unknown"}]}

但是实际并无效果的样子

curl -u xxx:123abc -X DELETE http://registry.x.com:5000/v2/centos/manifests/sha256:3bee3060bfc81c061ce7069df35ce090593bda584d4ef464bc0f38086c11371d

启动仓库容器的时候 加 -e "REGISTRY_STORAGE_DELETE_ENABLED=true"可以使得这句话第一次运行不报错 否则报错 说不支持的操作, 配置文件加不上delete 加了就报错{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]})

删除只能借助官网提供的第三方脚本了 curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null sudo chmod a+x /usr/local/bin/delete_docker_registry_image

回收数据(失败 配置文件加不上delete 加了报错 不加能运行但是并未删除文件)

docker exec -it registry sh 进入registry容器内

在容器内执行:

registry garbage-collect config.yml

下面来自摘录:

使用第三方删除工具: 参考资料:https://github.com/burnettk/delete-docker-registry-image

安装: curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null sudo chmod a+x /usr/local/bin/delete_docker_registry_image

指定本地仓库的路径,这里用环境变量没有起作用,所以使用了软连接方式 sudo ln -s /docker_registry_dir/registryDir /opt/registry_data

如果没有指定你的registry_data目录,我使用了find find / -type f -name "v2" /var/lib/docker/volumes/8db47bbca74b1f70edb1be76adbe6b7b84bc78b893bc731e0393736d8cdc8844/_data/docker/registry/v2

删除指定tag sudo /usr/local/bin/delete_docker_registry_image --image mysql:latest 此时: sudo curl --cacert /docker_registry_dir/certs/domain.crt --basic --user admin:admin https://docker.registry.server:5000/v2/_catalog

{"repositories":["mysql","swarm"]}

我的效果是:

看到mysql还在,但是其下面对应的tag已经不见了:

sudo curl --cacert /docker_registry_dir/certs/domain.crt --basic --user admin:admin https://docker.registry.server:5000/v2/mysql/tags/list

{"name":"mysql","tags":null}

删除指定仓库 sudo /usr/local/bin/delete_docker_registry_image --image mysql 删除成功 sudo curl --cacert /docker_registry_dir/certs/domain.crt --basic --user admin:admin https://docker.registry.server:5000/v2/_catalog

{"repositories":["swarm"]}

[root@OPS-Test delete-docker-registry-image]# ./clean_old_versions.py --image --registry-url centos7.5.1804.basic http://localhost:5000/ /usr/lib/python2.7/site-packages/requests/init.py:80: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version! RequestsDependencyWarning) usage: clean_old_versions.py [-h] [-e EXCLUDE] [-E INCLUDE] -i IMAGE [-v] [-u REGISTRY_URL] [-s SCRIPT_PATH] [-l LAST] [-b BEFORE] [-a AFTER] [-o {name,date}] [-U USER] [-P PASSWORD] [--no_check_certificate] [--dry-run] clean_old_versions.py: error: unrecognized arguments: http://localhost:5000/

上面的报错是因为为兼容导致,通过下面的命令来解决。 pip uninstall urllib3 pip uninstall chardet pip install requests