使用harbor搭建私有docker仓库
小伙伴们,想不想自己建立自己的 docker 私库。本篇介绍了什么是 Harbor,如何安装。来,动起手来。
本篇介绍了使用官方在线/离线安装包,进行 Harbor 的安装的过程。
什么是 Harbor?
Harbor——Manage and serve container images in a secure environment.
这是关于 Harbor 的官方介绍,用来管理与服务容器,说白了就是私仓。
Harbor 是一个开源的云容器仓库,用于存储、签名和扫描容器映像以查找漏洞。
Harbor 通过提供信任、合规性、性能和互操作性来解决容器的共性问题。它填补了无法使用公有云、基于云容器或者是想获得跨云的一致体验的企业们和应用程序之间的空白。
链接:Harbor 官网
安装 Harbor
安装方法简介
在线安装方式
主要是从 Docker Hub 下载 Harbor 镜像,所以这种安装方式,对于空间的要求非常小。
离线安装方式
当没有网络的时候,可以使用这种安装方法,离线包里面有预打包的容器,所以比较大。
Kubernetes 安装方式
需要Kubernetes v1.6.5 and Harbor v1.2.0,参考:Integration with Kubernetes
硬件环境
资源 | 最小配置 | 描述 |
---|---|---|
CPU | >2 CPU | 4 CPU 最好 |
Mem(内存) | >4GB | 8GB 最好 |
Disk(硬盘) | >40GB | 160GB 最好 |
软件环境
软件环境 | 版本 | 描述 |
---|---|---|
Python | >2.7 | 有一些 Linux 发行版是没有默认安装 Python 的,需要自己手动安装 |
Docker engine | >1.10 | 安装 Docker,请参考我们的另一个博文:Docker 入门之安装教程;官方教程:Install Docker CE |
Docker Compose | >1.6.0 | 请参考安装教程:docker-compose 命令安装方法;官方教程:Install Docker Compose |
Openssl | lastest | 用于产生证书与密钥(一般 Linux 发行版会默认安装) |
网络端口
端口 | 协议 | 描述 |
---|---|---|
443 | HTTPS | Harbor portal 和 core API 将会使用 443 接口用于 HTTPS 协议 |
4443 | HTTPS | 当 Notray 使用时,Harbor 使用这个端口用于 Docker 中可信任内容的传输。 |
80 | HTTP | Harbor portal 和 core API 将会使用 80 接口用于 HTTP 协议 |
安装步骤
基本的安装步骤
- 下载安装包,在release页面进行下载
- 配置
harbor.cfg
- 运行
install.sh
使用如下命令进行解压
Online installer:
1
$ tar xvf harbor-online-installer-<version>.tgz
Offline installer:
1
$ tar xvf harbor-offline-installer-<version>.tgz
配置 Harbor
- Required parameters
- Optional parameters
其中,Required parameters 有:
hostname:使用 ip 或者域名,切忌使用
localhost
或者127.0.0.1
ui_url_protocol:默认为
http
协议(可选https
或者http
),如果需要配置SSL
证书,请参考HTTPS 配置db_password:数据库 PostgreSQL 的 root 密码
max_job_workers:默认为
10
,根据现有的任务数量需要进行更改,每个任务会占用network/CPU/IO
资源,所以分配了之后注意观察。customize_crt:默认为
on
,可以设置成off
。harbor 会自动生成证书与密钥对,如果需要自己生成,请参考:Customize Harbor token service with your key and certificatessl_cert:SSL 证书路径,只有当设置成 https 生效。
ssl_cert_key:SSL 密钥,同上。
secretkey_path:用于加密或者解密远程仓库的密钥路径(去访问其他仓库使用的密钥)
log_rotate_count:如果设置成
0
,则老旧的日志文件就会被清除掉,而不是进行滚动增加。log_rotate_size:滚动日志的大小,默认单位是
kb
,可以设置成100M
或者是100G
http_proxy:http 代理路径
https_proxy:https 代理
no_proxy:不需要代理的地址或者域名,如:
127.0.0.1
使用
vi
命令对harbor.cfg
文件进行编辑
其中,Optional parameters 有:
Email settings
参考如下配置:
- email_server = smtp.mydomain.com
- email_server_port = 25
- email_identity =
- email_username = sample_admin@mydomain.com
- email_password = abc
- email_from = admin sample_admin@mydomain.com
- email_ssl = false
- email_insecure = false
harbor_admin_password:管理员密码
auth_mode:默认是
db_auth
,可选ldap_auth
或者db_auth
重要提示:当从已有的 Harbor 进行升级时,要确保
auth_mode
与harbor.cfg
中的配置是一样的。ldap_url:LDAP 入口地址:e.g.
ldaps://ldap.mydomain.com
,只有ldap_auth
模式下才有效ldap_searchdn:DN 用户,e.g.
uid=admin,ou=people,dc=mydomain,dc=com
ldap_search_pwd:搜索用户的密码
ldap_basedn:基础用户,e.g.
ou=people,dc=mydomain,dc=com
ldap_filter:搜索过滤,e.g.
(objectClass=person)
ldap_uid:用于在搜索的时候,对用于进行匹配:可以是 uid, cn, email 或者是其他属性。
ldap_scope:搜索的范围:0-LDAP_SCOPE_BASE, 1-LDAP_SCOPE_ONELEVEL, 2-LDAP_SCOPE_SUBTREE. 默认是 2.
ldap_timeout:超时时长,默认是 5.
ldap_verify_cert:是否从 LDAP 服务器进行认证,默认是 true.
ldap_group_basedn:基础的搜索组, e.g.
ou=group,dc=mydomain,dc=com
ldap_group_filter:组过滤
ldap_group_gid:组属性,如 cn, name
ldap_group_scope:搜索的范围:0-LDAP_SCOPE_BASE, 1-LDAP_SCOPE_ONELEVEL, 2-LDAP_SCOPE_SUBTREE.默认是 2.
self_registration: (on or off. Default is on) 是否允许自注册,一般来说
auth_mode
被设置成ldap_auth
模式的时候,自注册是被关闭的。token_expiration:默认的 token 过期时长,默认 30 分钟。
project_creation_restriction:设置哪些用户可以创建项目,默认是允许所有的用户进行创建,当设置成
adminonly
时,只允许管理员进行创建。
以下是示例配置:
1 | # Configuration file of Harbor |
配置完成之后,在当前的解压缩的目录下,运行
sudo ./install.sh
是否可以在解压缩的目录下找到相应的文件
install.sh
?如果找不到,可以使用find
命令或者是ls
命令。安装完成之后,就可以访问之前设置的域名或者 IP 地址了,比如上例中的
test.toimc.com
常见问题
如何推送镜像?
1
2docker login test.toimc.com
docker push test.toimc.com/myproject/myrepo:mytag如何申请证书,如何设置 SSL?
有两个先决条件:(1)需要有一个域名; (2)使用 acme 或者 caddy 这种服务进行申请证书。
安装 Notary, 安装 Clair, 安装 chart repository service
安装 Notary,使用如下命令:
sudo ./install.sh --with-notary
安装 Clair,使用如下命令:
sudo ./install.sh --with-clair
安装 Chart repository service,使用如下命令:
sudo ./install.sh --with-chartmuseum
PS: 可以这样使用:
sudo ./install.sh --with-notary --with-clair --with-chartmuseum
Harbor 生命周期的管理:
直接使用
docker-compose
管理命令进行管理(PS:需要cd
到之前的 Harbor 的解压目录,即install
目录)停止 Harbor:
1
2
3
4
5
6
7
8
9
10$ sudo docker-compose stop
Stopping nginx ... done
Stopping harbor-portal ... done
Stopping harbor-jobservice ... done
Stopping harbor-core ... done
Stopping registry ... done
Stopping redis ... done
Stopping registryctl ... done
Stopping harbor-db ... done
Stopping harbor-log ... done重启 Harbor:
1
2
3
4
5
6
7
8
9
10$ sudo docker-compose start
Starting log ... done
Starting registry ... done
Starting registryctl ... done
Starting postgresql ... done
Starting core ... done
Starting portal ... done
Starting redis ... done
Starting jobservice ... done
Starting proxy ... done当修改了 Harbor 的配置文件后,需要使用如下的方式更新镜像:
1
2
3
4$ sudo docker-compose down -v
$ vim harbor.cfg
$ sudo prepare
$ sudo docker-compose up -d删除 Harbor 镜像,但是保留文件系统的做法:
1
$ sudo docker-compose down -v
需要全部删除时(包括镜像、文件、仓库)——重装需要/卸载需要
1
2$ rm -r /data/database
$ rm -r /data/registry日志文件路径:
/var/log/harbor
自定义端口:
- 修改
docker-compose.yml
修改”80”端口到一个指定的用户端口, e.g. 8888:80.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20proxy:
image: goharbor/nginx-photon:v1.6.0
container_name: nginx
restart: always
volumes:
- ./common/config/nginx:/etc/nginx:z
ports:
- 8888:80
- 443:443
depends_on:
- postgresql
- registry
- core
- portal
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"- 修改
harbor.cfg
文件中的 hostname 属性:
1
hostname = 192.168.0.2:8888
- 参考上面的管理 harbor 的生命周期的内容,对 Harbor 进行更新。
同理,对于 HTTPS 协议,参考:
- 打开 HTTPS 协议,并配置 SSL 证书:参考guide.
- 修改
docker-compose.yml
修改”443” 端口为用户自定义端口, e.g. 8888:443.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20proxy:
image: goharbor/nginx-photon:v1.6.0
container_name: nginx
restart: always
volumes:
- ./common/config/nginx:/etc/nginx:z
ports:
- 80:80
- 8888:443
depends_on:
- postgresql
- registry
- core
- portal
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"- 修改
harbor.cfg
文件中的 hostname 属性:
1
hostname = 192.168.0.2:8888
- 参考上面的管理 harbor 的生命周期的内容,对 Harbor 进行更新。
- 修改