介绍
在安装好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的校验信息值
环境
代码语言:javascript复制[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
安装Docker
代码语言:javascript复制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镜像
代码语言:javascript复制[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容器
代码语言:javascript复制[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下来的镜像;
查看镜像仓库中的所有镜像
代码语言:javascript复制[root@localhost ~]# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
docker client下载镜像并打标签
代码语言:javascript复制[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 修改配置文件,设置私有仓库
代码语言:javascript复制方式有两种
[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 上传镜像
代码语言:javascript复制[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
测试是否可以下载镜像
代码语言:javascript复制[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上操作的,哪台都可以)
代码语言:javascript复制[root@localhost ~]# curl http://192.168.1.10:5000/v2/_catalog
{"repositories":["centos"]}
删除镜像
docker registry默认情况下没有开启删除镜像的功能,需要修改配置文件,进行打开,下边的操作是在docker registry上操作的
代码语言:javascript复制[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镜像仓库,而且还有账号和密码,安全级别也更高
代码语言:javascript复制[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镜像删除方法亲自实验过,当占用过大的时候直接全部删除
代码语言:javascript复制#这个是去到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":[]}
完毕!成功!