基于registry的Harbor镜像仓库部署

Harbor 是 Vmwar 公司开源的 企业级的 Docker Registry 管理项目 它主要 提供 Dcoker Registry 管理UI,可基于角色访问控制, AD/LDAP 集成,日志审核等功能,完全的支持中文。 Harbor 的所有组件都在 Dcoker 中部署,所以 Harbor 可使用 Docker Compose 快速部署。

一、简介

Harbor,是一个英文单词,意思是港湾,港湾是干什么的呢,就是停放货物的,而货物呢,是装在集装箱中的,说到集装箱,就不得不提到Docker容器,因为docker容器的技术正是借鉴了集装箱的原理。所以,Harbor正是一个用于存储Docker镜像的企业级Registry服务。

Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry起的容器的私有仓库中。企业可以根据自己的需求,使用Dokcerfile生成自己的镜像,并推到私有仓库中,这样可以大大提高拉取镜像的效率。

1、优点

Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Regisrty来说,它具有很多的优势。

  • 1.提供分层传输机制,优化网络传输
    Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
  • 2.提供WEB界面,优化用户体验
    只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。
  • 3.支持水平扩展集群
    当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。
  • 4.良好的安全机制
    企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。
  • 5.Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。

2、核心组件

  • Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI, token等服务。
  • db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。
  • UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。
  • jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。
  • Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。
  • Registry:镜像仓库,负责存储镜像文件。
  • Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。

二、安装部署

1、环境要求

Hardware

ResourceCapacityDescription
CPUminimal 2 CPU4 CPU is preferred
Memminimal 4GB8GB is preferred
Diskminimal 40GB160GB is preferred

Software

SoftwareVersionDescription
Pythonversion 2.7 or higherNote that you may have to install Python on Linux distributions (Gentoo, Arch) that do not come with a Python interpreter installed by default
Docker engineversion 1.10 or higherFor installation instructions, please refer to: https://docs.docker.com/engine/installation/
Docker Composeversion 1.6.0 or higherFor installation instructions, please refer to: https://docs.docker.com/compose/install/
Openssllatest is preferredGenerate certificate and keys for Harbor

Network ports

PortProtocolDescription
443HTTPSHarbor portal and core API will accept requests on this port for https protocol
4443HTTPSConnections to the Docker Content Trust service for Harbor, only needed when Notary is enabled
80HTTPHarbor portal and core API will accept requests on this port for http protocol

Docker 相关

安装docker-compose

1
2
yum install python-pip
pip install docker-compose

2、安装方式

在线安装

该方式从Docker hub下载Harbor相关镜像,安装包较小。

离线安装

3、安装

1
2
3
cd /usr/src
wget https://img.econow.cn/harbor-offline-installer-v1.2.2.tgz](https://img.econow.cn/harbor-offline-installer-v1.2.2.tgz
tar -zxvf harbor-offline-installer-v1.2.2.tgz -C /opt/harbor

修改配置文件

vim harbor.cfg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
## Configuration file of Harbor
# hostname 设置访问地址,支持IP,域名,主机名,禁止设置127.0.0.1
# 必须修改!!!
hostname = 内网ip

# 访问协议,可设置 http,https
ui_url_protocol = http

# 邮件通知, 配置邮件通知。
email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
email_ssl = false

# harbor WEB UI登陆使用的密码
harbor_admin_password = Harbor12345

# 认证方式,这里支持多种认证方式,默认是 db_auth ,既mysql数据库存储认证。
# 这里还支持 ldap 以及 本地文件存储方式。
auth_mode = db_auth


# mysql root 账户的 密码
db_password = root123
# 默认密码应该是root,反正root123的时候我登不进去
self_registration = on
use_compressed_js = on
max_job_workers = 3
verify_remote_cert = on
customize_crt = on

# 一些显示的设置.
crt_country = CN
crt_state = State
crt_location = CN
crt_organization = organization
crt_organizationalunit = organizational unit
crt_commonname = example.com
crt_email = example@example.com

1、修改80端口为5000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# vim docker-compose.yml
proxy:
image: vmware/nginx-photon:1.11.13
container_name: nginx
restart: always
volumes:
- ./common/config/nginx:/etc/nginx:z
networks:
- harbor
ports:
- 5000:80
- 443:443
- 4443:4443
depends_on:
- mysql
- registry
- ui
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"

处理模板

1
2
3
4
5
6
7
#vim common/templates/registry/config.yml
auth:
token:
issuer: registry-token-issuer
realm: $ui_url:5000/service/token
rootcertbundle: /etc/registry/root.crt
service: token-service

启动,执行安装,加载镜像

1
./install.sh

更改配置后执行 prepare 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13

./prepare

Generated configuration file: ./config/ui/env
Generated configuration file: ./config/ui/app.conf
Generated configuration file: ./config/registry/config.yml
Generated configuration file: ./config/db/env
Generated configuration file: ./config/jobservice/env
Clearing the configuration file: ./config/ui/private_key.pem
Clearing the configuration file: ./config/registry/root.crt
Generated configuration file: ./config/ui/private_key.pem
Generated configuration file: ./config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.
1
2
3
4
5
6
7
8
9
10
11
12
# docker-compose up -d 启动
# docker-compose ps 查看信息

Name Command State Ports
--------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver /harbor/harbor_adminserver Up
harbor-db docker-entrypoint.sh mysqld Up 3306/tcp
harbor-jobservice /harbor/harbor_jobservice Up
harbor-log /bin/sh -c crond && rm -f ... Up 127.0.0.1:1514->514/tcp
harbor-ui /harbor/harbor_ui Up
nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:5000->80/tcp
registry /entrypoint.sh serve /etc/ ... Up 5000/tcp

访问ip:5000 就可以了
默认帐号密码admin/Harbor12345
然后创建用户和项目,注意区分公开还是私有。

2、修改存储目录

默认情况下存在在/data目录,很多时候还是需要修改一下目录的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

registry:
image: vmware/registry:2.6.2-photon
container_name: registry
restart: always
volumes:
- /joyfs/oam/harbor/registry:/storage:z
- ./common/config/registry/:/etc/registry/:z
...
...
adminserver:
image: vmware/harbor-adminserver:v1.2.2
container_name: harbor-adminserver
env_file:
- ./common/config/adminserver/env
restart: always
volumes:
- /data/config/:/etc/adminserver/config/:z
- /data/secretkey:/etc/adminserver/key:z
- /joyfs/oam/harbor/data/:/data/:z
...
...

3、修改数据库为外置MySQL

1
2
3
4
5
#docker exec -i -t 6e1e4b576315 bash
在db container中:
# mysqldump -u root -p --databases registry > registry.dump
回到node,将dump文件从container中copy出来:
#docker cp 6e1e4b576315:/root/registry.dump ./
1
2
3
4
5
6
7
8
9
10
11
cd common/templates/adminserver
cp env env.bak
vim env
#修改以下内容
MYSQL_HOST=x.x.x.x
MYSQL_PORT=3306
MYSQL_USR=new name
MYSQL_PWD=new password
MYSQL_DATABASE=registry
....
RESET=true

docker-compose.yml删除 MySQL部分配置,包括proxy里面的- mysql。
不过需要注意需要删除 /data/config/config.json 文件。

重启

1
2
3
docker-compose stop
./prepare
docker-compose up -d

验证登录正常,OK!!!

三、推送镜像

1、检查是否包含镜像地址,如果不包含则执行第2步

2、增加仓库地址

1
2
3
4
5
6
7
vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry x.x.x.x:5000
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

部分低版本的则是修改其他文件

1
2
3
4
5
6
#vim  /etc/docker/daemon.json
{ "insecure-registries":["ip:5000"] }

# 重新加载
systemctl daemon-reload
systemctl restart docker

3、构建并推送

1
2
3
4
docker build -t ip:5000/base/jdk .
docker login ip:5000
# 输入账号密码
docker push ip:5000/base/jdk

之后在浏览器检查是否正常即可。

参考资料

github