虚拟化运维--私有仓库--Harbor(八)

一、Harbor简介

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

Harbor特性:
1.基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
2.图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
3.AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
4.RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
5.部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。


Harbor架构图

二、Harbor组件

Harbor在架构上主要由6个组件构成:
Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。
Core services: 这是Harbor的核心功能,主要提供以下服务:
UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
各个组件之间的关系如下图所示:

组件之间的关系

三、安装Harbor

  1. 前置条件
    安装Harbor需要先安装docker 17.06.0+docker-compose
    python3.6 并且安装:
[root@localhost]#  yum install python3
[root@localhost]# update-alternatives --config python 
[root@localhost]# pip3  install Flask

# 查看Docker安装,必须为17.06+
[root@localhost ~]#  docker version

# 运行docker服务
[root@localhost]# systemctl start docker
# 重启Docker
[root@localhost]# systemctl restart docker
# 设置Docker开机自启
[root@localhost]# systemctl enable docker
# 查看Docker系统信息,包括镜像和容器数
[root@localhost]# docker info

  1. 下载安装包
    官网:https://goharbor.io/
    Harbor

    下载Harbor

有两个包Harbor offline installer 和 Harbor online installer,两者的区别的是 Harbor offline installer 里就包含的 Harbor 需要使用的镜像文件。

# 下载
[root@localhost ~]# wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.1.tgz

# 安装
[root@localhost ~]# tar -zxvf harbor-offline-installer-v1.9.1.tgz -C /usr/local/
harbor/harbor.v1.9.1.tar.gz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/harbor.yml

harbor.v1.9.1.tar.gz里就是 Harbor 用到的镜像。

四、编辑配置文件

  1. 配置文件为:/usr/local/harbor/harbor.yml
    配置的内容为:
[root@localhost ~]# vi /usr/local/harbor/harbor.yml

# 修改 hostname 选项
hostname: 192.168.247.130
# 修改端口
port: 8388

编辑配置文件
  1. 配置免https
#  修改  /etc/docker/daemon.json
vi /etc/docker/daemon.json

# 加上 允许的仓库
{
  "insecure-registries":[
    "192.168.247.130:8388"
  ]
}

五、运行

  1. 安装运行
# 更新配置文件
[root@localhost ~]# cd /usr/local/harbor/
[root@localhost harbor]# ./prepare 
prepare base dir is set to /usr/local/harbor
Unable to find image 'goharbor/prepare:v1.9.1' locally
Trying to pull repository docker.io/goharbor/prepare ... 

v1.9.1: Pulling from docker.io/goharbor/prepare
a1fd40743af1: Pull complete 
5fe2fbac9b11: Pull complete 
8d43177d2a4c: Pull complete 
557de2fd72ae: Pull complete 
947583f1d6b6: Pull complete 
77e6da92f0c8: Pull complete 
d90d4c01ca3e: Pull complete 

# 安装并启动
[root@localhost harbor]# ./install.sh
[Step 0]: checking installation environment ...
Note: docker version: 18.03.1
Note: docker-compose version: 1.24.1
[Step 1]: loading Harbor images ...
# 在harbor 目录中执行docker-compose   停止:docker-compose stop
[root@localhost harbor]# docker-compose up -d
harbor-log is up-to-date
registry is up-to-date
harbor-portal is up-to-date
registryctl is up-to-date
harbor-db is up-to-date
redis is up-to-date
harbor-core is up-to-date
nginx is up-to-date
harbor-jobservice is up-to-date

  1. 浏览器中访问测试
    http://192.168.247.130:8388
    默认账号:admin
    默认密码: Harbor12345
    登录

    主页

六、测试上传和下载镜像

  1. 登录
# 重启docker 
[root@localhost harbor]# systemctl daemon-reload
[root@localhost harbor]# systemctl restart docker.service
# 重启harbor
[root@localhost harbor]# docker-compose stop
Stopping nginx             ... done
Stopping harbor-jobservice ... done
Stopping harbor-core       ... done
Stopping harbor-db         ... done
Stopping harbor-portal     ... done
Stopping registryctl       ... done
Stopping redis             ... done
Stopping registry          ... done
Stopping harbor-log        ... done
[root@localhost harbor]# docker-compose up -d
Starting harbor-log ... done
Starting harbor-db     ... done
Starting registry      ... done
Starting harbor-portal ... done
Starting redis         ... done
Starting registryctl   ... done
Starting harbor-core   ... done
Starting harbor-jobservice ... done
Starting nginx             ... done

# 登录
[root@localhost harbor]# docker login 192.168.247.130:8388
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

Error response from daemon: Get https://192.168.247.130:8388/v2/: http: server gave HTTP response to HTTPS client
修改:修改/etc/docker/daemon.json,参见配置免https。
出现这问题的原因是:Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。

  1. 新建项目
    新建一个项目,命名为 xtsz,并设置访问级别为公开。


    新建项目

    新建项目

前置条件: 必须登录

  1. 查看镜像
# 查看镜像
[root@localhost ~]# docker images

# 拉取镜像Docker Hub
[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8d691f585fa8: Already exists 
047cb16c0ff6: Pull complete 
b0bbed1a78ca: Pull complete 
Digest: sha256:77ebc94e0cec30b20f9056bac1066b09fbdc049401b71850922c63fc0cc1762e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

查看格式
  1. 镜像打标签
# docker tag 镜像名:标签 私服地址/仓库项目名/镜像名:标签

# 修改待上传镜像的tag,必须
[root@localhost ~]#  docker tag nginx:latest  192.168.247.130:8388/xtsz/nginx:latest

说明:
192.168.247.130:8388 :私有hub域名
common :项目名称
nginx :镜像名称
latest :镜像版本号


改后镜像
  1. 上传镜像
    推送到私服的命令
# docker push 私服地址/仓库项目名/镜像名:标签
[root@localhost ~]# docker push 192.168.247.130:8388/xtsz/nginx:latest
The push refers to repository [192.168.247.130:8388/xtsz/nginx]
cf2436e84ea8: Pushed 
ed4a4820ee08: Pushed 
b67d19e65ef6: Pushed 
latest: digest: sha256:224f1b76ad5d6d5878c2dccba5b3dcc8e9a263ff04efdf0f8e0ef8f68c208a44 size: 948


查看上传

查看上传
[root@localhost ~]# docker rmi 192.168.247.130:8388/xtsz/nginx 
Untagged: 192.168.247.130:8388/xtsz/nginx:latest
Untagged: 192.168.247.130:8388/xtsz/nginx@sha256:224f1b76ad5d6d5878c2dccba5b3dcc8e9a263ff04efdf0f8e0ef8f68c208a44
[root@localhost ~]# docker images
REPOSITORY                      TAG                             IMAGE ID            CREATED             SIZE
nginx                           latest                          5a9061639d0a        32 hours ago        126MB
httpd                           latest                          66a97eeec7b8        34 hours ago        154MB
goharbor/chartmuseum-photon     v0.9.0-v1.9.1                   0aa7451af9b8        3 weeks ago         131MB
goharbor/harbor-migrator        v1.9.1                          a83f1be1ec94        3 weeks ago         362MB

  1. 下载镜像
    从私服拉取镜像的命令
# docker pull 私服地址/仓库项目名/镜像名:标签
[root@localhost ~]# docker pull 192.168.247.130:8388/xtsz/nginx
Using default tag: latest
latest: Pulling from xtsz/nginx
Digest: sha256:224f1b76ad5d6d5878c2dccba5b3dcc8e9a263ff04efdf0f8e0ef8f68c208a44
Status: Downloaded newer image for 192.168.247.130:8388/xtsz/nginx:latest
192.168.247.130:8388/xtsz/nginx:latest
[root@localhost ~]# docker images
REPOSITORY                        TAG                             IMAGE ID            CREATED             SIZE
192.168.247.130:8388/xtsz/nginx   latest                          5a9061639d0a        32 hours ago        126MB
nginx                             latest                          5a9061639d0a        32 hours ago        126MB
httpd                             latest                          66a97eeec7b8        34 hours ago        154MB

七、常见问题:

  1. PermissionError: [Errno 13] Permission denied: '/config/log'
    导致原因:py脚本在写入数据时打开了文件导致写入终止。
    此错误可以不处理,主要是没有安装Python3.6。

  2. ✖ Need to install docker-compose(1.18.0+) by yourself first and run this script again.
    官网:https://github.com/docker/compose/releases

# 安装docker-compose
[root@localhost harbor]# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@localhost harbor]# chmod +x /usr/local/bin/docker-compose
[root@localhost harbor]# docker-compose --version
docker-compose version 1.24.1, build 4667896b

  1. 镜像加速
# 添加镜像配置
[root@localhost harbor]# vi /etc/docker/daemon.json
# 内容:
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/","https://mirror.ccs.tencentyun.com"]
}

# 重启docker
[root@localhost harbor]# sudo systemctl restart docker

  1. linux切换python版本
[root@localhost]# yum install python3 -y

[root@localhost]#  sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
[root@localhost]#  sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 1
# 显示python版本
[root@localhost]#  update-alternatives --display python 
python - status is auto.
 link currently points to /usr/bin/python2.7
/usr/bin/python2.7 - priority 2
/usr/bin/python3.6 - priority 1
Current `best' version is /usr/bin/python2.7.

# 切换版本
[root@localhost]# update-alternatives --config python 

There are 2 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/bin/python2.7
   2           /usr/bin/python3.6

Enter to keep the current selection[+], or type selection number: 2

  1. File "/usr/bin/yum", line 30
    except KeyboardInterrupt, e:
    ^
    这是因为yum采用python作为命令解释器,原来系统自带的python解释器为python2.7,然后我之前为了方便将python默认的解释器设为了python3.6,导致按python3.6解析2.7的语法出错了。
[root@localhost harbor]# update-alternatives --config python    

There are 2 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*  1           /usr/bin/python2.7
 + 2           /usr/bin/python3.6

Enter to keep the current selection[+], or type selection number: 1

  1. Need to upgrade docker package to 17.06.0+.
#  卸载原来的docker
[root@localhost ~]# yum remove docker*

root@localhost]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost]# sudo yum install docker-ce docker-ce-cli containerd.io
[root@localhost ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.4-rc1
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        4ba2b1c606
 Built:             Mon Oct 14 21:34:38 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Cannot connect to the Docker daemon at tcp://0.0.0.0:2375. Is the docker daemon running?

  1. No package dacker available. Error: Nothing to do
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

  1. WARNING: IPv4 forwarding is disabled. Networking will not work.
    Traceback (most recent call last):
[root@localhost]# vi /usr/lib/sysctl.d/00-system.conf
追加
 net.ipv4.ip_forward=1
[root@localhost]# systemctl restart network

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容