介绍

在安装好docker后,我们执行docker pull去下载镜像的时候,其实是默认从dockerhub上拉取的,这个是docker的公共仓库,如果在公司中使用docker,我们不可能把自己的镜像上传到公共仓库,这个时候就需要有一个企业自己是仓库,在局域网之内搭建,既可以提升下载镜像的速度,也可以避免内部的镜像暴露出去。

目前常用 registry 版本为 v2,registry v2 拥有断点续传、并发拉取镜像多层等特点。能并发拉取多层是因为镜像的元信息与镜像层数据分开存储,当 pull 一个镜像时,先进行认证获取到 token 并授权通过,然后获取镜像的 manifest 文件,进行 signature 校验。校验完成后,依据 manifest 里的层信息并发拉取各层。其中 manifest 包含的信息有:仓库名称、tag、镜像层 digest 等

镜像的完整内容分为两部分,一部分是manifest,一部分是image blob,第一部分是镜像的元数据,或者叫元信息,第二部分叫做镜像的二进制文件,也就是镜像的真实文件,可以认为某一个blob就是镜像的某一层的真实二进制文件。

还涉及两个概念,一个是sha256,另外一个是digest
sha256是一种校验方法,docker用这种方法来计算镜像层或者元信息的sha256的sum值,用于校验信息,而digest就是manifest的校验信息值

环境

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)

安装Docker

yum -y install yum-utils
yum-config-manager     --add-repo     https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo     
yum -y install docker-ce
[root@master ~]# systemctl start docker
[root@master ~]# docker --version
Docker version 20.10.1, build 831ebea
[root@localhost ~]# systemctl start docker

下载registry镜像

[root@localhost ~]#  docker pull registry
Using default tag: latest
latest: Pulling from library/registry
0a6724ff3fcd: Pull complete 
d550a247d74f: Pull complete 
1a938458ca36: Pull complete 
acd758c36fc9: Pull complete 
9af6d68b484a: Pull complete 
Digest: sha256:d5459fcb27aecc752520df4b492b08358a1912fcdfa454f7d2101d4b09991daa
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
registry     latest    678dfa38fcfa   2 weeks ago   26.2MB

运行registry容器

[root@localhost ~]#  docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest 
10a89089c799a0ad8e2258f600c665f52293022c048078b42fb2c1f99e6b0e29
参数说明:
-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
-v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个
      目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;
--restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;
--name registry:创建容器命名为registry,你可以随便命名;
registry:latest:这个是刚才pull下来的镜像;

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

[root@localhost ~]# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}

docker client下载镜像并打标签

[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete 
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@localhost ~]# docker tag centos:latest 192.168.1.10:5000/centos:latest

docker client 修改配置文件,设置私有仓库

方式有两种
[root@node ~]# vim /etc/docker/daemon.json 
{
  "registry-mirrors": ["http://f1361db2.m.daocloud.io"],
  "insecure-registries": [ "192.168.1.10:5000"]
}

[root@localhost ~]# vim /usr/lib/systemd/system/docker.service 
 14 ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.10:5000
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker

docker client 上传镜像

[root@localhost ~]# docker push 192.168.1.10:5000/centos
Using default tag: latest
The push refers to repository [192.168.1.10:5000/centos]
2653d992f4ef: Pushed 
latest: digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875 size: 529

测试是否可以下载镜像

[root@localhost ~]# docker rmi 192.168.1.10:5000/centos
Untagged: 192.168.1.10:5000/centos:latest
Untagged: 192.168.1.10:5000/centos@sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
registry     latest    678dfa38fcfa   2 weeks ago   26.2MB
centos       latest    300e315adb2f   3 weeks ago   209MB
[root@localhost ~]#  docker pull 192.168.1.10:5000/centos
Using default tag: latest
latest: Pulling from centos
Digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
Status: Downloaded newer image for 192.168.1.10:5000/centos:latest
192.168.1.10:5000/centos:latest
[root@localhost ~]# docker images
REPOSITORY                 TAG       IMAGE ID       CREATED       SIZE
registry                   latest    678dfa38fcfa   2 weeks ago   26.2MB
centos                     latest    300e315adb2f   3 weeks ago   209MB
192.168.1.10:5000/centos   latest    300e315adb2f   3 weeks ago   209MB

列出仓库中的所有镜像(在client上操作的,哪台都可以)

[root@localhost ~]# curl http://192.168.1.10:5000/v2/_catalog
{"repositories":["centos"]}

删除镜像

docker registry默认情况下没有开启删除镜像的功能,需要修改配置文件,进行打开,下边的操作是在docker registry上操作的

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                    NAMES
10a89089c799   registry:latest   "/entrypoint.sh /etc…"   9 minutes ago   Up 3 minutes   0.0.0.0:5000->5000/tcp   registry
[root@localhost ~]# docker exec -it registry  /bin/sh
/ # vi /etc/docker/registry/config.yml 
末行添加
delete:         
    enabled: true
[root@localhost ~]# docker restart registry
registry

自己添加的内容:
在这里插入图片描述
docker client 执行删除操作,如下,还是失败,那就算了吧,这个只是为了让你理解并且会用registry,企业用用到仓库的时候使用的是harbor,一个图形化界面的docker镜像仓库,而且还有账号和密码,安全级别也更高

[root@localhost ~]# curl -I -X DELETE http://192.168.1.10:5000/v2/centos/manifests/sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
HTTP/1.1 405 Method Not Allowed
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Mon, 04 Jan 2021 06:07:42 GMT
Content-Length: 78

对于企业公司用镜像仓库的话有条件还是推荐使用harbor,harbor是一款有图形化界面的仓库,便于管理,安装,删除镜像等等,registry当你大量上传镜像而不清理的时候还会出现这个容器大量占用服务器磁盘空间,当你删除镜像的时候也不会像harbor可以有选择性的删除,registry镜像删除方法亲自实验过,当占用过大的时候直接全部删除

#这个是去到registry容器所映射的主机目录,所有的镜像文件都存放到/data/registry目录下
[root@localhost ~]# cd /data/registry
[root@localhost registry]# ls
docker
先来看一下目录构成情况
[root@localhost registry]# tree docker/
docker/
└── registry
    └── v2
        ├── blobs
        │   └── sha256
        │       ├── 30
        │       │   └── 300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55
        │       │       └── data
        │       ├── 7a
        │       │   └── 7a0437f04f83f084b7ed68ad9c4a4947e12fc4e1b006b38129bac89114ec3621
        │       │       └── data
        │       └── db
        │           └── dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
        │               └── data
        └── repositories
            └── centos
                ├── _layers
                │   └── sha256
                │       ├── 300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55
                │       │   └── link
                │       └── 7a0437f04f83f084b7ed68ad9c4a4947e12fc4e1b006b38129bac89114ec3621
                │           └── link
                ├── _manifests
                │   ├── revisions
                │   │   └── sha256
                │   │       └── dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
                │   │           └── link
                │   └── tags
                │       └── latest
                │           ├── current
                │           │   └── link
                │           └── index
                │               └── sha256
                │                   └── dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
                │                       └── link
                └── _uploads

27 directories, 8 files
主要就是进入/data/registry/docker/registry/v2/blobs以及/data/registry/docker/registry/v2/repositories删除下面的所有
操作如下:
[root@localhost repositories]# cd /data/registry/docker/registry/v2/blobs
[root@localhost blobs]# ls
sha256
[root@localhost blobs]# rm -rf *
[root@localhost blobs]# cd /data/registry/docker/registry/v2/repositories
[root@localhost repositories]# ls
centos
[root@localhost repositories]# rm -rf *
查看镜像仓库是否还有镜像:
[root@localhost repositories]# curl http://192.168.1.10:5000/v2/_catalog
{"repositories":[]}
完毕!成功!
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐