目录
一、Docker Harbor概述
1.harbor的优势
2.Docker私有仓库架构
3.Harbor 配置文件以及相关参数
二、Harbor构建Docker私有仓库
1.环境和需求
2.安装docker-compose
3.安装harbor-offline-installer-v1.2.2
4.配置Harbo参数文件
5.查看Harbor启动镜像和容器
6.在UI界面创建项目
7.harbor 服务端测试
8.客户端测试
三、Harbor用户创建
1.创建用户
2.客户端测试
3.测试创建的新用户
4.移除Harbor服务容器
一、Docker Harbor概述
有可视化的Web管理界面,可以方便管理Docker镜像,又提供了多个项目的镜像权限管理及控制功能。Harbor是VMware公司开源的企业级Docker Registry项目。
1.harbor的优势
基于角色控制:有管理员与普通用户,可赋权普通用户,比如只能上传和下载,可根据项目来进行操作和管理 基于镜像的复制策略:也与权限相关,比如有只一些用户与组才能对此项目进行相对应的操作 支持 LDAP/AD:域控制,比如南京去下载北京 harbor 私有仓库的镜像,两端打上局域网的地址,连接在一块,数据信息的传输通过一条隧道,会通过两层加密,第一层为隧道加密,第二层为数据加密,安全可靠 图像删除和垃圾收集:即回收站机制 图形 UI:具有统计功能,比如访问量与镜像下载热度 审计:日志,这里意义不大,主要还是借助于 ELK RESTful API:定义 Web 语言规范的格式,方便调用 Harbor 的接口,也便于二次开发
2.Docker私有仓库架构
图中组件解释 Proxy:通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务 Registry:负责存储Docker镜像,并处理docker push/pull命令 Core services:Harbor的核心功能,包括UI、webhook、token服务 Database:为core services提供数据库服务 Log collector:·负责收集其他组件的log,供日后进行分析
3.Harbor 配置文件以及相关参数
Harbor的配置文件是:/usr/local/harbor/harbor.cfg
(1)所需参数-修改此参数后,需要运行 install.sh脚本重新安装 Harbour,参数才会生效。
- hostname
- 用于访问用户界面和 register 服务。
- 它应该是目标机器的 IP 地址或完全限定的域名(FQDN)
- 例如 192.168.163.100 或test.com。
- 不要使用 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 时才应用。
- ssl_cert_key
- SSL 密钥的路径,仅当协议设置为 https 时才应用。
- secretkey_path
- 用于在复制策略中加密或解密远程 register 密码的密钥路径。
- 不建议配置,有很大的安全隐患
(2)可选参数
这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。 如果进入 Harbor.cfg,只会在第一次启动 Harbor 时生效,随后对这些参数 的更新,Harbor.cfg 将被忽略。 注意:如果选择通过UI设置这些参数,请确保在启动Harbour后立即执行此操作。具体来说,必须在注册或在 Harbor 中创建任何新用户之前设置所需的
- auth_mode
- 当系统中有用户时(除了默认的 admin 用户),auth_mode 不能被修改。
- Email
- Harbor需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才需要。
- 请注意,在默认情况下SSL连接时没有启用。如果SMTP服务器需要SSL,但不支持STARTTLS,那么应该通过设置启用SSL email_ssl = TRUE。
- harbour_admin_password
- 管理员的初始密码,只在Harbour第一次启动时生效。
- 之后,此设置将被忽略,并且应 UI中设置管理员的密码。
- 默认的用户名/密码是 admin/Harbor12345。
- auth_mode
- 使用的认证类型
- 默认情况下,它是 db_auth,即凭据存储在数据库中。
- 对于LDAP身份验证,请将其设置为 ldap_auth。
- self_registration
- 启用/禁用用户注册功能。
- 禁用时,新用户只能由 Admin 用户创建,只有管理员用户可以在 Harbour中创建新用户。
- 注意:当 auth_mode 设置为 ldap_auth 时,自注册功能将始终处于禁用状态,并且该标志被忽略。
- Token_expiration
- 由令牌服务创建的令牌的到期时间(分钟),默认为 30 分钟。
- 即登录–退出后,30分钟内可以不输入用户名和密码登录,30分钟后需要再次验证。
- project_creation_restriction
- 用于控制哪些用户有权创建项目的标志,表示哪些用户可以创建项目。
- 默认情况下, 每个人都可以创建一个项目。
- 如果将其值设置为“adminonly”,那么只有 admin 可以创建项目。
- verify_remote_cert
- 打开或关闭,默认打开。
- 此标志决定了当Harbor与远程 register 实例通信时是否验证 SSL/TLS 证书。
- 将此属性设置为 off 将绕过 SSL/TLS 验证,这在远程实例具有自签名或不可信证书时经常使用。
另外,默认情况下,Harbour 将镜像存储在本地文件系统上。在生产环境中,可以考虑 使用其他存储后端而不是本地文件系统,如 S3、Openstack Swif、Ceph 等。但需要更新common/templates/registry/config.yml 文件。
二、Harbor构建Docker私有仓库
1.环境和需求
主机 | 操作系统 | 主机名/IP地址 | 主要软件及版本 | Harbor | Centos7.6 | 192.168.32.15 | docker、docker-compose、harbor-offline-installer-v1.2.2 | Client | Centos7.6 | 192.168.32.16 | docker |
2.安装docker-compose
[root@harbor ~]# cd /usr/local/bin/
[root@harbor bin]# rz -E #上传docker-compose相关软件
rz waiting to receive.
[root@localhost bin]# ls
docker-compose
[root@harbor ~]# chmod +x docker-compose #设置权限
3.安装harbor-offline-installer-v1.2.2
(1)在线下载
wget http:// harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
(2)有相关软件包的情况下直接上传
[root@harbor ~]# cd /usr/local/
[root@harbor local]# rz -E
rz waiting to receive.
[root@harbor local]# ls
harbor-offline-installer-v1.2.2.tgz ...
[root@harbor local]# tar zxvf harbor-offline-installer-v1.2.2.tgz
[root@harbor local]# ls
harbor harbor-offline-installer-v1.2.2.tgz
[root@harbor local]# cd harbor
[root@harbor harbor]# ls
common docker-compose.notary.yml harbor_1_1_0_template harbor.v1.2.2.tar.gz LICENSE prepare
docker-compose.clair.yml docker-compose.yml harbor.cfg install.sh NOTICE upgrade
4.配置Harbo参数文件
[root@harbor harbor]# vim harbor.cfg
...
hostname = 192.168.150.100 #第5行,修改成私有仓库的ip地址
harbor_admin_password = Harbor12345 #第59行,默认密码Harbor12345,用户admin
[root@harbor harbor]# sh install.sh #启动harbor
Note: docker version: 20.10.11
Note: docker-compose version: 1.21.1
[Step 1]: loading Harbor images ...
dd60b611baaa: Loading layer [=======================================>] 133.2MB/133.2MB
abf0579c40fd: Loading layer [=======================================>] 1.536kB/1.536kB
ea1fc7bed9c5: Loading layer [=======================================>] 22.48MB/22.48MB
1d6671367c69: Loading layer [=======================================>] 7.168kB/7.168kB
b322bb3e4765: Loading layer [=======================================>] 5.339MB/5.339MB
5.查看Harbor启动镜像和容器
(1)查看镜像
(2)查看容器?
(3)检查服务容器是否开启
6.在UI界面创建项目
浏览器访问http://192.168.150.100页面,默认的管理员用户名和密码是 admin/Harbor12345
7.harbor 服务端测试
此时可使用Docker命令在本地通过127.0.0.1来登录和推送镜像。默认情况下,Register服务器在端口80上侦听。
(1)登录本地私有仓库
[root@harbor harbor]# docker login -u admin -p Harbor12345 http://127.0.0.1
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
(2)下载镜像进行测试
[root@harbor harbor]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
e5ae68f74026: Pull complete
21e0df283cd6: Pull complete
ed835de16acd: Pull complete
881ff011f1c9: Pull complete
77700c52c969: Pull complete
44be98c0fab6: Pull complete
Digest: sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@harbor harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f652ca386ed1 2 days ago 141MB
(3)镜像打标签
[root@harbor harbor]# docker tag nginx:latest 127.0.0.1/aaa/nginx:v1
[root@harbor harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
127.0.0.1/aaa/nginx v1 f652ca386ed1 2 days ago 141MB
nginx latest f652ca386ed1 2 days ago 141MB
(4)上传镜像到Harbor
[root@harbor harbor]# docker push 127.0.0.1/aaa/nginx:v1 #打标签后才能上传
The push refers to repository [127.0.0.1/aaa/nginx]
2bed47a66c07: Pushed
82caad489ad7: Pushed
d3e1dca44e82: Pushed
c9fcd9c6ced8: Pushed
0664b7821b60: Pushed
9321ff862abb: Pushed
v1: digest: sha256:4424e31f2c366108433ecca7890ad527b243361577180dfd9a5bb36e828abf47 size: 1570
(5)浏览器上验证是否上传成功?
8.客户端测试
上述操作都是在Harbor服务器本地操作。如果其他客户端上传镜像到Harbor,就会报如下错误。出现这问题的原因Docker Registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交互时出现以下错误。?
(1)错误现象
(2)解决方法
[root@docker ~]# vim /usr/lib/systemd/system/docker.service 方法一:修改客户端的配置文件
...
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.150.100 --containerd=/run/containerd/containerd.sock
...
[root@localhost ~]# cat /etc/docker/daemon.json #方法二:修改 /ets/docker/daemon.json
{
"insecure-registries": ["192.168.150.100"], #指向harbor的服务地址ip
"registry-mirrors": ["https://4iv7219l.mirror.aliyuncs.com"]
}
[root@localhost ~]# systemctl daemon-reload #刷新配置
[root@localhost ~]# systemctl restart docker #重启服务
[root@docker docker]# docker login -u admin -p Harbor12345 http://192.168.150.100 #修改报错的信息后,再次登录
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
(3)下载镜像测试
[root@docker docker]# docker tag nginx:latest 192.168.150.100/aaa/nginx:v2
[root@docker docker]# docker push 192.168.150.100/aaa/nginx:v2
The push refers to repository [192.168.150.100/aaa/nginx]
2bed47a66c07: Layer already exists
82caad489ad7: Layer already exists
d3e1dca44e82: Layer already exists
c9fcd9c6ced8: Layer already exists
0664b7821b60: Layer already exists
9321ff862abb: Layer already exists
v2: digest: sha256:4424e31f2c366108433ecca7890ad527b243361577180dfd9a5bb36e828abf47 size: 1570
(4)浏览器上查看
三、Harbor用户创建
1.创建用户
2.客户端测试
删除之前打标签的镜像
[root@docker ~]# docker login 192.168.150.100 -u zch -p Abc12345
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@docker ~]# docker rmi 192.168.150.100/aaa/nginx:v1
Untagged: 192.168.150.100/aaa/nginx:v1
Untagged: 192.168.150.100/aaa/nginx@sha256:4424e31f2c366108433ecca7890ad527b243361577180dfd9a5bb36e828abf47
3.测试创建的新用户
[root@docker ~]# docker pull 192.168.150.100/aaa/nginx:v2 #从私有仓库重新下载v2
v2: Pulling from aaa/nginx
Digest: sha256:4424e31f2c366108433ecca7890ad527b243361577180dfd9a5bb36e828abf47
Status: Downloaded newer image for 192.168.150.100/aaa/nginx:v2
192.168.150.100/aaa/nginx:v2
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.150.100/aaa/nginx v2 f652ca386ed1 3 days ago 141MB
192.168.150.10:5000/nginx latest f652ca386ed1 3 days ago 141MB
[root@localhost ~]# docker tag nginx:latest 192.168.150.100/aaa/nginx:v3 #打标签v3
[root@localhost ~]# docker push 192.168.150.100/aaa/nginx:v3 #上传测试
The push refers to repository [192.168.150.100/aaa/nginx]
2bed47a66c07: Layer already exists
82caad489ad7: Layer already exists
d3e1dca44e82: Layer already exists
c9fcd9c6ced8: Layer already exists
0664b7821b60: Layer already exists
9321ff862abb: Layer already exists
v3: digest: sha256:4424e31f2c366108433ecca7890ad527b243361577180dfd9a5bb36e828abf47 size: 1570
4.移除Harbor服务容器
把项目中的镜像数据进行打包
(1)在Harbor服务器上操作
[root@harbor ~]# cd /usr/local/harbor/
[root@harbor harbor]# docker-compose down -v
Stopping harbor-jobservice ... done
Stopping nginx ... done
Stopping harbor-ui ... done
Stopping registry ... done
Stopping harbor-adminserver ... done
Stopping harbor-db ... done
Stopping harbor-log ... done
Removing harbor-jobservice ... done
Removing nginx ... done
Removing harbor-ui ... done
Removing registry ... done
Removing harbor-adminserver ... done
Removing harbor-db ... done
Removing harbor-log ... done
Removing network harbor_harbor
[root@harbor harbor]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@harbor ~]# cd /usr/local/harbor/
[root@harbor harbor]# docker-compose down -v
[root@harbor harbor]# ls /data/registry/docker/registry/v2/repositories/aaa
nginx
[root@harbor harbor]# cd /data/registry/docker/registry/v2/repositories/aaa/
[root@harbor harbor]# tar zcvf aaa.tar.gz ./*
(2)如需重新部署,需要移除Harbor服务容器全部数据
持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的/var/log/Harbor/目录下
rm -rf /data/database
rm -rf /data/registry
|