目录

一、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私有仓库架构

harbor 配置优化 harbor搭建_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)查看镜像

harbor 配置优化 harbor搭建_Docker_02

(2)查看容器 

harbor 配置优化 harbor搭建_Docker_03

(3)检查服务容器是否开启

harbor 配置优化 harbor搭建_运维_04

6.在UI界面创建项目

浏览器访问http://192.168.150.100页面,默认的管理员用户名和密码是 admin/Harbor12345

harbor 配置优化 harbor搭建_docker_05

harbor 配置优化 harbor搭建_Docker_06

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)浏览器上验证是否上传成功 

harbor 配置优化 harbor搭建_运维_07

8.客户端测试

上述操作都是在Harbor服务器本地操作。如果其他客户端上传镜像到Harbor,就会报如下错误。出现这问题的原因Docker Registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交互时出现以下错误。 

(1)错误现象

harbor 配置优化 harbor搭建_nginx_08

(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 配置优化 harbor搭建_docker_09

三、Harbor用户创建

1.创建用户

harbor 配置优化 harbor搭建_运维_10

harbor 配置优化 harbor搭建_Docker_11

harbor 配置优化 harbor搭建_Docker_12

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