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,性能不够,曾经 archived。前面用 Go 重构了,仓库地址 github.com/distribution/distribution
参照如下进行实际:
Docker 入门:公有库(Docker Registry)简介及应用办法(防踩坑)
docker pull registry 拉取镜像
运行公有库 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/
<font size=1 color=”orange”>
也能够按 这篇博客的这种形式来启动
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 的形式部署,比拟举荐
</font>
如果须要明码:
搭建 docker 公有仓库 配置用户名明码
生成账号密码: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
之后 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
而后退出容器
提交容器正本为镜像
应用命令 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)
将本地新制作的镜像 公布到公有仓库 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 注册表中。
批改配置文件使 docker 反对 http
在此处新增一行 “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
始终报错:
记得要敞开代理!
这时通过 curl -XGET http://0.0.0.0:5000/v2/_catalog
或间接在浏览器拜访 http://localhost:5000/v2/_catalog
, 都会失去 {“repositories”:[“ubuntu-advanced”]},即曾经将 unbunt-advanced
镜像推送到公有仓库了~
还能够进入容器的相应目录
这时能够通过 docker pull 0.0.0.0:5000/ubuntu-advanced:v1
拉取该镜像
可视化
几个用于可视化的镜像
joxit/docker-registry-ui 和 hyper/docker-registry-web 都有什么作用?
更多可视化镜像,可参考 Docker Registry Web UI
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 镜像仓库治理的需要。
看起来前者用的多一些
参考 Docker 装置公有镜像仓库 Registry 和 可视化镜像管理工具 docker-registry-ui ,
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/,能够看到界面
在页面右上方新增 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
创立 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/ 即可
docker push 0.0.0.0:5000/ubuntu-advanced:v1
进入容器查看
曾经 push 胜利。
但拜访 http://localhost/
这是因为之前下面的 docker-compose.yaml 中 REGISTRY_URL=
前面有个空格
docker-compose down
进行,而后 docker-compose up -d
从新拉起
如果拜访 http://localhost/,还是会报之前的跨域问题
须要拜访 http://127.0.0.1/
点击镜像,能够看到更具体的信息
本文由 mdnice 多平台公布