Dcoker Registry 和Harbor有什么相似和区别?各自有什么优劣,请详细介绍
Docker Registry和Harbor都是容器镜像仓库管理系统,用于存储、管理和分发Docker镜像。它们有一些相似之处,但也存在一些区别。下面是对它们的相似之处和区别的详细介绍:
相似之处:
-
容器镜像存储和管理:Docker Registry和Harbor都提供了容器镜像的存储和管理功能,可以帮助用户方便地上传、存储和检索镜像。
-
镜像版本控制:两者都支持镜像的版本控制,可以通过标签或哈希值来管理和检索不同版本的镜像。
-
权限和访问控制:Docker Registry和Harbor都提供了用户认证和访问控制机制,可以对镜像仓库进行权限管理,控制用户对镜像的访问和操作权限。
-
镜像复制和同步:两者都支持镜像的复制和同步功能,可以将镜像从一个Registry复制到另一个Registry,以实现镜像的分发和备份。
区别:
-
开源性质:Docker Registry是Docker官方提供的开源项目,而Harbor是由VMware孵化的开源项目。Docker Registry是更加通用和广泛使用的容器镜像仓库,而Harbor则专注于企业级容器镜像仓库的管理和安全性。
-
企业级功能:Harbor相对于Docker Registry具有更多的企业级功能。它提供了更丰富的权限管理、镜像复制、镜像扫描和漏洞检测、LDAP/AD集成等功能,适合用于企业内部的容器镜像管理和安全需求。
-
安全性:Harbor注重容器镜像的安全性,提供了镜像扫描、漏洞检测、安全策略等功能,可以帮助用户在容器镜像的存储和分发过程中确保安全性。
-
可扩展性:Harbor在架构设计上更具可扩展性,支持多节点部署和高可用性配置,可以满足大规模容器镜像存储和管理的需求。
优劣势:
Docker Registry的优势在于它是Docker官方提供的标准镜像仓库,具有广泛的用户基础和支持。它的简单性和易用性使得它适合用于小型项目或个人使用。然而,它在安全性和企业级功能方面的支持相对较弱。
Harbor的优势在于它专注于企业级容器镜像管理和安全性,提供了丰富的功能和可扩展性。它适合用于企业环境中的容器镜像管理,尤其是对于有安全和合规性需求的组织来说,提供了更好的安全性和管理能力。
综上所述,选择使用Docker Registry还是Harbor取决于具体的使用场景和需求。如果你只是进行简单的个人或小型项目的镜像管理,Docker Registry可能是一个不错的选择。但如果你需要更多的企业级功能和安全性保障,以及对大规模容器镜像管理的需求,那么Harbor可能更适合你的需求。
准备工作
原来的Dcoker Registry是用Python写的,仓库地址 github.com/docker-archive/docker-registry[1],性能不够,已经archived。后面用Go重构了,仓库地址 github.com/distribution/distribution[2]
参照如下进行实践:
Docker入门:私有库(Docker Registry)简介及使用方法(防踩坑)[3]
docker pull registry 拉取镜像
![alt](https://i-blog.csdnimg.cn/blog_migrate/ca8288058795b61715fc07e664909f99.png)
运行私有库Registry
这样就相当于本地有了个私有Docker hub
docker run -d -p 5000:5000 -v /Users/fliter/docker_volume/shuang_mac_registry:/tmp/registry --privileged=true registry
-
docker run
:这是Docker命令行工具中用于启动一个容器的命令。 -
-d
:这是一个选项,表示在后台运行容器(detached mode)。 -
-p 5000:5000
:这是一个选项,将容器的端口映射到主机的端口。在这种情况下,容器的端口5000将映射到主机的端口5000。 -
-v /Users/fliter/docker_volume/shuang_mac_registry/:/tmp/registry
:这是一个选项,用于将主机上的目录挂载到容器中。在这种情况下,主机上的/Users/fliter/docker_volume/shuang_mac_registry
目录将挂载到容器的/tmp/registry
目录。 -
--privileged=true
:这是一个选项,将容器授予特权级别,允许容器内的进程执行一些特权操作。 -
registry
:这是要运行的容器的镜像名称。
如果Mac上面5000端口被占用,可参考 http://blog.epurs.com/post/port5000-used-by-airplay/
![alt](https://i-blog.csdnimg.cn/blog_migrate/2edf39fd2386cf4ef857ec6823442435.png)
也可以按 这篇博客[4]的这种方式来启动
docker run -d \
--name registry-srv \
--restart=always \
-p 5000:5000 \
-v /Users/fliter/docker_volume/shuang_mac_registry:/var/lib/registry \
-v /Users/fliter/docker_volume/shuang_mac_registry/srv-config.yml:/etc/docker/registry/config.yml \
registry
在 /Users/fliter/docker_volume/shuang_mac_registry下新建srv-config.yml:
version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
还有这篇,通docker-compose的方式部署,比较推荐[5]
如果需要密码:
搭建docker私有仓库 配置用户名密码[6]
生成账号密码:name password123
docker run --entrypoint htpasswd registry:latest -Bbn name password123 >> /docker/registry/auth/htpasswd
账号密码是在这一步指定的
进入容器中查看
进入registry容器的时候的命令参数不能使用/bin/bash,而要使用:bin/sh、bash、sh三个中的一个。
输入命令进入registry容器: docker exec -it e7123b748321 /bin/sh
![alt](https://i-blog.csdnimg.cn/blog_migrate/5235b756b82719a69246e33796a24484.png)
之后push的容器镜像应该会存在这个目录下
制作一个新镜像
通过某个镜像创建容器,并对容器进行功能加强
docker run -itd --name='cui-ubuntu16.04' ubuntu:16.04
这是一个用于在Docker中运行一个名为"cui-ubuntu16.04"的容器的命令:
-
docker run
:这是Docker命令行工具中用于启动一个容器的命令。 -
-itd
:这是一组选项的组合:-
-i
:这是一个选项,表示要与容器的标准输入(stdin)进行交互。 -
-t
:这是一个选项,为容器分配一个伪终端(pseudo-TTY)。 -
-d
:这是一个选项,表示在后台运行容器(detached mode)。
-
-
--name='cui-ubuntu16.04'
:这是一个选项,用于给容器指定一个名称,本例中为"cui-ubuntu16.04"。 -
ubuntu:16.04
:这是要运行的容器的镜像名称和标签。在这种情况下,它使用了Ubuntu 16.04的官方镜像。
综上所述,该命令的作用是在Docker中以后台交互模式(即可以与容器进行交互并分配伪终端)运行一个名为"cui-ubuntu16.04"的容器,使用了Ubuntu 16.04的官方镜像。
docker exec -it cui-ubuntu16.04 bash
进入容器,为其安装vim
apt-get update
apt-get install vim
![alt](https://i-blog.csdnimg.cn/blog_migrate/07cfc4b75fa2634d2fe0c4f0b99627aa.png)
而后退出容器
提交容器副本为镜像
使用命令docker commit
来提交容器副本:
docker commit -m="ubuntu advanced version(已安装了vim)" -a="cui" cui-ubuntu16.04 ubuntu-advanced:v1
docker commit指令中的参数说明:
-
-m
:自定义的提交描述信息; -
-a
:指定镜像作者; -
cui-ubuntu16.04
:容器名字,这里也可以用容器ID代替; -
ubuntu-advanced:v1
:指定要创建的目标镜像的自定义名称(这里为unbuntu-advanced)和自定义版本(v1)
![alt](https://i-blog.csdnimg.cn/blog_migrate/172dc9f28fc6bdec55ef4bb3224b6108.png)
将本地新制作的镜像 发布到私有仓库Registry
查看目前私服库Registry上有什么镜像
可以通过 curl -XGET http://0.0.0.0:5000/v2/_catalog
或直接访问http://localhost:5000/v2/_catalog
,得到*{"repositories":[]}*,即目前本地私有库为空仓库,没有任何镜像
将新镜像修改为符合私服规范的Tag
docker tag 镜像ID或镜像名:Tag Host:Port/Repository:Tag
,
(1)镜像ID或镜像名:要上传到私有库Registry的镜像ID或名字; (2)Tag:要上传的镜像版本号; (3)Host:本地私有库的映射网址(本文为0.0.0.0); (4)Post:本地私有库的映射端口(本文为5000); (5)Repository:Tag:上传到私有库Registry后自定义的镜像名字、版本号。
在此即 docker tag ubuntu-advanced:v1 0.0.0.0:5000/ubuntu-advanced:v1
这是一个用于为Docker镜像打标签(tag)的命令:
-
docker tag
:这是Docker命令行工具中用于给镜像打标签的命令。 -
ubuntu-advanced:v1
:这是要打标签的原始镜像名称和标签。在这种情况下,原始镜像的名称为"ubuntu-advanced",标签为"v1"。 -
0.0.0.0:5000/ubuntu-advanced:v1
:这是新的标签名称,格式为<registry>/<repository>:<tag>
。在这种情况下,新标签的名称为"0.0.0.0:5000/ubuntu-advanced:v1",表示镜像将被推送到名为"0.0.0.0:5000"的Docker注册表(registry),并在该注册表下的"ubuntu-advanced"仓库中使用"v1"标签。
综上所述,该命令的作用是将名为"ubuntu-advanced:v1"的原始镜像打上一个新的标签"0.0.0.0:5000/ubuntu-advanced:v1",以便后续可以将该镜像推送到指定的Docker注册表中。
![alt](https://i-blog.csdnimg.cn/blog_migrate/e6902425f2e821379798b24a80e21692.png)
修改配置文件使docker支持http
![alt](https://i-blog.csdnimg.cn/blog_migrate/d42c77510cb59f0a630781e51e6e1b02.png)
在此处新增一行 *"insecure-registries": ["0.0.0.0:5000"]*,即完整配置如下:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"features": {
"buildkit": false
},
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
],
"insecure-registries": ["0.0.0.0:5000"]
}
应用&重启 (之后记得把registry服务起起来)
push推送到私服库
docker push 0.0.0.0:5000/ubuntu-advanced:v1
一直报错:
![alt](https://i-blog.csdnimg.cn/blog_migrate/0f41c1220aacad1b8d641b84fb372690.png)
记得要关闭代理!
![alt](https://i-blog.csdnimg.cn/blog_migrate/962c5d749dbbd49b2b6698456e421c76.png)
这时通过 curl -XGET http://0.0.0.0:5000/v2/_catalog
或直接在浏览器访问 http://localhost:5000/v2/_catalog
,都会得到 *{"repositories":["ubuntu-advanced"]}*,即已经将unbunt-advanced
镜像推送到私有仓库了~
还可以进入容器的相应目录
![alt](https://i-blog.csdnimg.cn/blog_migrate/6f14cd101db8ab3710b3a528ef1273f1.png)
这时可以通过 docker pull 0.0.0.0:5000/ubuntu-advanced:v1
拉取该镜像
可视化
几个用于可视化的镜像
joxit/docker-registry-ui[7] 和hyper/docker-registry-web[8] 都有什么作用?
更多可视化镜像,可参考 Docker Registry Web UI[9]
joxit/docker-registry-ui
和 hyper/docker-registry-web
都是用于 Docker 镜像仓库(Registry)的用户界面工具,它们提供了一种方便的方式来管理和浏览 Docker 镜像仓库。
-
joxit/docker-registry-ui
:-
joxit/docker-registry-ui
是一个基于 Web 的用户界面工具,用于管理 Docker 镜像仓库。 -
它提供了一个直观的界面,允许你查看、搜索和浏览 Docker 镜像,管理标签(tags),以及执行一些基本的仓库操作,如删除镜像或标签。 -
这个工具可以帮助你更轻松地管理 Docker 镜像仓库,并提供了一种友好的方式来查看和操作镜像。
-
-
hyper/docker-registry-web
:-
hyper/docker-registry-web
是另一个基于 Web 的用户界面工具,用于管理 Docker 镜像仓库。 -
它提供了一个简单易用的界面,允许你浏览镜像仓库中的镜像和标签,查看详细信息,并执行一些基本的管理操作,如删除镜像或标签。 -
与 joxit/docker-registry-ui
类似,它可以使 Docker 镜像仓库的管理更加方便和可视化。
-
这些工具主要用于与 Docker 镜像仓库进行交互的操作,并提供了一个用户友好的界面来执行这些操作,而无需直接使用 Docker 命令行或其他 API。它们使得查看和管理 Docker 镜像仓库变得更加直观和易于操作。
请注意,这两个工具是由不同的开发者维护的,具体的功能和界面可能有所不同。你可以根据个人偏好选择其中一个来满足你对 Docker 镜像仓库管理的需求。
![alt](https://i-blog.csdnimg.cn/blog_migrate/3b516bbf174bed82c516afd8b464107c.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/c7123ce4b7ecdc4a8efab847a4f38dc4.png)
看起来前者用的多一些
参考 Docker 安装私有镜像仓库 Registry 和 可视化镜像管理工具 docker-registry-ui [10],
docker pull joxit/docker-registry-ui:1.5-static
而后执行
docker run -p 8280:80 --name registry-ui \
--link zen_spence:zen_spence \
-e REGISTRY_URL="http://registry:5000" \
-e DELETE_IMAGES="true" \
-e REGISTRY_TITLE="Registry" \
-d joxit/docker-registry-ui:1.5-static
其中 zen_spence
为docker ps查看到的Docker Registry服务的名称...(如果不指定,每次随机分配一个..)
通过上面这段命令启动的docker-registry-ui会Exited
用其他方式:
首先可以在启动registry服务时,通过* --name registry* 指定名称。即 docker run -d -p 5000:5000 -v /Users/fliter/docker_volume/shuang_mac_registry:/tmp/registry --privileged=true --name registry registry
再执行 docker run -d -p 5050:80 --name docker-registry-ui joxit/docker-registry-ui
访问http://localhost:5050/[11],可以看到界面
在页面右上方新增url http://localhost:5000/
会报如下错误:
An error occured: Check your connection and your registry must have Access-Control-Allow-Origin
header set to http://localhost:5050
启动跨域后,私有仓库的ui框架才能顺利通过registry提供的接口拿到数据,不然会报跨域的错误。 当然也可以启动registry容器后,在进入容器里边进行跨域设置。
解决起来还比较麻烦。。
将之前的docker-registry和docker-registry-ui都删掉,多个服务,用docker-compose部署最方便
参照: docker-compose简单使用。同时启动私有仓库与私有仓库管理ui[12]
创建config.yaml:
给registry创建一个配置文件,主要是配置允许跨域
mkdir -p /Users/fliter/docker_config_center
cat > /Users/fliter/docker_config_center/config.yml <<EOF
version: 0.1
log:
accesslog:
disabled: true
level: debug
formatter: text
fields:
service: registry
environment: staging
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
Access-Control-Allow-Origin: ['http://127.0.0.1']
Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']
Access-Control-Allow-Headers: ['Authorization', 'Accept']
Access-Control-Max-Age: [1728000]
Access-Control-Allow-Credentials: [true]
Access-Control-Expose-Headers: ['Docker-Content-Digest']
http2:
disabled: false
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
EOF
使用docker-compose同时启动这两个容器即可
cat > docker-compose.yaml <<EOF
version: '2.0'
services:
registry:
image: registry:2.8.1
ports:
- 5000:5000
volumes:
- /Users/fliter/docker_volume/shuang_mac_registry:/var/lib/registry
- /Users/fliter/docker_config_center/config.yml:/etc/docker/registry/config.yml
ui:
image: joxit/docker-registry-ui:latest
ports:
- 80:80
environment:
- REGISTRY_TITLE=My Private Docker Registry
- REGISTRY_URL=http://127.0.0.1:5000
- SINGLE_REGISTRY=true
depends_on:
- registry
EOF
然后执行 docker-compose up -d
直接访问 http://localhost/ 即可
![alt](https://i-blog.csdnimg.cn/blog_migrate/cb23757f275f9524d2081b4c458ac17f.png)
docker push 0.0.0.0:5000/ubuntu-advanced:v1
进入容器查看
![alt](https://i-blog.csdnimg.cn/blog_migrate/8c0fd17db2c84983cd2fdc063c9adad3.png)
已经push成功。
但访问 http://localhost/
![alt](https://i-blog.csdnimg.cn/blog_migrate/7c2a000684e5ef2fe120300746c89e8b.png)
这是因为之前上面的docker-compose.yaml中REGISTRY_URL=
后面有个空格
docker-compose down
停止,而后docker-compose up -d
重新拉起
如果访问 http://localhost/ ,还是会报之前的跨域问题
![alt](https://i-blog.csdnimg.cn/blog_migrate/d22ee25e83117e3229f769bac548c810.png)
需要访问 http://127.0.0.1/
![alt](https://i-blog.csdnimg.cn/blog_migrate/73647df23d55c6cea517e3f797d60806.png)
点击镜像,可以看到更详细的信息
![alt](https://i-blog.csdnimg.cn/blog_migrate/05398bcf516f23d90cb10e06e182c007.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/93c2e7b15135a76af4aa560fceff6ee5.png)
参考资料
github.com/docker-archive/docker-registry: https://github.com/docker-archive/docker-registry
[2]github.com/distribution/distribution: https://github.com/distribution/distribution
[3]Docker入门:私有库(Docker Registry)简介及使用方法(防踩坑): https://blog.csdn.net/weixin_37926734/article/details/123279987
[4]这篇博客: https://www.cnblogs.com/leozhanggg/p/12050322.html
[5]还有这篇,通docker-compose的方式部署,比较推荐: https://www.1zilc.top/javascript/%E7%A7%81%E4%BA%BAdocker-registry%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8D%97/1zilc/
[6]搭建docker私有仓库 配置用户名密码: https://blog.csdn.net/qq_38637558/article/details/99603071
[7]joxit/docker-registry-ui: https://hub.docker.com/r/joxit/docker-registry-ui
[8]hyper/docker-registry-web: https://hub.docker.com/r/hyper/docker-registry-web
[9]Docker Registry Web UI: https://ijayer.github.io/post/tech/devops/docker/20181026-registry-and-webui/
[10]Docker 安装私有镜像仓库 Registry 和 可视化镜像管理工具 docker-registry-ui : https://www.cnblogs.com/Cryan/p/15043236.html
[11]http://localhost:5050/: http://localhost:5050/
[12]docker-compose简单使用。同时启动私有仓库与私有仓库管理ui: http://m.tnblog.net/aojiancc2/article/details/7760
本文由 mdnice 多平台发布