合 Docker分别使用Registry和Harbor搭建私有仓库
Tags: LinuxDocker企业HarborRegistry私有仓库镜像仓库
一、简介
在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库。在工作中,我们不可能把企业项目push到公有仓库进行管理。所以为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时也允许我们搭建本地私有仓库。
Harbor和Registry的比较
Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Regisrty来说,它具有很多的优势。
1.提供分层传输机制,优化网络传输
Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
2.提供WEB界面,优化用户体验
只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。
3.支持水平扩展集群
当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。
4.良好的安全机制
企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。
5.Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。
二、registry 的搭建
搭建
Docker 官方提供了一个搭建私有仓库的镜像 registry ,只需把镜像下载下来,运行容器并暴露5000端口,就可以使用了。
官网:https://hub.docker.com/_/registry?tab=tags&page=1&ordering=last_updated
1 2 3 4 5 6 7 8 9 10 11 | -- 镜像仓库 docker pull registry:latest docker run -itd -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:latest -- UI界面 docker pull hyper/docker-registry-web:latest # 启动容器 --link myRegistry 是我以前安装的 Registry docker rm -f registry-web docker run -itd -p 5001:8080 --name registry-web --restart=always --link myregistry \ -e registry_url=http://172.18.0.14:5000/v2 -e registry_name=172.18.0.14:5000 hyper/docker-registry-web:latest |
Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。
浏览器访问http://127.0.0.1:5000/v2,出现下面情况说明registry运行正常。
UI管理:
验证
现在通过push镜像到registry来验证一下。
查看本地镜像:
1 2 3 4 5 | $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 568c4670fa80 5 weeks ago 109MB ubuntu latest 93fd78260bd1 7 weeks ago 86.2MB elasticsearch 6.5.1 32f93c89076d 7 weeks ago 773MB |
要通过docker tag将该镜像标志为要推送到私有仓库:
1 | docker tag nginx:latest localhost:5000/nginx:latest |
通过 docker push 命令将 nginx 镜像 push到私有仓库中:
1 | docker push localhost:5000/nginx:latest |
访问 http://127.0.0.1:5000/v2/_catalog 查看私有仓库目录,可以看到刚上传的镜像了:
或者命令:
1 2 | curl http://172.18.0.14:5000/v2/_catalog curl http://172.18.0.14:5000/v2/lhrcentos76/tags/list |
示例:
1 2 3 4 5 6 7 | [root@lhrgpdbbest /]# curl http://172.18.0.14:5000/v2/_catalog {"repositories":["centos76","lhrcentos76"]} [root@lhrgpdbbest /]# [root@lhrgpdbbest /]# [root@lhrgpdbbest /]# curl http://172.18.0.14:5000/v2/lhrcentos76/tags/list {"name":"lhrcentos76","tags":["9.2","9.0"]} [root@lhrgpdbbest /]# |
下载私有仓库的镜像,使用如下命令:
1 2 3 | docker pull localhost:5000/镜像名:版本号 -- 例如 docker pull localhost:5000/nginx:latest |
配置删除权限
默认安装的Registry不支持删除
1 2 3 4 5 6 | # 进入容器 docker exec -it e4d2b1110a34 sh # 编辑config.xml,增加delete vi /etc/docker/registry/config.yml # 重启容器 docker restart e4d2b1110a34 |
删除私有仓库中的镜像
进入正在运行的容器内部
1 | docker exec -it myregistry /bin/sh |
切换至/var/lib/registry/docker/registry/v2/repositories 目录内,该目录下存放的为你上传的镜像文件
1 2 3 4 | cd /var/lib/registry/docker/registry/v2/repositories #找到想要删除的镜像执行rm命令进行删除即可 rm -rf centos |
报错解决
若是在其它docker的客户端上传报错:
1 2 3 | [root@docker36 harbor]# docker push 192.168.1.35:5000/nginx:alpine2 The push refers to repository [192.168.1.35:5000/nginx] Get https://192.168.1.35:5000/v2/: http: server gave HTTP response to HTTPS client |
出现这问题的原因是:Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。
解决,vim /etc/docker/daemon.json
,增加如下内容:
1 | { "insecure-registries":["192.168.1.100:5000"] } |
例如,我的文件增加后:
1 2 3 4 5 6 7 8 9 10 11 | [root@docker36 certs.d]# more /etc/docker/daemon.json { "registry-mirrors": [ "https://hub.daocloud.io", "https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://vm1wbfhf.mirror.aliyuncs.com", "https://pee6w651.mirror.aliyuncs.com" ], "insecure-registries": ["192.168.1.35:5000"] } |
然后,重启docker。
1 2 3 4 5 6 7 8 9 10 | [root@docker36 harbor]# systemctl restart docker [root@docker36 harbor]# [root@docker36 harbor]# docker push 192.168.1.35:5000/nginx:alpine2 The push refers to repository [192.168.1.35:5000/nginx] 22b34b04730a: Pushed 0abec5b5c783: Pushed 25b4fafa93fe: Pushed d9ff549177a9: Pushed alpine2: digest: sha256:d25ed0a8c1b4957f918555c0dbda9d71695d7b336d24f7017a87b2081baf1112 size: 1153 [root@docker36 harbor]# |
三、harbor 的搭建
简介
docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker distribution的基础上增加了一些安全、访问控制、管理的功能以满足企业对于镜像仓库的需求。
- 虽然Docker官方提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。
- Harbor是由VMware公司开源的企业级的Docker Registry管理项目,相比docker官方拥有更丰富的权限权利和完善的架构设计,适用大规模docker集群部署提供仓库服务。
- 它主要提供 Dcoker Registry 管理界面UI,可基于角色访问控制,镜像复制, AD/LDAP 集成,日志审核等功能,完全的支持中文。
Harbor核心组件解释
Harbor在架构上主要由6个组件构成:
Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。
Core services: 这是Harbor的核心功能,主要提供以下服务:
- UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
- webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
- token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
Harbor特性
- 基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
- 镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
- 图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
- AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
- 审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
- 国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
- RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
- 部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。
harbor搭建
下载地址:https://github.com/goharbor/harbor/releases
官网:https://goharbor.io/docs/2.3.0/