如题,参考 Docker 官网 Deploy a registry server

1. 启动官方 registry 镜像

docker run -d -p 5000:5000 --restart=always --name docker-registry -v /path/to/registry:/var/lib/registry -e REGISTRY_STORAGE_DELETE_ENABLED=true registry

REGISTRY_STORAGE_DELETE_ENABLED=true 是用来运行删除 registry 上的镜像,最后会介绍用法

可用如下命令查看所有 image,当然也可以直接进入文件夹

curl [myregistrydomain.com]:5000/v2/_catalog

2. 配置 Insecure mode

默认 docker registry 是需要配置 tls 的,如果着急使用或者测试的话可以配置非安全模式,参考 Test an insecure registry

注意需要为所有 docker client 配置:

$ sudo vi /etc/docker/daemon.json

{
  "insecure-registries" : ["myregistrydomain.com:5000"]
}

重启 docker engine

$ sudo systemctl restart docker

3. 测试命令

$ docker tag [image_name] [myregistrydomain.com]:5000/[image_name]
$ docker push [myregistrydomain.com]:5000/[image_name]
$ docker rmi [myregistrydomain.com]:5000/[image_name]
$ docker pull [myregistrydomain.com]:5000/[image_name]

4. 删除 registry 上的 image

如果需要删除 registry 上 image 的功能,需要加上 REGISTRY_STORAGE_DELETE_ENABLED=true 的环境变量(启动时已加)。

删除的具体过程比较繁琐(主要是文件夹结构复杂),所以写成一个脚本执行:

$ vi rm-remote-image.sh
#!/bin/bash

image=$1
tag=$2
imsha=`cat /path/to/registry/docker/registry/v2/repositories/$image/_manifests/tags/$tag/current/link`
curl -X DELETE [myregistrydomain.com]:5000/v2/$image/manifests/$imsha
docker exec docker-registry registry garbage-collect /etc/docker/registry/config.yml
docker exec docker-registry rm -rf /var/lib/registry/docker/registry/v2/repositories/$image
:wq

$ chmod +x rm-remote-image.sh

带入 image 相关参数运行删除脚本即可:

./rm-remote-image.sh [image-name] [tag]

* 注意 image-name 不要加 domain