Docker harbor私有仓库部署与管理
Docker的私有库房
-
推送镜像到私有库房中
因为docker的私有库房并不便利,而且检查的时分是以键值对显示,所以用起来并不便利。
Harbor 简介
什么是Harbor
Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是协助用户迅速搭建一个企业级的 Docker Registry 服务。
Harbor以 Docker 公司开源的 Registry 为根底,供给了图形办理 UI 、依据人物的拜访操控(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功用,一起还原生支撑中文。
Harbor 的每个组件都是以 Docker 容器的方式构建的,运用 docker-compose 来对它进行布置。用于布置 Harbor 的 docker-compose 模板坐落 harbor/docker-compose.yml。
Harbor的特性
- 依据人物操控:用户和库房都是依据项目进行组织的,而用户在项目中能够具有不同的权限。
- 依据镜像的仿制战略:镜像能够在多个Harbor实例之间进行仿制(同步)。
- 支撑 LDAP/AD:Harbor 能够集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对现已存在的用户认证和办理。
- 镜像删去和废物收回:镜像能够被删去,也能够收回镜像占用的空间。
- 图形化用户界面:用户能够经过阅读器来阅读,查找镜像库房以及对项目进行办理。
- 审计办理:一切针对镜像库房的操作都能够被记载追溯,用于审计办理。
- 支撑 RESTful API:RESTful API 供给给办理员关于 Harbor 更多的操控, 使得与其它办理软件集成变得更简单。
- Harbor和docker registry的关系:Harbor实质上是对docker registry做了封装,扩展了自己的事务模板。
Harbor的构成
Harbor 在架构上首要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六个组件。
-
Proxy: 是一个 nginx 的前端署理,Harbor 的 Registry、UI、Token 服务等组件,都处在 nginx 反向署理后边。 该署理将来自阅读器、docker clients 的恳求转发到后端不同的服务上。
-
Registry: 担任贮存 Docker 镜像,并处理 Docker push/pull 指令。因为要对用户进行拜访操控,即不同用户对 Docker 镜像 有不同的读写权限,Registry 会指向一个 Token 服务,强制用户的每次 Docker pull/push 恳求都要带着一个合法的 Token, Registry 会经过公钥对 Token 进行解密验证。
-
Core services: Harbor的中心功用,首要供给以下3个服务:
- UI(harbor-ui): 供给图形化界面,协助用户办理 Registry 上的镜像(image), 并对用户进行授权。
- WebHook:为了及时获取Registry 上image 状况变化的状况,在Registry 上装备 Webhook,把状况变化传递给 UI 模块。
- Token 服务:担任依据用户权限给每个 Docker push/pull 指令签发 Token。Docker 客户端向 Registry 服务建议的恳求, 假如不包括 Token,会被重定向到 Token 服务,取得 Token 后再重新向 Registry 进行恳求。
-
Database(harbor-db):为core services供给数据库服务,担任贮存用户权限、审计日志、Docker 镜像分组信息等数据。
-
Job services: 首要用于镜像仿制,本地镜像能够被同步到长途 Harbor 实例上。
-
Log collector(harbor-log): 担任收集其他组件的日志到一个当地。
Harbor 的每个组件都是以 Docker 容器的方式构建的,因而,运用 Docker Compose 来对它进行布置。
一共分为7个容器运转,经过在docker-compose.yml地点目录中履行 docker-compose ps 指令来检查, 名称分别为:nginx、harbor-jobservice、harbor-ui、harbor-db、harbor-adminserver、registry、harbor-log。
其中 harbor-adminserver 首要是作为一个后端的装备数据办理,并没有太多的其他功用。harbor-ui 所要操作的一切数据都经过 harbor-adminserver 这样一个数据装备办理中心来完结。
Harbor架构图
Harbor 布置
- Harbor服务器: 192.168.44.20
- docker-ce、docker-compose、harbor-offline-v1.2.2
- client服务器: 192.168.44.30
- docker-ce
操作过程
-
先布置 Docker-Compose 服务,可看Docker-compose – (juejin.cn)中的布置过程。
-
布置 Harbor 服务
- 方法一:下载或上传 Harbor 装置程序
- Harbor的压缩包下载地址:github.com/goharbor/ha…
- 方法一:下载或上传 Harbor 装置程序
wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
关于 Harbor.cfg 装备文件中有两类参数:所需参数和可选参数
-
所需参数:这些参数需求在装备文件 Harbor.cfg 中设置。假如用户更新它们并运转 install.sh 脚本重新装置 Harbor, 参数将收效。详细参数如下:
-
hostname:用于拜访用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限定的域名(FQDN),例如 192.168.44.10 或 hub.abc.cn。不要运用 localhost 或 127.0.0.1 为主机名。
-
ui_url_protocol:(http 或 https,默以为 http)用于拜访 UI 和令牌/告诉服务的协议。假如公证处于启用状况,则此参数必须为 https。
-
max_job_workers:镜像仿制作业线程。
-
db_password:用于db_auth 的MySQL数据库root 用户的暗码。
-
customize_crt:该特点可设置为翻开或封闭,默许翻开。翻开此特点时,准备脚本创立私钥和根证书,用于生成/验证注册表令牌。当由外部来源供给密钥和根证书时,将此特点设置为 off。
-
ssl_cert:SSL 证书的途径,仅当协议设置为 https 时才应用。
-
secretkey_path:用于在仿制战略中加密或解密长途 register 暗码的密钥途径。
-
-
可选参数:这些参数关于更新是可选的,即用户能够将其保存为默许值,并在发动 Harbor 后在 Web UI 上进行更新。假如进入 Harbor.cfg,只会在第一次发动 Harbor 时收效,随后对这些参数的更新,Harbor.cfg 将被疏忽。
- 留意:假如挑选经过 UI 设置这些参数,请保证在发动 Harbor 后立即履行此操作。详细来说,必须在注册或在 Harbor 中创立任何新用户之前设置所需的 auth_mode。当体系中有用户时(除了默许的 admin 用户), auth_mode 不能被修正。 详细参数如下:
-
Email:Harbor 需求该参数才干向用户发送“暗码重置”电子邮件,而且只要在需求该功用时才启用。请留意,在默许状况下 SSL 衔接时没有启用。假如 SMTP 服务器需求 SSL,但不支撑 STARTTLS,那么应该经过设置启用 SSL email_ssl = TRUE。
-
harbor_admin_password:办理员的初始暗码,只在 Harbor 第一次发动时收效。之后, 此设置将被疏忽,而且应在 UI 中设置办理员的暗码。请留意,默许的用户名/暗码是admin/Harbor12345。
-
auth_mode:运用的认证类型,默许状况下,它是 db_auth,即凭据存储在数据库中。关于LDAP身份验证,请将其设置为 ldap_auth。
-
self_registration:启用/禁用用户注册功用。禁用时,新用户只能由 Admin 用户创立,只要办理员用户能够在 Harbor 中创立新用户。留意:当 auth_mode 设置为 ldap_auth 时,自注册功用将一直处于禁用状况,而且该标志被疏忽。
-
Token_expiration:由令牌服务创立的令牌的到期时刻(分钟),默以为 30 分钟。
-
project_creation_restriction:用于操控哪些用户有权创立项目的标志。默许状况下,每个人都能够创立一个项目。 假如将其值设置为“adminonly”,那么只要 admin 能够创立项目。
-
verify_remote_cert:翻开或封闭,默许翻开。此标志决定了当Harbor与长途 register 实例通信时是否验证 SSL/TLS 证书。 将此特点设置为 off 将绕过 SSL/TLS 验证,这在长途实例具有自签名或不可信证书时常常运用。
-
别的,默许状况下,Harbor 将镜像存储在本地文件体系上。在生产环境中,能够考虑 运用其他存储后端而不是本地文件体系,如 S3、Openstack Swif、Ceph 等对象存储。但需求更新common/templates/registry/config.yml 文件。
Harbor的默许镜像存储途径在 /data/registry 目录下,映射到docker容器里面的 /storage 目录下。
这个参数是在 docker-compose.yml 中指定的,在 docker-compose up -d 运转之前修正。
假如期望将 Docker 镜像存储到其他的磁盘途径,能够修正这个参数。
-
发动 Harbor。在装备好了 harbor.cfg 之后,履行 ./prepare 指令,为 harbor 发动的容器生成一些必要的文件(环境),再履行指令 ./install.sh 以 pull 镜像并发动容器
docker-compose up -d #发动
docker-compose stop #中止
docker-compose restart #重新发动
处理容器状况不正常
-
假如重启失利,先履行
docker-compose down
,封闭并清除一切容器,再docker-compose up -d
发动 -
假如状况都为UP还登录不了,在/etc/sysctl.conf中翻开ip转发功用
net.ipv4.ip_forward=1
,再重启network和docker,然后进行前两步的重启
创立新项目
-
阅读器拜访:http://192.168.44.20 登录 Harbor WEB UI 界面,默许的办理员用户名和暗码是 admin/Harbor12345
-
输入用户名和暗码登录界面后能够创立一个新项目。点击“+项目”按钮
-
此刻可运用 Docker 指令在本地经过 127.0.0.1 来登录和推送镜像。默许状况下,Registry 服务器在端口 80 上侦听。
推送镜像
在其他客户端上传镜像
以上操作都是在 Harbor 服务器本地操作。假如其他客户端登录到 Harbor,就会报如下过错。呈现这问题的原因为Docker Registry 交互默许运用的是 HTTPS,可是搭建私有镜像默许运用的是 HTTP 服务,所以与私有镜像交互时呈现以下过错。
docker login -u admin -p Harbor12345 http://192.168.44.20
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://192.168.44.20/v2/: dial tcp 192.168.44.20:443: connect: connection refused
- 在 Docker 客户端装备操作
//处理办法是:在 Docker server 发动的时分,增加发动参数,默许运用 HTTP 拜访。
vim /usr/lib/systemd/system/docker.service
--13行--修正
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.44.20 --containerd=/run/containerd/containerd.sock
或
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.44.20
//重启 Docker,再次登录
systemctl daemon-reload
systemctl restart docker
//再次登录 Harbor
docker login -u admin -p Harbor12345 http://192.168.44.20
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Login Succeeded
//将主动保存凭据到/root/.docker/config.json,下次登录时可直接运用凭据登录 Harbor
//下载镜像进行测验
docker pull 192.168.44.20/myproject-test/nginx:v1
//上传镜像进行测验
docker pull cirros
docker tag cirros:latest 192.168.44.20/myproject-test/cirros:v2
docker push 192.168.44.20/myproject-test/cirros:v2
- 改写 Harbor 的 Web 办理界面进行检查,会发现 myproject-test 项目里面有两个镜像
保护办理Harbor
-
经过 Harbor Web 创立项目
- 在 Harbor 库房中,任何镜像在被 push 到 regsitry 之前都必须有一个自己所属的项目。
- 单击“+项目”,填写项目名称,项目等级若设置为”私有”,则不勾选。假如设置为公共库房,则一切人对此项目下的镜像具有读权限,指令行中不需求履行”Docker login”即可下载镜像,镜像操作与 Docker Hub 一致。
-
创立 Harbor 用户
- (1)创立用户并分配权限
- 在 Web 办理界面中单击体系办理 -> 用户办理 -> +用户,
- 填写用户名为“test-zhangsan”,邮箱为“test-zhangsan@test.com”,全名为“zhangsan”,暗码为“Abc123456”,注释为“办理员”(可省掉)。
- 附:用户创立成功后,单击左边“…”按钮可将上述创立的用户设置为办理员人物或进行删去操作,本例不作任何设置。
人物 | 权限阐明 |
---|---|
访客 | 关于指定项目具有只读权限 |
开发人员 | 关于指定项目具有读写权限,但没有删去权限 |
保护人员 | 关于指定项目具有读写权限,也能够修正其它装备,比方创立 Webhooks |
项目办理员 | 除了读写权限,一起具有用户办理/镜像扫描等办理权限 |
-
(2)增加项目成员
- 单击项目 -> myproject-kgc-> 成员 -> + 成员,填写上述创立的用户 kgc-zhangsan 并分配人物为“开发人员”。
- 附:此刻单击左边“…”按钮仍然可对成员人物进行改变或者删去操作
-
(3)在客户端上运用一般账户操作镜像
//删去上述打标签的本地镜像
docker rmi 192.168.44.20/myproject-test/cirros:v2
//先退出当时用户,然后运用上述创立的账户 test-zhangsan 登录
docker logout 192.168.44.20
docker login 192.168.44.20
或
docker login -u test-zhangsan -p Abc123456 http://192.168.44.20
//下载和上传镜像进行测验
docker pull 192.168.44.20/myproject-test/cirros:v2
docker tag cirros:latest 192.168.44.20/myproject-test/cirros:v3
docker push 192.168.44.20/myproject-test/cirros:v3
-
检查日志
- Web 界面日志,操作日志按时刻顺序记载用户相关操作
-
修正 Harbor.cfg 装备文件
- 要更改 Harbor的装备文件中的可选参数时,请先中止现有的 Harbor实例并更新 Harbor.cfg;然后运转 prepare 脚原本填充装备; 最终重新创立并发动 Harbor 的实例。
运用 docker-compose 办理 Harbor 时,必须在与 docker-compose.yml 相同的目录中运转。
cd /usr/local/harbor
docker-compose down -v
vim harbor.cfg #只能修正可选参数
./prepare
docker-compose up -d
//假如有以下报错,需求开启防火墙 firewalld 服务处理
Creating network "harbor_harbor" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b53c314f45e8 -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))
systemctl restart firewalld.service
docker-compose up -d
- 移除 Harbor 服务容器一起保存镜像数据/数据库,并进行迁移
- 在Harbor服务器上操作
(1)移除 Harbor 服务容器
cd /usr/local/harbor
docker-compose down -v
(2)把项目中的镜像数据进行打包
//持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的/var/log/Harbor/目录下
ls /data/registry/docker/registry/v2/repositories/myproject-test
cd /data/registry/docker/registry/v2/repositories/myproject-test
tar zcvf test-registry.tar.gz ./*
- 如需重新布置,需求移除 Harbor 服务容器全部数据
cd /usr/local/harbor
docker-compose down -v
rm -r /data/database
rm -r /data/registry
总结
harbor 私有库房的镜像格局:harbor_url/项目名称/image_name : tag
- 公有项目:任何人不用登录库房就能拉取项目中的镜像
- 私有项目:需求先登录库房,且具有权限的用户才干拉取镜像