相关优质内容来源:

Kubernetes中文社区:Harbor用户机制、镜像同步和与Kubernetes的集成实践

Harbor概述

Docker官方提供了Registry具备此功能,但管理方面较弱,不适合企业级的应用,今天给大家介绍Harbor的使用。

Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。

容器的核心在于镜象的概念,由于可以将应用打包成镜像,并快速的启动和停止,因此容器成为新的炙手可热的基础设施CAAS,并为敏捷和持续交付包括DevOps提供底层的支持。

而Habor和Docker Registry所提供的容器镜像仓库,就是容器镜像的存储和分发服务。之所以会有这样的服务存在,是由于以下三个原因:

  • 提供分层传输机制,优化网络传输

    • Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
  • 提供WEB界面,优化用户体验
    • 只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。
  • 支持水平扩展集群
    • 当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。

Harbor的安全机制

在Harbor中,用户主要分为两类。一类为管理员,另一类为普通用户。两类用户都可以成为项目的成员。而管理员可以对用户进行管理。

成员是对应于项目的概念,分为三类:管理员、开发者、访客。管理员可以对开发者和访客作权限的配置和管理。测试和运维人员可以访客身份读取项目镜像,或者公共镜像库中的文件。

从项目的角度出发,显然项目管理员拥有最大的项目权限,如果要对用户进行禁用或限权等,可以通过修改用户在项目中的成员角色来实现,甚至将用户移除出这个项目。

Harbor的镜像同步

为什么需要镜像同步

由于对镜像的访问是一个核心的容器概念,在实际使用过程中,一个镜像库可能是不够用的,下例情况下,我们可能会需要部署多个镜像仓库:

  • 国外的公有镜像下载过慢,需要一个中转仓库进行加速
  • 容器规模较大,一个镜像仓库不堪重负
  • 对系统稳定性要求高,需要多个仓库保证高可用性
  • 镜像仓库有多级规划,下级仓库依赖上级仓库

更常用的场景是,在企业级软件环境中,会在软件开发的不同阶段存在不同的镜像仓库,

  • 在开发环境库,开发人员频繁修改镜像,一旦代码完成,生成稳定的镜像即需要同步到测试环境。
  • 在测试环境库,测试人员对镜像是只读操作,测试完成后,将镜像同步到预上线环境库。
  • 在预上线环境库,运维人员对镜像也是只读操作,一旦运行正常,即将镜像同步到生产环境库。
  • 在这个流程中,各环境的镜像库之间都需要镜像的同步和复制。

Harbor的镜像同步机制

有了多个镜像仓库,在多个仓库之间进行镜像同步马上就成为了一个普遍的需求。比较传统的镜像同步方式,有两种:

  • 第一种方案,使用Linux提供的RSYNC服务来定义两个仓库之间的镜像数据同步。
  • 第二种方案,对于使用IaaS服务进行镜像存储的场景,利用IaaS的配置工具来对镜像的同步进行配置。

这两种方案都依赖于仓库所在的存储环境,而需要采用不同的工具策略。Harbor则提供了更加灵活的方案来处理镜像的同步,其核心是三个概念:

  • 用Harbor自己的API来进行镜像下载和传输,作到与底层存储环境解耦。
  • 利用任务调度和监控机制进行复制任务的管理,保障复制任务的健壮性。在同步过程中,如果源镜像已删除,Harbor会自动同步删除远端的镜像。在镜像同步复制的过程中,Harbor会监控整个复制过程,遇到网络等错误,会自动重试。
  • 提供复制策略机制保证项目级的复制需求。在Harbor中,可以在项目中创建复制策略,来实现对镜像的同步。与Docker Registry的不同之处在于,Harbor的复制是推(PUSH)的策略,由源端发起,而Docker Registry的复制是拉(PULL)的策略,由目标端发起。

Harbor的多级部署

在实际的企业级生产运维场景,往往需要跨地域,跨层级进行镜像的同步复制,比如集团企业从总部到省公司,由省公司再市公司的场景。

这一部署场景可简化如下图:

更复杂的部署场景如下图:

一、安装

1.1 docker安装

  1. # yum 包更新
  2. [root@centos7 ~]# yum update
  3. # 卸载旧版本 Docker
  4. [root@centos7 ~]# yum remove docker docker-common docker-selinux docker-engine
  5. # 安装软件包
  6. [root@centos7 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
  7. # 添加 Docker yum源
  8. [root@centos7 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  9. # 安装 Docker
  10. [root@centos7 ~]# yum -y install docker-ce
  11. # 启动 Docker
  12. [root@centos7 ~]# systemctl start docker
  13. # 查看 Docker 版本号
  14. [root@centos7 ~]# docker --version

开启docker远程访问:

  1. vim /lib/systemd/system/docker.service
  2. # 找到ExecStart行,修改成下边这样
  3. ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

1.2 docker compose安装

1.2.1 方式一

  1. # 安装 epel-release
  2. [root@centos7 ~]# yum install epel-release
  3. # 安装 python-pip
  4. [root@centos7 ~]# yum install -y python-pip
  5. # 安装 docker-compose
  6. [root@centos7 ~]# pip install docker-compose
  7. # 安装 git
  8. [root@centos7 ~]# yum install -y git
  9. # 查看 docker-compose 版本号
  10. [root@centos7 ~] docker-compose -version
  11. # docker compose卸载
  12. sudo rm /usr/local/bin/docker-compose

1.2.2 方式二

  1. yum install epel-release
  2. yum install -y python-pip
  3. pip install docker-compose
  4. yum install git

1.3 harbor安装

GitHub地址:https://github.com/goharbor/harbor/releases

  1. wget https://github.com/goharbor/harbor/releases/download/v1.9.3/harbor-offline-installer-v1.9.3.tgz

下载后解压:

tar -xvf harbor-offline-installer-v1.9.0.tgz

修改harbor.yml:

  1. hostname: example.xxxx.cn # 写你自己的网址或IP,公网访问要写公网IP
  2. https:
  3. # https port for harbor, default is 443
  4. port: 443
  5. # The path of cert and key files for nginx
  6. certificate: /root/harbor/Nginx/1.crt
  7. private_key: /root/harbor/Nginx/2.key
  8. harbor_admin_password: Harbor12345 # 管理员密码建议修改
  9. database:
  10. password: root123 # 数据库密码也建议修改

执行安装:

sh ./install.sh

1.4 常用命令

  1. # 停止harbor
  2. $ sudo docker-compose stop
  3. # 启动harbor
  4. $ sudo docker-compose start
  5. # 重新配置harbor
  6. $ sudo docker-compose down -v
  7. $ vim harbor.yml
  8. $ sudo prepare
  9. $ sudo docker-compose up -d
  10. # 删除Harbor的容器,同时将镜像数据和Harbor的数据库文件保留在文件系统中:
  11. $ sudo docker-compose down -v
  12. # 删除Harbor的数据库和镜像数据以进行重新安装:
  13. $ rm -r /data/database
  14. $ rm -r /data/registry
  15. # 如果要一起安装Notary,Clair和图表存储库服务,则应在prepare命令中包括所有组件:
  16. $ sudo docker-compose down -v
  17. $ vim harbor.yml
  18. $ sudo prepare --with-notary --with-clair --with-chartmuseum
  19. $ sudo docker-compose up -d

二、Harbor使用

2.1 项目

以项目的维度划分镜像,可以理解为镜像组,相同镜像的不同版本可以放在一个项目里,同样项目里有完成的仓库、成员、标签、日志的管理。

2.2 系统管理

  • 用户管理 用于操作用户的增删、密码重置
  • 仓库管理 拉取其他服务器镜像到本地
  • 同步管理 可定时去拉取最新镜像

三、镜像推送和拉取

镜像推送和拉取

  1. #从私服拉取镜像 docker pull 私服地址/仓库项目名/镜像名:标签

镜像推送

  1. #推送
  2. docker login 服务器地址:port
  3. #镜像打标签 ,要重新打标签,标签默认是官网地址
  4. docker tag 镜像名:标签 私服地址/仓库项目名/镜像名:标签
  5. #推送指令
  6. docker push 私服地址/仓库项目名/镜像名:标签

四、坑点

4.1 上传项目时修改http请求为https

在我们上传项目的时候可能会出现一些问题:

  1. docker login 10.0.86.193
  2. Username: admin
  3. Password:
  4. Error response from daemon: Get https://10.0.86.193/v1/users/: dial tcp 10.0.86.193:443: getsockopt: connection refused

在我们进行登录上传代码的时候,会报出这样的错误

这是因为docker1.3.2版本开始默认docker registry使用的是https,我们设置Harbor默认http方式,所以当执行用docker login、pull、push等命令操作非https的docker regsitry的时就会报错。

解决办法

如果是在Harbor本机登录可以这样做如下解决

在/etc/docker/daemon.json 加上如下内容(注意是json字符串)

  1. {
  2. "insecure-registries": [
  3. "10.0.86.193"
  4. ]
  5. }

打开docker-compose.yml添加如下内容,注意前边的空格

然后我们执行docker-compose stop

./install.sh

如果是远程登录的话,也会出现这个错误

查找Docker的服务文件:登录到已经安装Docker的服务器,输入 systemctl status docker查看Docker的service文件

编辑docker.service文件:在ExecStart处添加 –insecure-registry 参数。

远程也可直接通过以下方式解决:

  1. vim /etc/docker/daemon.json
  2. # 增加一个daemon.json文件
  3. { "insecure-registries":["192.168.1.100:port"] }
  4. # 此处port指的是harbor服务的port,不知为何,看到很多人设置的是5000端口,我测试后并不好使,然后改为harbor服务端口,原本是80,我本地调试改为81,即可远程登录私服。
  5. # harbor配置文件,harbor.yml,查看其中的http,port。

重启docker服务

  1. systemctl daemon-reload
  2. systemctl restart docker

Docker私服搭建--Harbor的更多相关文章

  1. docker私服搭建nexus3

    docker私服搭建有官方的registry镜像,也有改版后的NexusOss3.x,因为maven的原因搭建了nexus,所以一并将docker私服也搭建到nexus上. nexus的安装过程就单独 ...

  2. Docker私服仓库Harbor安装

    Harbor安装那里还是很简单,就是在Docker Login那里掉坑里去了,搞半天,写博客的时候,又重新安装了一遍 1.准备两台服务器 centos7 harbor 10.19.46.15 clie ...

  3. Docker 私服

    目录 什么是 Docker 私服? Docker 私服搭建 上传镜像至私服 从私服拉取镜像 什么是 Docker 私服? Docker 官方的 Docker Hub 是一个用于管理公共镜像的仓库,我们 ...

  4. 搭建Harbor企业级docker仓库

    搭建Harbor企业级docker仓库 一.Harbor简介 1.Harbor介绍 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如 ...

  5. docker私库harbor的搭建

    1.文件下载 # wget https://storage.googleapis.com/harbor-releases/harbor-online-installer-v1.5.1.tgz 安装官网 ...

  6. Docker镜像仓库Harbor之搭建及配置

    目录 Harbor介绍环境.软件准备Harbor服务搭建Harbor跨数据复制配置FAQ1.Harbor 介绍 Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的 ...

  7. docker搭建harbor私有镜像库

    创建harbor私有镜像库 一.部署准备: harbor软件包   在部署节点上: 1)解压harbor的软件包将harbor目录下所有文件发送到/opt/目录下   tar zxvf harbor- ...

  8. 使用nexus搭建一个docker私服

    使用nexus搭建docker私服 一.需求: 二.实现步骤 1.编写`docker-compose`文件,实现`nexus`的部署 2.修改/usr/lib/systemd/system/docke ...

  9. 使用registry搭建docker私服仓库

    使用registry搭建docker私服仓库 一.拉取 registry镜像 二.根据镜像启动一个容器 1.创建一个数据卷 2.启动容器 三.随机访问一个私服的接口,看是否可以返回数据 四.推送一个镜 ...

随机推荐

  1. Arduino IDE 开发ESP-01/ESP8266-01读取DHT11温度湿度传感器

    引脚接线: DHT11---ESP8266-01 Singnal--IO2, GND----GND, VCC----VCC DHT11引脚说明: ESP8266-01/ESP8266-01S引脚说明: ...

  2. redo log 有什么作用?

    mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用.然后使用后台线程去做缓冲池和磁盘之间的同步. 那么问题来了,如果还没来的 ...

  3. Markdown高级使用之流程图

    流程图在Markdown中的的表现形式就是代码块,代码块语言标记为mermaid.主要内容大体分为:方向.节点.节点间的连接关系,下面就围绕这三个点来整理. mermaid支持流程图.甘特图和时序图, ...

  4. 微信小程序--仿微信小程序朋友圈Pro(内容发布、点赞、评论、回复评论)

    微信小程序--仿微信小程序朋友圈Pro(内容发布.点赞.评论.回复评论) 项目开源地址M朋友圈Pro 求个Star 项目背景 ​ 基于原来的开源项目 微信小程序仿朋友圈功能开发(发布.点赞.评论等功能 ...

  5. Hive数据导入Hbase

    方案一:Hive关联HBase表方式 适用场景:数据量不大4T以下(走hbase的api导入数据) 一.hbase表不存在的情况 创建hive表hive_hbase_table映射hbase表hbas ...

  6. jupyter安装插件Nbextensions,实现代码提示功能(终极方法)

    jupyter安装插件,实现代码提示功能 第一步 pip install jupyter_contrib_nbextensions -i https://mirrors.tuna.tsinghua.e ...

  7. TypeLoadException: 未能从程序集“ECS.GUI.Define, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“ECS.GUI.Define.ArmgAimPos”,因为它在 4 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠

    TypeLoadException: 未能从程序集"ECS.GUI.Define, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null ...

  8. WPF TreeView Indent 减少节点的缩进

    www.swack.cn - 原文链接:WPF TreeView Indent 减少节点的缩进 问题 最近一个需求,需要在界面中实现Windows资源管理器TreeView的界面.但是我发现,我做出的 ...

  9. js如何替换字符串中匹配到多处中某一指定节点?

    抛出一个问题,如图,搜索关键字,匹配到四处,那我鼠标放在第二处,我想把它变个颜色,该怎么实现呢?回到文章的标题,js如何替换字符串中匹配到多处中某一指定节点? 字符串的替换,我们首先想到的一个属性是r ...

  10. 【MyBatis】MyBatis 多表操作

    MyBatis 多表操作 文章源码 一对一查询 需求:查询所有账户信息,关联查询下单用户信息. 注意:因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询.如果从用户 ...