Harbor部署
证书配置
生成根证书
证书放置位置/data/cert/
如果不存在则创建。
$ mkdir -p /data/cert/ && cd /data/cert/
$ openssl genrsa -out ca.key 2048
$ openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.crt -subj "/CN=Harbor-ca"
生成服务证书
openssl.cnf
内容如下:
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 172.20.201.101
将172.20.201.101
替换成Harbor服务所在服务器的IP地址。如有域名或更多的IP,请参考如下方式追加:
DNS.1 = [example1.com]
DNS.2 = [example2.com]
IP.2 = [IP2]
IP.3 = [IP3]
生成证书
$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout server.key -out server.csr
$ openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -extensions v3_req -extfile openssl.cnf
设置docker证书
# 如果如下目录不存在,请创建,如果有域名请按此格式依次创建
mkdir -p /etc/docker/certs.d/172.20.201.101
# mkdir -p /etc/docker/certs.d/[IP2]
# mkdir -p /etc/docker/certs.d/[example1.com]
# 如果端口为443,则不需要指定。如果为自定义端口,请指定端口
# /etc/docker/certs.d/yourdomain.com:port
# 将ca根证书依次复制到上述创建的目录中
cp ca.crt /etc/docker/certs.d/172.20.201.101/
安装Harbor
下载
$ wget https://github.com/vmware/harbor/releases/download/0.5.0-rc1/harbor-online-installer-0.5.0-rc1.tgz
$ tar xvf harbor-online-installer-0.5.0-rc1.tgz
$ cd harbor
配置
修改harbor.cnf
内容如下:
## Harbor的配置文件
# 访问管理UI与注册服务的IP地址或主机名
# 别使用localhost或127.0.0.1,因为Harbor需要被外部的客户端访问。
hostname = 172.20.201.101
# 访问UI与token/notification服务的协议,默认为http。
# 如果在nginx中开启了ssl,可以设置为https
ui_url_protocol = https
# 发送重置密码的邮件账号。
email_identity = Mail Config
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初始化密码,仅当第一次启动Harbor时有效。在启动Harhor之后失效。
# 从UI上修改管理员密码。
harbor_admin_password = Harbor12345
## 默认情况下认证模式为db_auth,如:证书被存储在本地的数据库中。
# 如果想使用LDAP服务来做认证,则设置为ldap_auth。
auth_mode = db_auth
# ldap的接入点url。
ldap_url = ldaps://ldap.mydomain.com
# 有权限搜索LDAP/AD服务的用户的DN(如:uid=admin,ou=people,dc=mydomain,dc=com)。
# 如果LDAP/AD服务部支持匿名搜索,则需要配置这个DN与ldap_search_pwd。
#ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com
#the password of the ldap_searchdn
# 在ldap_searchdn配置的用户的密码。
#ldap_search_pwd = password
#The base DN from which to look up a user in LDAP/AD
# 查找用户的最基础的DN
ldap_basedn = ou=people,dc=mydomain,dc=com
# 查询过滤器,用于查找用户,确认过滤器语法是否正确。
#ldap_filter = (objectClass=person)
# 在LDAP搜索时用于匹配用户的属性,可能是uid, cn, email,sAMAccountName或其他属性取决于LDAP/AD。
ldap_uid = uid
# 搜索用户的范围, 1-LDAP_SCOPE_BASE, 2-LDAP_SCOPE_ONELEVEL, 3-LDAP_SCOPE_SUBTREE
ldap_scope = 3
# mysql中root用户的密码,在任何生产环境使用之前请修改。
db_password = root123
# 开启或关闭自签名特性
self_registration = on
# 确认UI中的js文件是否进行压缩。生产环境中,设置为on,开发环境中设置为off。
use_compressed_js = on
# job服务中最大job workers数。
max_job_workers = 3
# 通过令牌服务生成的令牌有效时间(单位:分钟),默认为30分钟。
token_expiration = 30
# 确认当链接远程仓库时,job服务是否验证ssl证书。
# 当远程仓库使用自签名证书或不可信证书时,设置标签为off。
verify_remote_cert = on
# 确认是否为注册令牌生成证书。
# 如果设置为on,prepare脚本将为正在生成的令牌生成新的根证书与私钥用于访问仓库。如果设置为off,则必须提供一个用于生成令牌的证书与私钥。
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
# 此标签用于控制哪些用户具有创建项目的权限。
# 默认情况下为任何一个人,设置为"adminonly"后仅管理员可以创建项目。
project_creation_restriction = everyone
# nginx需要的cert与key文件路径,仅当协议设置为https时生效。
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
#############
启动
生成Harbor的配置文件:
./prepare
$ docker-compose up -d
Creating network "harbor_default" with the default driver
Creating harbor-log
Creating harbor-db
Creating registry
Creating harbor-ui
Creating harbor-jobservice
Creating nginx
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ac40ba2ca39 nginx:1.11.5 "nginx -g 'daemon off" 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
0af0ffd056de vmware/harbor-jobservice:0.5.0-rc1 "/harbor/harbor_jobse" 5 minutes ago Up 5 minutes harbor-jobservice
c5c5b1f2c1f3 library/registry:2.5.0 "/entrypoint.sh serve" 5 minutes ago Up 5 minutes 5000/tcp registry
9839ab999dcf vmware/harbor-db:0.5.0-rc1 "docker-entrypoint.sh" 5 minutes ago Up 5 minutes 3306/tcp harbor-db
b68d4e4e9a8b vmware/harbor-ui:0.5.0-rc1 "/harbor/harbor_ui" 5 minutes ago Up 5 minutes harbor-ui
7526a113e3e8 vmware/harbor-log:0.5.0-rc1 "/bin/sh -c 'crond &&" 5 minutes ago Up 5 minutes 0.0.0.0:1514->514/tcp harbor-log
$ docker login 172.20.201.101
Username: admin
Password:
Login Succeeded
测试
浏览器打开https://172.20.201.101
,界面如下图:
提交一个镜像至私有仓库:
# 如果本地不存在测试镜像请先拉取,如:docker pull nginx
$ docker tag nginx 172.20.201.101/library/nginx && docker push 172.20.201.101/library/nginx
The push refers to a repository [172.20.201.101/library/nginx]
3f117c44afbb: Pushed
c4a8b7411af4: Pushed
fe4c16cbf7a4: Pushed
latest: digest: sha256:9038d5645fa5fcca445d12e1b8979c87f46ca42cfb17beb1e5e093785991a639 size: 948