docker harbor搭建笔记

介绍

Harbor是VMware公司开源的一个用于存储和分发Docker镜像的企业级Registry服务器,以Docker开源的Registry为基础,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全,提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中,确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

Harbor特性

  • 基于角色的访问控制(Role Based Access Control)
  • 基于策略的镜像复制(Policy based image replication)
  • 镜像的漏洞扫描(Vulnerability Scanning)
  • AD/LDAP集成(LDAP/AD support)
  • 镜像的删除和空间清理(Image deletion & garbage collection)
  • 友好的管理UI(Graphical user portal)
  • 审计日志(Audit logging)
  • RESTful API
  • 部署简单(Easy deployment)

Harbor组件

  • 依赖的外部组件:

    1. Nginx(Proxy): Harbor的Registry、UI、Token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
    2. Registry v2: Docker官方镜像仓库, 负责储存Docker镜像,并处理Docker Push/Pull命令。由于我们要对用户进行访问控制,即不同用户对Docker镜像有不同的读写权限,Registry会指向一个Token服务,强制用户的每次Docker Push/Pull请求都要携带一个合法的Token, Registry会通过公钥对Token进行解密验证。
    3. Database(MySQL/Postgresql):为Core Services提供数据库服务,负责储存用户权限、审计日志、Docker镜像分组信息等数据。
  • Harbor自己的组件:

    1. Core Services(Admin Server): 这是Harbor的核心功能,主要提供以下服务:
      • API:提供Harbor RESTful API
      • UI:提供图形化界面,帮助用户管理Registry上的镜像, 并对用户进行授权。
      • Webhook:为了及时获取Registry上镜像状态变化的情况,在Registry上配置Webhook,把状态变化传递给UI模块。
      • Auth服务:负责根据用户权限给每个Docker Push/Pull命令签发Token。Docker客户端向Registry服务发起的请求,如果不包含Token,会被重定向到这里,获得Token后再重新向Registry进行请求。
    2. Replication Job Service:提供多个Harbor实例之间的镜像同步功能。
    3. Log Collector:为了帮助监控Harbor运行,负责收集其他组件的日志,供日后进行分析。

harbor架构图

 

harbor 安装

# 安装方式分为在线安装和离线安装两种方式,这里采用在线安装方式

# 下载在线安装程序
# wget -P /usr/local https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-online-installer-v1.7.1.tgz

# 解压下载文件
# tar zxf /usr/local/harbor-online-installer-v1.7.1.tgz -C /usr/local/

# 修改配置文件,根据自己的需求进行修改
# vim /usr/local/harbor/harbor.cfg
# 本机IP或者域名,不能是127.0.0.1或者localhost
hostname = 192.168.1.130 或者域名xxx.com
# 系统Harbor管理员的密码
harbor_admin_password = Harbor12345
# 禁止用户注册
self_registration = off
# 设置只有管理员可以创建项目
project_creation_restriction = adminonly

# 由于Harbor的Nginx组件默认会监听宿主机的80、443、4443端口,如果需要更改Nginx的端口映射,可以修改以下配置文件
# vim /usr/local/harbor/docker-compose.yml
 ports:
      - 8082:80
      - 443:443
      - 4443:4443

# 如果上面更改了Nginx的80端口映射,此时还需要编辑Harbor的配置文件,修改hostname加上指定的端口号
# vim harbor.cfg
hostname = 192.168.1.130:8082

# 执行安装脚本
# /usr/local/harbor/install.sh

# Harbar的日志目录是:/var/log/harbor
# Harbar相关数据卷的挂载目录默认是宿主机的/data目录,如果重新安装Harbar并在配置文件里更改了数据库密码,则需要删除/data目录,否则Harbor部分组件会启动失败

harbor操作

# 如果某个Harbor组件启动失败,可以在日志目录/var/log/harbor下查看具体的日志信息,进一步定位启动失败的原因
# 启动时Harbor默认会监听宿主机的80、443、4443端口,启动Harbor之前必须确保宿主机的80、443、4443端口不被占用,否则Harbor相关组件会启动失败。

# 查看Harbor容器的运行状态
# docker ps

# 或者通过docker-compose查看,此时需要进入Harbor安装脚本所在的目录里执行相关命令
# cd /usr/local/harbor

# 查看Harbor容器的运行状态
# docker-compose ps
       Name                     Command                  State                                    Ports
-------------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver   /harbor/start.sh                 Up (healthy)
harbor-core          /harbor/start.sh                 Up (healthy)
harbor-db            /entrypoint.sh postgres          Up (healthy)   5432/tcp
harbor-jobservice    /harbor/start.sh                 Up
harbor-log           /bin/sh -c /usr/local/bin/ ...   Up (healthy)   127.0.0.1:1514->10514/tcp
harbor-portal        nginx -g daemon off;             Up (healthy)   80/tcp
nginx                nginx -g daemon off;             Up (healthy)   0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp
redis                docker-entrypoint.sh redis ...   Up             6379/tcp
registry             /entrypoint.sh /etc/regist ...   Up (healthy)   5000/tcp
registryctl          /harbor/start.sh                 Up (healthy)

# 启动Harbor容器
# docker-compose start

# 停止Harbor容器
# docker-compose stop

# 重启Harbor容器
# docker-compose restart

# 停止并删除Harbor容器,加上-v参数可以同时移除挂载在容器上的目录
# docker-compose down

# 创建并启动Harbo容器,参数“-d”表示后台运行命令
# docker-compose up -d

至此,harbor算是安装完成了(http方式),不过这种方式还得去每个机器上配置docker deamon文件,生产中建议使用https方式

安装证书

# 下面以IP:192.168.1.130为例子,实际操作中将命令中的IP地址修改为自己的IP地址即可

# 创建存放证书的临时目录
# mkdir ~/cert
# cd ~/cert

# 创建自签名根证书
# openssl req \
    -newkey rsa:4096 -nodes -sha256 -keyout ca.key \
    -x509 -days 1000 -out ca.crt \
    -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=test_company/OU=IT/CN=test/emailAddress=test@qq.com"

# ls
ca.crt  ca.key

# 产生证书签名请求
# openssl req \
    -newkey rsa:4096 -nodes -sha256 -keyout harbor-registry.key \
    -out harbor-registry.csr \
    -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=test_company/OU=IT/CN=192.168.1.130/emailAddress=test@qq.com"

# ls
ca.crt  ca.key  harbor-registry.csr  harbor-registry.key

# 为Registry主机产生证书
# echo subjectAltName = IP:192.168.1.130 > extfile.cnf  这里ip可根据需要配置为域名,如xx.com  echo subjectAltName = DNS.1:xxx.com > extfile.cnf
# openssl x509 -req -days 1000 -in harbor-registry.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out harbor-registry.crt
# ls
ca.crt  ca.key  ca.srl  extfile.cnf  harbor-registry.crt  harbor-registry.csr  harbor-registry.key

# 创建Harbor的证书目录
# mkdir -p /opt/cert

# 拷贝harbor-registry证书到Harbor的证书目录
# cp harbor-registry.crt /opt/cert/
# cp harbor-registry.key /opt/cert/

 

配置harbor

# 进入Harbor的安装目录
# cd /usr/local/harbor

# 停止并删除Harbor容器,加上-v参数可以同时移除挂载在容器上的目录
# docker-compose down

# 修改harbor.cfg配置文件
# vim /usr/local/harbor/harbor.cfg
ui_url_protocol = https
hostname = 192.168.1.130
ssl_cert = /opt/cert/harbor-registry.crt
ssl_cert_key = /opt/cert/harbor-registry.key

# 重新生成配置文件
# prepare

# 让Docker客户端默认使用Https协议访问Registry,需要去掉“insecure-registries”相关配置项
# 查看daemon.json文件中是否有"insecure-registries":["192.168.1.130"],如果有则将其删除掉
# vim /etc/docker/daemon.json
{"insecure-registries":[""]}

# 重新加载Docker的配置文件
# systemctl daemon-reload

# 重启Docker
# systemctl restart docker

# 创建并启动Harbor容器
# docker-compose up -d

 

使用docker login登录harbor

# 创建Docker的证书目录,目录名称是IP地址,需要根据自己的情况进行修改
# 注意,如果Nginx的443端口映射到了其他端口,则目录名称需要带上具体的端口号,例如/etc/docker/certs.d/192.168.1.130:8443
# mkdir -p /etc/docker/certs.d/192.168.1.130

# 将上面产生的ca.crt拷贝到Docker的证书目录下
# cp ~/cert/ca.crt /etc/docker/certs.d/192.168.1.130

# 重启Docker
# systemctl restart docker

# 登录Harbor Registry,回车后输入admin用户的帐号信息(admin/Harbor12345)
# docker login 192.168.1.130

# 查看镜像列表
# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
centos                        latest              1e1148e4cc2c        7 weeks ago         202MB
....

# 给镜像打上标签
# docker tag centos:latest 192.168.1.130/library/centos:1.0

# 将本地镜像Push到Harbor
# docker push 192.168.1.130/library/centos:1.0


 

 注意这一步:

将上面产生的ca.crt拷贝到Docker的证书目录下

cp ~/cert/ca.crt /etc/docker/certs.d/192.168.1.130

当其他主机需要使用harbor时,也需要将该证书放在相应目录下 

 

参考

https://www.techgrow.cn/posts/99d575a6.html

 

posted @ 2019-09-23 10:41  二十四桥明月夜33  阅读(951)  评论(1编辑  收藏  举报