docker之register搭建私有镜像仓库以及删除docker历史的临时镜像(虚悬镜像)

一,介绍

  一般docker提供了Docker  Hub来维护管理所有的镜像,但是一般出于安全和网络原因,我们不可能把商业项目上传到docker上,我们会在本地局域网搭建私有镜像仓库。
  所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。

删除虚悬镜像

1 搞容器开发一段时间后,想看看都有哪些镜像,执行了一下docker images -a,蒙圈了,有一堆:的镜像。不知有什么用,不知能不能删,不知会不会占用很多空间。接下来我们探索一下吧。

再构建镜像中,多次使用build指令构建Dockerfile,并且镜像的名字以及版本一致的时候,或者多次pull指令,拉取相同名字:相同版本的镜像的时候,就会出现虚悬镜像;
例如:下载了一个nginx默认版本的镜像;

docker pull nginx:latest

过一段时间,再次拉取(相当于更新本地镜像为最新版本)的时候;就会出现虚悬镜像;

2 镜像也有好坏吗?
这些:镜像可分为两类:好与坏、有用与无用、不建议删除和建议删除的。

2.1 好的none
好的:镜像是由于镜像分层的中间镜像。它们只会在docker images -a才会显示出来,用docker images是不会显示的。它们也不会造成空间问题。

2.2 坏的none
坏的:镜像会占用空间,主要是由于新加镜像替换原来相对标签的镜像,原来镜像就变成了:而不会被删除。

我们执行docker images查看:

$ docker images
REPOSITORY                TAG       IMAGE ID            CREATED             SIZE
pkslow/springboot-mongo   0.0.6     f029f9b6e703        28 minutes ago      356MB
pkslow/springboot-mongo   latest    f029f9b6e703        28 minutes ago      356MB
<none>                    <none>    56de36189ad6        29 minutes ago      356MB
<none>                    <none>    9e00dfd258dc        40 hours ago        356MB
<none>                    <none>    2d736eaaafd0        2 weeks ago         346MB

然后再docker build一次,用同样的标签0.0.6。

$ docker images
REPOSITORY                TAG       IMAGE ID            CREATED             SIZE
pkslow/springboot-mongo   0.0.6     2119e4fbc6e8        43 seconds ago      356MB
pkslow/springboot-mongo   latest    2119e4fbc6e8        43 seconds ago      356MB
<none>                    <none>    f029f9b6e703        30 minutes ago      356MB
<none>                    <none>    56de36189ad6        31 minutes ago      356MB
<none>                    <none>    9e00dfd258dc        40 hours ago        356MB
<none>                    <none>    2d736eaaafd0        2 weeks ago         346MB

认真查看可以得出,以前最新的镜像ID为f029f9b6e703,后来变成了:

这些坏坏的镜像也叫dangling images,空悬镜像

单独查看虚悬镜像

docker images -q -f dangling=true

-f:表示filter,过滤
-q:表示只显示镜像ID;

3 如何删除dangling images
既然没用,又还占用空间,不如就删掉它。Docker没有自动删除这些镜像的机制,可以通过以下命令删除:

删除指令镜像
docker rmi $(docker images -q -f dangling=true)

检查一下,已经没有的镜像了。

1) registry 私有镜像仓库常用命令
# 查询registry中所有的镜像名称
curl -XGET http://registry_ip:5000/v2/_catalog

# 依据镜像名称查询镜像版本
curl -XGET http://registry_ip:5000/v2/nginx/tags/list


# 打开镜像的存储目录,如有-V操作打开挂载目录也可以,删除镜像文件夹
docker exec <容器名> rm -rf /var/lib/registry/docker/registry/v2/repositories/<镜像名>

# 利用请求api删除历史遗留的镜像
for i in  `ls -t /app/data/registry/registry/docker/registry/v2/repositories 
/dafu/app/shopping-shop-api-test/_manifests/revisions/sha256/ | tail -100`; 
do 
curl -XDELETE http://127.0.0.1:5000/v2/dafu/app/shopping-shop-api-test/manifests/sha256:$i; 
done

# 执行垃圾回收操作,注意2.4版本以上的registry才有此功能
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
2) registry 镜像仓库私有目录说明
# registry默认仓库目录是/var/lib/registry 挂载宿主机上的/data/registry
[root@docker-register ~]# tree /data/registry/
/data/registry/
└── docker
    └── registry
        └── v2 #仓库版本
            ├── blobs # 二进制对象斑点(记录所有镜像层级)
            │   └── sha256
            │       ├── 1c
            │       │   └── 1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac
            │       │       └── data
            │       ├── 38
            │       │   └── 388056c9a6838deea3792e8f00705b35b439cf57b3c9c2634fb4e95cfc896de6
            │       │       └── data
            │       └── f5
            │           └── f531cdc67389c92deac44e019e7a1b6fba90d1aaa58ae3e8192f0e0eed747152
            │               └── data
            └── repositories # 仓库
                └── busybox-v0.1 # 镜像名称
                    ├── _layers # 镜像使用到的层次
                    │   └── sha256
                    │       ├── 388056c9a6838deea3792e8f00705b35b439cf57b3c9c2634fb4e95cfc896de6
                    │       │   └── link
                    │       └── f531cdc67389c92deac44e019e7a1b6fba90d1aaa58ae3e8192f0e0eed747152
                    │           └── link
                    ├── _manifests # 记录镜像引用的layer(描述镜像的信息) 
                    │   ├── revisions
                    │   │   └── sha256
                    │   │       └── 1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac
                    │   │           └── link
                    │   └── tags # 镜像的标签
                    │       └── latest # 最新版本
                    │           ├── current # 当前
                    │           │   └── link
                    │           └── index
                    │               └── sha256
                    │                   └── 1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac
                    │                       └── link
                    └── _uploads # 保存镜像push时的数据
 
28 directories, 8 files


简单步骤参考图

二,环境

服务端机器 (主机名为registry):docker私有仓库服务器,运行registry容器。
测试端机器 (主机名为node):普通的docker服务器,在这台服务器上下载一个测试镜像busybox,然后上传到registry服务器进行测试。

三. 部署

1)registry主机下操作:

1. 下载镜像
  docker pull registry
2. 查看镜像是否下载成功

[root@docker-register ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
registry     latest    1fd8e1b0bb7e   8 days ago   26.2MB
  1. 运行镜像
docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

4. 查看镜像仓库中的所有镜像

[root@docker-register ~]# curl -XGET http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
2)registry节点node主机下操作:

1. 为镜像打标签
10.0.0.50:5000是registry私有镜像服务器的IP地址和端口后面加上镜像的名称 要推送到自己的私有仓库必须加上前缀ip地址和端口的名称
[root@docker-test ~]# docker tag busybox 10.0.0.50:5000/busybox-v0.1

2. 查看打好标签的镜像

[root@docker-test ~]# docker tag busybox 10.0.0.50:5000/busybox-v0.1 
[root@docker-test ~]# docker images
REPOSITORY                    TAG       IMAGE ID       CREATED       SIZE
10.0.0.50:5000/busybox-v0.1   latest    388056c9a683   2 weeks ago   1.23MB
busybox                       latest    388056c9a683   2 weeks ago   1.23MB

3. 上传到镜像服务器

# 推送镜像到自己私有的仓库如果报错
[root@docker-test ~]# docker push 10.0.0.50:5000/busybox-v0.1:latest
The push refers to repository [10.0.0.50:5000/busybox-v0.1]
Get https://10.0.0.50:5000/v2/: http: server gave HTTP response to HTTPS client

# 修改daemon.json文件 添加私有镜像服务器地址
[root@docker-test ~]# vim /etc/docker/daemon.json 
{
  "insecure-registries": ["10.0.0.50:5000"],
}

# 重启docker服务或则重载
systemctl restar  docker
systemctl reload docker

# 推送正常的镜像到自己的私有仓库
[root@docker-test ~]# docker push 10.0.0.50:5000/busybox-v0.2
Using default tag: latest
The push refers to repository [10.0.0.50:5000/busybox-v0.2]
67f770da229b: Mounted from busybox-v0.1 
latest: digest: sha256:1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac size: 527

# 推送不是 ip:端口/镜像 格式的镜像默认是推送到官方仓库里面
[root@docker-test ~]# docker push busybox
Using default tag: latest
The push refers to repository [docker.io/library/busybox]
......

四,镜像名字补充

1) 构建同名同版本的不同ID的镜像 会顶掉以前的旧镜像 名字跟Id变成none状态 旧镜像只有一个的情况下
# 查看镜像
[root@docker-test ~]# docker images
REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
test1                  latest    c4e303a5d487   18 minutes ago   1.23MB
10.0.0.50:5000/test1   latest    5bf3d586f010   41 minutes ago   1.23MB
busybox                latest    388056c9a683   2 weeks ago      1.23MB

# 构建一个同名的镜像(test1)
[root@docker-test ~]# docker build -t test1 . --no-cache
Sending build context to Docker daemon  17.92kB
Step 1/2 : from busybox
 ---> 388056c9a683
Step 2/2 : run mkdir -p /test7
 ---> Running in 1d1f9efa907f
Removing intermediate container 1d1f9efa907f
 ---> 22da1e98032d
Successfully built 22da1e98032d
Successfully tagged test1:latest

# 旧同名镜像(test1)名字跟标签变成none状态了
[root@docker-test ~]# docker images
REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
test1                  latest    22da1e98032d   4 seconds ago    1.23MB
<none>                 <none>    c4e303a5d487   18 minutes ago   1.23MB
10.0.0.50:5000/test1   latest    5bf3d586f010   42 minutes ago   1.23MB
busybox                latest    388056c9a683   2 weeks ago      1.23MB
2) 构建同名同版本的不同ID的镜像 会顶掉以前的旧镜像 名字跟Id变成none状态 旧镜像有两个的情况下
# 查看镜像同ID的个两个
[root@docker-test ~]# docker images
REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
test1                  latest    22da1e98032d   4 minutes ago    1.23MB
test2                  latest    22da1e98032d   4 minutes ago    1.23MB
<none>                 <none>    c4e303a5d487   23 minutes ago   1.23MB
10.0.0.50:5000/test1   latest    5bf3d586f010   47 minutes ago   1.23MB
busybox                latest    388056c9a683   2 weeks ago      1.23MB

# 构建一个已有相同名字的镜像
[root@docker-test ~]# docker build -t test1 . --no-cache
Sending build context to Docker daemon  17.92kB
Step 1/2 : from busybox
 ---> 388056c9a683
Step 2/2 : run mkdir -p /test7
 ---> Running in 434da5d47d0b
Removing intermediate container 434da5d47d0b
 ---> 840a4834a6af
Successfully built 840a4834a6af
Successfully tagged test1:latest

# 旧镜像相同名字的直接不见了
[root@docker-test ~]# docker images
REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
test1                  latest    840a4834a6af   1 second ago     1.23MB
test2                  latest    22da1e98032d   5 minutes ago    1.23MB
<none>                 <none>    c4e303a5d487   24 minutes ago   1.23MB
10.0.0.50:5000/test1   latest    5bf3d586f010   47 minutes ago   1.23MB
busybox                latest    388056c9a683   2 weeks ago      1.23MB
原文地址:https://www.cnblogs.com/xiaolang666/p/14694121.html