Docker Registry 详解
1 了解Docker Registry
1.1 介绍
-
registry用于保存docker镜像,包括镜像的层次结构和元数据。
-
启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从registry中下载该镜像并保存到本地;
-
拉取镜像时,如果不知道registry仓库地址,默认从Docker Hub搜索拉取镜像
1.2 分类
-
Sponsor Registry:第三方的registry,供客户和docker社区使用;
-
mirror Registry:第三方的registry,只让客户使用;如docker cn和阿里云的镜像加速器;
-
vendor Registry:服务商的registry,由发布docker镜像的供应商提供的registry;如红帽提供的专有的,收费提供;
-
private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry;自建的registry,在本地搭建registry,节省带宽
1.3 registry组成(repository和index)
1)Repository
-
由特定的docker镜像的所有迭代版本组成的镜像仓库;
-
一个registry中可以存在多个repository:
-
repository可分为“顶层仓库”和“用户仓库”
-
用户仓库名称格式为“用户名/仓库名”
-
-
每个仓库可以包含多个Tag(标签),每个标签对应一个镜像
2)Index
-
维护用户账户、镜像的校验以及公共命名空间的信息
-
相当于为registry提供了一个完成用户认证等功能的检索接口
1.4 拉取上传仓库镜像
1)拉取镜像
docker pull [:]/[/]:
-
registry:仓库服务器地址:不指定默认是docker hub
-
port:端口;默认是443,因为是https协议
-
namespace:名称空间,指是哪个用户的仓库,如果是顶层仓库,可省
-
name:仓库名
-
tag:标签名;默认是latest版本
2)上传镜像
docker push [OPTIONS] NAME[:TAG]
1.5 知名docker仓库
-
https://hub.docker.com/
-
https://quay.io/
例:docker pull quay.io/coreos/flannel:v0.10.0-amd64 //flannel是一个网络插件
2 搭建私有仓库distribution
2.1 distribution介绍
docker提供的开源Registry,但是很简单,只能作为存储镜像的仓库,没有额外的功能;如管理页面等
2.2 安装启动distribution
方案1:使用yum安装(直接从extras 源中下载安装)
[root@docker1 ~]# yum -y install docker-distribution
方案2:拉取镜像,作为容器安装
1)拉取镜像
[root@docker2 ~]# docker pull registry:2.6.2
2)启动registry容器
[root@docker2 ~]# docker run --name registry -p 5000:5000 -v /data/registry:/var/lib/registry -d registry:2.6.2
7d3dc6b2ef67775d86eb51653774e496bf448a9a5f7965758023e46da529a57e
[root@docker2 ~]# docker ps
[root@docker2 ~]# docker port registry
5000/tcp -> 0.0.0.0:5000
5000/tcp -> :::5000
[root@docker2 ~]# ss -lntup | grep 5000
[root@docker2 ~]# docker inspect -f {{.“Mounts”}} registry
[{bind /data/registry /var/lib/registry true rprivate}]
注:
-
-p:5000:5000:将容器中的5000端口,暴露在宿主机的5000端口
-
-v:/data/registry:/var/lib/registry:指定宿主机存储的位置为/data/registry
-
-d:后台运行容器
3 从私有仓库上传下载镜像
3.1 将本地的镜像上传到私有仓库
1)先将本地仓库打上合适的标签
[root@docker2 ~]# docker tag busybox:latest 192.168.159.146:5000/busybox:v1.0
[root@docker2 ~]# docker images
2)尝试上传镜像
[root@docker2 ~]# docker push 192.168.159.146:5000/busybox:v1.0
上传镜像失败;原因:docker上传下载默认只支持https协议,搭建的私有仓库是http协议。
3)修改重启docker服务
[root@docker2 ~]# vim /etc/docker/daemon.json
{
“registry-mirrors”: [“https://j64h7f2i.mirror.aliyuncs.com”],
“insecure-registries”: [“192.168.159.146:5000”]
}
[root@docker2 ~]# systemctl restart docker
注:就是将私有仓库认证为安全仓库:“insecure-registries”: [“”]
4)再次上传镜像,成功
[root@docker2 ~]# docker push 192.168.159.146:5000/busybox:v1.0 //报错原因,容器没有开启
[root@docker2 ~]# docker ps -a //查看容器处于关闭zhuang’tai
[root@docker2 ~]# docker start registry
registry
[root@docker2 ~]# docker push 192.168.159.146:5000/busybox:v1.0
5)在私有仓库的服务器上验证
[root@docker2 ~]# ls /data/registry/docker/registry/v2/
blobs repositories
6)从私有仓库拉取镜像,先删除再拉取
[root@docker2 ~]# docker rmi 192.168.159.146:5000/busybox:v1.0
[root@docker2 ~]# docker images //镜像已被删除
[root@docker2 ~]# docker pull 192.168.159.146:5000/busybox:v1.0 //从私有仓库拉取镜像
[root@docker2 ~]# docker images //镜像一被拉取到本地