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组件
依赖的外部组件:
- Nginx(Proxy): Harbor的Registry、UI、Token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
- Registry v2: Docker官方镜像仓库, 负责储存Docker镜像,并处理Docker Push/Pull命令。由于我们要对用户进行访问控制,即不同用户对Docker镜像有不同的读写权限,Registry会指向一个Token服务,强制用户的每次Docker Push/Pull请求都要携带一个合法的Token, Registry会通过公钥对Token进行解密验证。
- Database(MySQL/Postgresql):为Core Services提供数据库服务,负责储存用户权限、审计日志、Docker镜像分组信息等数据。
Harbor自己的组件:
- 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进行请求。
- Replication Job Service:提供多个Harbor实例之间的镜像同步功能。
- Log Collector:为了帮助监控Harbor运行,负责收集其他组件的日志,供日后进行分析。
- Core Services(Admin Server): 这是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
docker harbor搭建笔记的更多相关文章
- docker 私有仓库之Harbor搭建与使用
Harbor搭建 下载Harbor: http://harbor.orientsoft.cn/ #下载offline版本 配置Harbor tar xvf harbor-online-installe ...
- docker的私有化仓库harbor搭建
目前比较流行的docker私有化仓库是harbor,harbor是一个github开源的项目,直接在github上搜索即可,下载地址:https://github.com/goharbor/harbo ...
- Docker私服搭建--Harbor
Docker私服搭建--Harbor Harbor概述 Harbor的安全机制 Harbor的镜像同步 Harbor的镜像同步机制 Harbor的多级部署 一.安装 1.1 docker安装 1.2 ...
- 搭建docker镜像仓库(二):使用harbor搭建本地镜像仓库
目录 一.系统环境 二.前言 三.Harbor 四.使用harbor搭建私有镜像仓库 4.1 环境介绍 4.2 k8smaster节点安装配置harbor 4.2.1 安装harbor离线包 4.2. ...
- Docker笔记(十):使用Docker来搭建一套ELK日志分析系统
一段时间没关注ELK(elasticsearch —— 搜索引擎,可用于存储.索引日志, logstash —— 可用于日志传输.转换,kibana —— WebUI,将日志可视化),发现最新版已到7 ...
- python开发笔记-Python3.7+Django2.2 Docker镜像搭建
目标镜像环境介绍: 操作系统:ubuntu16.04 python版本:python 3.7.4 django版本:2.2 操作步骤: 1. 本地安装docker环境(略)2. 拉取ubunut指定 ...
- 企业级镜像仓库harbor搭建
企业级镜像仓库harbor搭建 一. Harbor概述 VMware公司最近开源了企业级Registry项目Harbor,其的目标是帮助用户迅速搭建一个企业级的Docker registry 服 ...
- Kubernetes集群搭建之企业级环境中基于Harbor搭建自己的私有仓库
搭建背景 企业环境中使用Docker环境,一般出于安全考虑,业务使用的镜像一般不会从第三方公共仓库下载.那么就要引出今天的主题 企业级环境中基于Harbor搭建自己的安全认证仓库 介绍 名称:Harb ...
- docker swarm搭建tidb踩坑日记
背景 公司新项目数据量翻了一倍,每天上亿数据量的读写,传统的单库单表已经满足不了目前的需求,得考虑下分布式存储了.那用啥呢,之前有考虑用到mycat,但是一进官网,一股山寨气息扑面而来,技术群进群还收 ...
随机推荐
- 基于开源中文分词工具pkuseg-python,我用张小龙的3万字演讲做了测试
做过搜索的同学都知道,分词的好坏直接决定了搜索的质量,在英文中分词比中文要简单,因为英文是一个个单词通过空格来划分每个词的,而中文都一个个句子,单独一个汉字没有任何意义,必须联系前后文字才能正确表达它 ...
- csdn论坛页抓取
抓取csdn论坛 实现功能 获取论坛分类所有链接,并拼接成推荐精华页的完成的链接 获取推荐精华页的帖子状态,赏分,帖子标题,作者,发布时间,回复量,查看量,最后发表时间 置顶内容不爬取,只打印置顶内容 ...
- .net测试篇之测试神器Autofixture Generator使用与自定义builder
有了上一节自定义配置,很多问题都能解决了,但是如果仅仅是为了解决一个简单问题那么创建一个类显得有点繁重.其实AutoFixture在创建Fixture对象时有很多方便的Fluent配置,我们这里介绍一 ...
- 纯数据结构Java实现(5/11)(Set&Map)
纯数据结构Java实现(5/11)(Set&Map) Set 和 Map 都是抽象或者高级数据结构,至于底层是采用树还是散列则根据需要而定. 可以细想一下 TreeMap/HashMap, T ...
- DNS域名解析服务及其配置
一.背景 到 20 世纪 70 年代末,ARPAnet 是一个拥有几百台主机的很小很友好的网络.仅需要一个名为 HOSTS.TXT 的文件就能容纳所有需要了解的主机信息:它包含了所有连接到 ARPAn ...
- 原生js实现的一个随机颜色的简单效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...
- Oracle数据库之四 简单查询
四.简单查询 简单查询的主要特征就是将一张数据表之中的全部数据行进行显示,而后可以利用 SELECT 子句来控制所需要的输出列. 4.1.基础语法 范例:查询 emp 表中的数据(全部数据查询) ...
- Linux shell脚本判断服务器网络是否可以上网
Linux shell脚本判断网络畅通 介绍 在编写shell脚本时,有的功能需要确保服务器网络是可以上网才可以往下执行,那么此时就需要有个函数来判断服务器网络状态 我们可以通过curl来访问 www ...
- CentOS搭建php + nginx环境
更新Centos的yum源 yum update 安装EPEL源和REMI源 yum install epel-release yum install http://rpms.remirepo.net ...
- POJ-1325 Machine Schedule 二分图匹配 最小点覆盖问题
POJ-1325 题意: 有两台机器A,B,分别有n,m种模式,初始都在0模式,现在有k项任务,每项任务要求A或者B调到对应的模式才能完成.问最少要给机器A,B调多少次模式可以完成任务. 思路: 相当 ...