搭建本地私有镜像仓库(Registry)

主要描述如何进行本地私有镜像仓库。

1. 创建私有镜像仓库

1) 拉取Registry镜像源

通过docker pull来执行下载registry镜像。

$ docker pull registry

Using default tag: latest
latest: Pulling from library/registry
1cc3d825d8b2: Pull complete 
85ab09421e5a: Pull complete 
40960af72c1c: Pull complete 
e7bb1dbb377e: Pull complete 
a538cc9b1ae3: Pull complete 
Digest: sha256:ac0192b549007e22998eb74e8d8488dcfe70f1489520c3b144a6047ac5efbe90
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

2) 查询是否成功下载

$ docker images

REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
registry     latest    75ef5b734af4   12 months ago   25.4MB

3) 启动私有Registry容器

在启动容器前,可以将容器内的数据映射挂载在指定的目录上,比如此处为宿主机的目录:/home/wrs/registry

$ mkdir -p /home/wrs/registry

启动私有Registry容器

$ docker run -d -p 5000:5000 -v /home/wrs/registry:/var/lib/registry --name registry registry
or
$ docker run -d -p 5000:5000 -v /home/wrs/registry:/var/lib/registry --restart=always --name registry registry

参数简要说明:

  • -d: 让容器后台运行
  • -p: 指定映射端口(前者是宿主机的端口号,后台是容器的端口号)
  • -v: 数据挂载目录(前者是宿主机的目录,后台是容器的目录)
  • —-name: 运行容器的命名

检查容器是否成功运行

$ docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED             STATUS             PORTS                                       NAMES
977277b0b8e1   registry   "/entrypoint.sh /etc…"   About an hour ago   Up About an hour   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry

停止容器和删除容器的命令

$ docker stop registry  //停止容器
$ docker rm registry  //删除容器
$ docker ps -a   //查询所有容器
$ docker ps  //查询正在运行的容器

4) 添加私有镜像仓库到docker的配置文件

通常,在/etc/docker/daemon.json中增加私有镜像仓库的信息,例如 "insecure-registries": ["192.168.100.55:5000"]。例如,这儿的地址为宿主机地址。

主要原因是Docker从1.3.X之后,与docker registry交互默认使用的是https,而我们搭建的私有仓库提供的是http,所以需要增加上述的配置。

$ cat /etc/docker/daemon.json

{
        "registry-mirrors": [
                "https://dockerproxy.cn"
        ],
        "insecure-registries": [
                "192.168.100.55:5000"
        ]
}

需要注意本文件的格式,错误将无法启动docker服务。

5) 启动私有镜像仓库容器

由于修改了docker的配置,执行下列命令更新和启动镜像仓库容器。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ sudo docker restart registry
$ docker ps

CONTAINER ID   IMAGE      COMMAND                  CREATED       STATUS         PORTS                                       NAMES
977277b0b8e1   registry   "/entrypoint.sh /etc…"   2 hours ago   Up 4 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry

到此,以上五个步骤完成私有镜像仓库的创建。

2. 私有镜像仓库的操作

1)对现在镜像打标签(tag)

先查询现在镜像,然后对需要上传到私有镜像库的镜像打上标签(tag)。

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        latest    be960704dfac   9 days ago      602MB
mariadb      latest    4b8711c6c639   7 weeks ago     407MB
registry     latest    75ef5b734af4   12 months ago   25.4MB

通过docker tag命令进行,比如选择mariadb镜像。

$ docker tag mariadb:latest 192.168.100.55:5000/mariadb

查询是否已生成新的标签(tag)的镜像。

$ docker images

REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
mysql                         latest    be960704dfac   9 days ago      602MB
mariadb                       latest    4b8711c6c639   7 weeks ago     407MB
192.168.100.55:5000/mariadb   latest    4b8711c6c639   7 weeks ago     407MB
registry                      latest    75ef5b734af4   12 months ago   25.4MB

2)将镜像上传到私有镜像仓库

通过docker push命令来执行。

$ docker push 192.168.100.55:5000/mariadb
Using default tag: latest
The push refers to repository [192.168.100.55:5000/mariadb]
80646396e9da: Pushed 
d6126fa12eee: Pushed 
e6108c62055d: Pushed 
8a5a565932ac: Pushed 
f5dd2ec091d1: Pushed 
ea5b75ace7af: Pushed 
d94d9ea67ca1: Pushed 
a46a5fb872b5: Pushed 
latest: digest: sha256:269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037 size: 1990

3)查看镜像

可以通过浏览器或命令行方式查看到仓库中的所有镜像。

浏览器方式:http://<主机IP>:<端口>/v2/_catalog 即可查看。

示例如下:

http://192.168.100.55:5000/v2/_catalog

命令行方式:curl http://<主机IP>:<端口>/v2/_catalog即可查看。

示例如下:

$ curl http://192.168.100.55:5000/v2/_catalog

{"repositories":["mariadb"]}

4)下载镜像

如果本地已有镜像,可以先删除本地镜像,便于稍后从私有仓库重新下载。

$ docker rmi 192.168.100.55:5000/mariadb:latest

通过docker pull命令来下载镜像。

示例如下:

$ docker pull 192.168.100.55:5000/mariadb

Using default tag: latest
latest: Pulling from mariadb
802008e7f761: Pull complete 
60bf5e4921eb: Pull complete 
d4d47b8d6ea0: Pull complete 
e38fc7e50f91: Pull complete 
725acd03a3bc: Pull complete 
db106334738c: Pull complete 
234171a3de7d: Pull complete 
25efdea61d9c: Pull complete 
Digest: sha256:269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037
Status: Downloaded newer image for 192.168.100.55:5000/mariadb:latest
192.168.100.55:5000/mariadb:latest
$ 
$ docker images
REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
mysql                         latest    be960704dfac   9 days ago      602MB
192.168.100.55:5000/mariadb   latest    4b8711c6c639   7 weeks ago     407MB
registry                      latest    75ef5b734af4   12 months ago   25.4MB

镜像修改名称命令格式:docker tag <镜像id> <新镜像名>:<标签>docker tag <旧镜像名> <新镜像名>

示例如下:

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        latest    be960704dfac   9 days ago      602MB
mariadb      latest    4b8711c6c639   7 weeks ago     407MB
registry     latest    75ef5b734af4   12 months ago   25.4MB

wrs@wrs-VirtualBox:~/registry$ docker tag 4b8711c6c639 mariadb:3.2

wrs@wrs-VirtualBox:~/registry$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        latest    be960704dfac   9 days ago      602MB
mariadb      3.2       4b8711c6c639   7 weeks ago     407MB
mariadb      latest    4b8711c6c639   7 weeks ago     407MB
registry     latest    75ef5b734af4   12 months ago   25.4MB

已加载镜像删除命令格式 docker rmi <镜像名称>:<标签> ,示例如下:

$ docker rmi mariadb:3.2
Untagged: mariadb:3.2

$ docker rmi mariadb:latest
Untagged: mariadb:latest
Untagged: mariadb@sha256:4a1de8fa2a929944373d7421105500ff6f889ce90dcb883fbb2fdb070e4d427e
Deleted: sha256:4b8711c6c639fa9166e6a617c421e2fc43296c8add9a846fe8237b8ac9184d51
Deleted: sha256:7a8ff23f291121f3ca768aff13ec628e90ffb3e96a8c72fda2867011fb634f86
Deleted: sha256:f7b2b6781129cfbe7e38efa8cfbcb7d894553d6df9c549f70371880e26d82d41
Deleted: sha256:d6af9c12f2f2fd328a61afd1aa19b6ee312240be1474e0e4359adb5f3798bb0a
Deleted: sha256:8f10468663247a733cbf81d58181ff894b774a79a3fed2da4d192bbaa9242179
Deleted: sha256:b873f00f1c734fa83877f8170d09b8baa640858ed5f8bdfe95b725ea50fc6efc
Deleted: sha256:e02762a1e0490dcb879e3cd007a64e06daea95d7eb354dcbaeb3ed15be3bfa91
Deleted: sha256:b9e0c994946d669688974a1f38301165698f4c60858c9e64bfcea11a1e895057
Deleted: sha256:a46a5fb872b554648d9d0262f302b2c1ded46eeb1ef4dc727ecc5274605937af

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        latest    be960704dfac   9 days ago      602MB
registry     latest    75ef5b734af4   12 months ago   25.4MB
wrs@wrs-VirtualBox:~/registry$

5)删除私有镜像仓库镜像

方法一:调用Registry接口进行删除 (这个方法好像不能清除对应的数据文件夹,请参考『方法二』)

Step 1: 修改镜像仓库的配置文件

由于registry v2版本的镜像,默认是不允许删除镜像的,所以需要修改配置文件,使之支持删除操作。

提示:如果之前执行过这个操作,则不需要重复执行。

通过下述查询registry容器的ID:

$ docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED       STATUS          PORTS                                       NAMES
977277b0b8e1   registry   "/entrypoint.sh /etc…"   2 hours ago   Up 19 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry

查看配置文件。

$ docker exec -it registry cat /etc/docker/registry/config.yml

version: 0.1
log:
  fields:
    service: registry
storage:
  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
wrs@wrs-VirtualBox:/etc/docker$ 

修改配置文件,在**storage**部分增加delete部分,将enabled设置为true

示例如下:

$ docker exec -it registry vi /etc/docker/registry/config.yml

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
  **delete:
    enabled: true**
http:        
  addr: :5000                        
  headers:                           
    X-Content-Type-Options: [nosniff]
health:          
  storagedriver: 
    enabled: true
    interval: 10s
    threshold: 3

然后重启registry容器,让新的配置生效。命令如下:

$ docker restart registry

Step 2: 查看镜像tag

通过以下命令查询当前镜像仓库中的所有的镜像。

$ curl http://192.168.100.55:5000/v2/_catalog
{"repositories":["mariadb","test/mysql"]}

查询镜像tag,接口请求格式为:

curl <镜像仓库地址>/v2/<镜像名称>/tags/list

示例如下:

$ curl http://192.168.100.55:5000/v2/mariadb/tags/list

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

Step 3: 获取对应tag镜像的digest_hash, 接口请求格式如下:

查询对应tag镜像的digest_hash,接口请求的格式为:

curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET <镜像仓库地址>/v2/<镜像名称>/manifests/<镜像tag>

示例如下:

$ curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET <http://192.168.100.55:5000/v2/**mariadb**/manifests/**latest**>

HTTP/1.1 200 OK
Content-Length: 1990
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Docker-Content-Digest: sha256:269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037"
X-Content-Type-Options: nosniff
Date: Thu, 24 Oct 2024 11:51:12 GMT

记住Docker-Content-Digest后面的值,如: sha256:269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037

Step 5: 删除私有镜像仓库中镜像

删除镜像的接口请求格式为:

curl -I -X DELETE <镜像地址>/v2/<镜像名称>/manifests/<Docker-Content-Digest>

示例如下 :

$ curl -I -X DELETE http://192.168.100.55:5000/v2/mariadb/manifests/sha256:269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037 -v

*   Trying 192.168.100.55:5000...
* Connected to 192.168.100.55 (192.168.100.55) port 5000
> DELETE /v2/mariadb/manifests/sha256:269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037 HTTP/1.1
> Host: 192.168.100.55:5000
> User-Agent: curl/8.5.0
> Accept: */*
> 
< HTTP/1.1 202 Accepted
HTTP/1.1 202 Accepted
< Docker-Distribution-Api-Version: registry/2.0
Docker-Distribution-Api-Version: registry/2.0
< X-Content-Type-Options: nosniff
X-Content-Type-Options: nosniff
< Date: Thu, 24 Oct 2024 13:14:48 GMT
Date: Thu, 24 Oct 2024 13:14:48 GMT
< Content-Length: 0
Content-Length: 0

< 
* Connection #0 to host 192.168.100.55 left intact

Step 6: 执行垃圾回收,清理镜像文件

清理镜像的命令格式为:

docker exec -it <镜像仓库容器ID/名称> /bin/registry garbage-collect <镜像仓库配置文件>

示例如下:

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

mariadb
mariadb: marking manifest sha256:269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037 
mariadb: marking blob sha256:4b8711c6c639fa9166e6a617c421e2fc43296c8add9a846fe8237b8ac9184d51
mariadb: marking blob sha256:802008e7f7617aa11266de164e757a6c8d7bb57ed4c972cf7e9f519dd0a21708
mariadb: marking blob sha256:60bf5e4921ebf40cdeb9808d25882e73722afca373a3b3f38ecf24f105d817ea
mariadb: marking blob sha256:d4d47b8d6ea097dcf6c6d64ef12fa26e71fd141d72991e8fd24229b45c708c6b
mariadb: marking blob sha256:e38fc7e50f91c37a0d822eeee9b8edc4a8fc386ca6db4709ec73ffdc15b1f52e
mariadb: marking blob sha256:725acd03a3bc5090a20483353b8e4cd62df0a69d49d852ee5201a85b8622a092
mariadb: marking blob sha256:db106334738c626481137264559382cb5bd33a57bd8ae1a08abc4190af7719fb
mariadb: marking blob sha256:234171a3de7d7b4a5b3db938740204e157ec3d0d0ab13db1a9f7037f150d62d3
mariadb: marking blob sha256:25efdea61d9c3a2a5455155d0ccf1fea3169802cae37cfa5bb07cb5708716961
test/mysql
test/mysql: marking manifest sha256:caf5feb0e8e5c5b7873085e1df0fdb10903d9cda62f9bd36098b580671b1a18e 
test/mysql: marking blob sha256:be960704dfac8744a2e2df80c90087551a998ac008916b9d1423d7b0c5ee33ea
test/mysql: marking blob sha256:eba3c26198b76ce92acfa6308130ab3224ee9fff583c51487a8caa0336d59e4e
test/mysql: marking blob sha256:97f7c8c33abe1138c12d45d7a453df15f348b13043bbdc1c5bbe95e07dfa6403
test/mysql: marking blob sha256:aa23d877fa04f2edd527357b3a38ac6199bfdc0e7b09b3b64f9424528a168e03
test/mysql: marking blob sha256:a143609ddd2d82d253ae60d2f6604cdc7df34ed671b0e24707c31a78800ee88c
test/mysql: marking blob sha256:78308a3437c4e14b44bb662c504c2a8c1b2ef7142207787bea32157cc91e3fe9
test/mysql: marking blob sha256:c0880e4b37373adae469fec17a9d0947481f0a105bd70a901556aaa66ff6f246
test/mysql: marking blob sha256:4bab267f9ce1d6b904aeec7a381caf991e717163fb9f56a67d347f9c1927bd2a
test/mysql: marking blob sha256:e575f6d9b17aa2a17b5604b104d60f453cc7f7944980cb645be85bcf31805494
test/mysql: marking blob sha256:607f86c00053926c764f5761ea2f19822ab243ed23cd1eff55b0d61deabb46d4
test/mysql: marking blob sha256:cd68caa5febee3feb96495599d9f764927c0feed19ba48664a94ab33731351ca

22 blobs marked, 0 blobs and 0 manifests eligible for deletion

Step 7: 重启私有镜像容器

执行下述命令重新启动私有镜像容器。

$ docker restart registry

检查文件是否已删除

$ curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET <http://192.168.100.55:5000/v2/**mariadb**/manifests/**latest**>

HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Thu, 24 Oct 2024 09:43:00 GMT
Content-Length: 96

方法二:直接删除镜像的repositories

Step 1: 打开镜像的存储目录,删除镜像文件夹,格式为:

docker exec <私有镜像仓库> /bin/rm -rf /var/lib/registry/docker/registry/v2/repositories/<镜像名称>

示例如下:

$ docker exec -it registry /bin/ls -l /var/lib/registry/docker/registry/v2/repositories
total 8
drwxr-xr-x    5 root     root          4096 Oct 24 11:23 mariadb
drwxr-xr-x    3 root     root          4096 Oct 24 07:16 test

$ docker exec registry /bin/rm -rf /var/lib/registry/docker/registry/v2/repositories/mariadb

Step 2: 执行垃圾回收,清理镜像文件,命令格式为:

docker exec <镜像仓库容器ID/名称> /bin/registry garbage-collect <镜像仓库配置文件>

示例如下:

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

test/mysql
test/mysql: marking manifest sha256:caf5feb0e8e5c5b7873085e1df0fdb10903d9cda62f9bd36098b580671b1a18e 
test/mysql: marking blob sha256:be960704dfac8744a2e2df80c90087551a998ac008916b9d1423d7b0c5ee33ea
test/mysql: marking blob sha256:eba3c26198b76ce92acfa6308130ab3224ee9fff583c51487a8caa0336d59e4e
test/mysql: marking blob sha256:97f7c8c33abe1138c12d45d7a453df15f348b13043bbdc1c5bbe95e07dfa6403
test/mysql: marking blob sha256:aa23d877fa04f2edd527357b3a38ac6199bfdc0e7b09b3b64f9424528a168e03
test/mysql: marking blob sha256:a143609ddd2d82d253ae60d2f6604cdc7df34ed671b0e24707c31a78800ee88c
test/mysql: marking blob sha256:78308a3437c4e14b44bb662c504c2a8c1b2ef7142207787bea32157cc91e3fe9
test/mysql: marking blob sha256:c0880e4b37373adae469fec17a9d0947481f0a105bd70a901556aaa66ff6f246
test/mysql: marking blob sha256:4bab267f9ce1d6b904aeec7a381caf991e717163fb9f56a67d347f9c1927bd2a
test/mysql: marking blob sha256:e575f6d9b17aa2a17b5604b104d60f453cc7f7944980cb645be85bcf31805494
test/mysql: marking blob sha256:607f86c00053926c764f5761ea2f19822ab243ed23cd1eff55b0d61deabb46d4
test/mysql: marking blob sha256:cd68caa5febee3feb96495599d9f764927c0feed19ba48664a94ab33731351ca

12 blobs marked, 10 blobs and 0 manifests eligible for deletion
blob eligible for deletion: sha256:269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037
blob eligible for deletion: sha256:60bf5e4921ebf40cdeb9808d25882e73722afca373a3b3f38ecf24f105d817ea
time="2024-10-24T11:32:07.014271503Z" level=info msg="Deleting blob: /docker/registry/v2/blobs/sha256/26/269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037" go.version=go1.20.8 instance.id=57067977-f0da-46b1-9b71-5c8548261bdd service=registry 
time="2024-10-24T11:32:07.01445299Z" level=info msg="Deleting blob: /docker/registry/v2/blobs/sha256/60/60bf5e4921ebf40cdeb9808d25882e73722afca373a3b3f38ecf24f105d817ea" go.version=go1.20.8 instance.id=57067977-f0da-46b1-9b71-5c8548261bdd service=registry 
blob eligible for deletion: sha256:802008e7f7617aa11266de164e757a6c8d7bb57ed4c972cf7e9f519dd0a21708
time="2024-10-24T11:32:07.0151396Z" level=info msg="Deleting blob: /docker/registry/v2/blobs/sha256/80/802008e7f7617aa11266de164e757a6c8d7bb57ed4c972cf7e9f519dd0a21708" go.version=go1.20.8 instance.id=57067977-f0da-46b1-9b71-5c8548261bdd service=registry 
blob eligible for deletion: sha256:db106334738c626481137264559382cb5bd33a57bd8ae1a08abc4190af7719fb
time="2024-10-24T11:32:07.024260265Z" level=info msg="Deleting blob: /docker/registry/v2/blobs/sha256/db/db106334738c626481137264559382cb5bd33a57bd8ae1a08abc4190af7719fb" go.version=go1.20.8 instance.id=57067977-f0da-46b1-9b71-5c8548261bdd service=registry 
blob eligible for deletion: sha256:e38fc7e50f91c37a0d822eeee9b8edc4a8fc386ca6db4709ec73ffdc15b1f52e
blob eligible for deletion: sha256:25efdea61d9c3a2a5455155d0ccf1fea3169802cae37cfa5bb07cb5708716961
blob eligible for deletion: sha256:4b8711c6c639fa9166e6a617c421e2fc43296c8add9a846fe8237b8ac9184d51
blob eligible for deletion: sha256:725acd03a3bc5090a20483353b8e4cd62df0a69d49d852ee5201a85b8622a092
time="2024-10-24T11:32:07.040481249Z" level=info msg="Deleting blob: /docker/registry/v2/blobs/sha256/e3/e38fc7e50f91c37a0d822eeee9b8edc4a8fc386ca6db4709ec73ffdc15b1f52e" go.version=go1.20.8 instance.id=57067977-f0da-46b1-9b71-5c8548261bdd service=registry 
time="2024-10-24T11:32:07.04083678Z" level=info msg="Deleting blob: /docker/registry/v2/blobs/sha256/25/25efdea61d9c3a2a5455155d0ccf1fea3169802cae37cfa5bb07cb5708716961" go.version=go1.20.8 instance.id=57067977-f0da-46b1-9b71-5c8548261bdd service=registry 
time="2024-10-24T11:32:07.040958029Z" level=info msg="Deleting blob: /docker/registry/v2/blobs/sha256/4b/4b8711c6c639fa9166e6a617c421e2fc43296c8add9a846fe8237b8ac9184d51" go.version=go1.20.8 instance.id=57067977-f0da-46b1-9b71-5c8548261bdd service=registry 
time="2024-10-24T11:32:07.041091747Z" level=info msg="Deleting blob: /docker/registry/v2/blobs/sha256/72/725acd03a3bc5090a20483353b8e4cd62df0a69d49d852ee5201a85b8622a092" go.version=go1.20.8 instance.id=57067977-f0da-46b1-9b71-5c8548261bdd service=registry 
blob eligible for deletion: sha256:d4d47b8d6ea097dcf6c6d64ef12fa26e71fd141d72991e8fd24229b45c708c6b
time="2024-10-24T11:32:07.041899186Z" level=info msg="Deleting blob: /docker/registry/v2/blobs/sha256/d4/d4d47b8d6ea097dcf6c6d64ef12fa26e71fd141d72991e8fd24229b45c708c6b" go.version=go1.20.8 instance.id=57067977-f0da-46b1-9b71-5c8548261bdd service=registry 
time="2024-10-24T11:32:07.043297838Z" level=info msg="Deleting blob: /docker/registry/v2/blobs/sha256/23/234171a3de7d7b4a5b3db938740204e157ec3d0d0ab13db1a9f7037f150d62d3" go.version=go1.20.8 instance.id=57067977-f0da-46b1-9b71-5c8548261bdd service=registry 
blob eligible for deletion: sha256:234171a3de7d7b4a5b3db938740204e157ec3d0d0ab13db1a9f7037f150d62d3
wrs@wrs-VirtualBox:~$ 

Step 3: 重启私有镜像容器

执行下述命令重新启动私有镜像容器。

$ docker restart registry

目前看,如果不重新启动,则无法上传相同格式的镜像,会有如下类似报错。示例如下:

$ docker push 192.168.100.55:5000/mariadb

Using default tag: latest
The push refers to repository [192.168.100.55:5000/mariadb]
80646396e9da: Layer already exists 
d6126fa12eee: Layer already exists 
e6108c62055d: Layer already exists 
8a5a565932ac: Layer already exists 
f5dd2ec091d1: Layer already exists 
ea5b75ace7af: Layer already exists 
d94d9ea67ca1: Layer already exists 
a46a5fb872b5: Layer already exists 
latest: digest: sha256:269e3d6595474caa3e7a76fd1bcf0dbcd59b64f4b22dfb511401a37840a98037 size: 1990