docker harbor私有仓库

Posted 遙遙背影暖暖流星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker harbor私有仓库相关的知识,希望对你有一定的参考价值。

harbor的使用

前言

前面的时候我们简单的了解的过registry的安装和使用

docker pull registry:latest
docker run -itd --name myregistry -p 5000:5000 registry:latest
docker tag nginx:latest 127.0.0.1:5000/nginx:v1
docker push 127.0.0.1:5000/nginx:v1
dokcker pull 127.0.0.1:5000/nginx:v1

但假如 我们想对上传镜像和 下载进行的操作进行权限管理,规定的用户才能在下载和修改指定的库中的内容,怎么才能实现这个功能?这个时候我们就可以用到harbor

一、harbor的简介

Harbor被部署为多个Docker容器,因此可以部署在任何支持Docker的Linux发行版本上

服务端主机需要安装的环境有Python、Docker、和Docker-compose

在k8s中,harbor也会用

harbor是用项目来管理镜像的,这样便于管理

二、部署Harbor服务

实验环境:
harbor服务端:192.168.100.21,docker、compose,harbor
client端:192.168.100.22,docker

第一台主机做私有仓库,第二台主机做客户端去进行访问验证
所需参数
这些参数必须在安装前进行设置,如果管理者想要更新他们,必须在改完参数之后再次安装,参数才会生效
工作原理

上面我们说了docker registry v2将安全认证暴露给了外部服务使用,那么是怎样暴露的呢?我们在命令行中输入docker login https://registry.qikqiak.com为例来为大家说明下认证流程:
. 1.docker client接收到用户输入的docker login 命令,将命令转化为调用engine api的RegistryLogin 方法
·2.在 RegistryLogin方法中通过http盗用registry服务中的auth方法
·3.因为我们这里使用的是v2版本的服务,所以会调用loginV2方法,在 loginV2方法中会进行/v2/接口调用,该接口会对请求进行认证
4.此时的请求中并没有包含token 信息,认证会失败,返回401错误,同时会在 header中返回去哪里请求认证的服务器地址
.5.registry client端收到上面的返回结果后,便会去返回的认证服务器那里进行认证请求,向认证服务器发送的请求的 header中包含有加密的用户名和密码
·6.认证服务器从header中获取到加密的用户名和密码,这个时候就可以结合实际的认证系统进行认证了,比如从数据库中查询用户认证信息或者对接ldap服务进行认证校验
·7.认证成功后,会返回一个token 信息,client端会拿着返回的 token再次向registry服务发送请求,这次需要带上得到的token,请求验证成功,返回状态码就是200. 8.docker client端接收到返回的200状态码,说明操作成功,在控制台上打印 Login Succeeded 的信息
至此,整个登录过程完成,整个过程可以用下面的流程图来说明:

1、下载软件包

[root@docker ~]# hostnamectl set-hostname harbor
[root@docker~]# su
[root@harbor ~]# yum install wget -y;wget http:// harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
[root@harbor ~]# tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/

2、配置文件的参数解读

所需参数
这些参数必须在安装前进行设置,如果管理者想要更新他们,必须在改完参数之后再次安装,参数才会生效

可选参数
这些参数对于更新时可选的,即管理者可以将其保留为默认值,在启动后可以在web端上进行修改更新

如果进入harbor.cfg,只会在第一次启动Harbor时生效,随后对这些参数的更新,Harbor将被忽略

备注:

如果选择通过WEB设置这些参数,必须得在启动Habor后只有admin这个管理员用户的情况下操作;当harbor中有除了admin之外的用户时,auth_mode不能被修改;所以,设置参数要趁早

[root@harbor ~]# cd /usr/local/harbor/
[root@harbor harbor]# ls
common  docker-compose.clair.yml  docker-compose.notary.yml  docker-compose.yml  harbor_1_1_0_template  harbor.cfg  harbor.v1.2.2.tar.gz  install.sh  LICENSE  NOTICE  prepare  upgrade
[root@harbor harbor]# vim /usr/local/harbor/harbor.cfg
修改第五行的hostname为本地ip,不要使用localhost或127.0.0.1,因为Harbor需要由外部客户机访问
hostname = 192.168.100.21

## 配置文件Harbor

#访问管理用户界面和注册表服务的IP地址或主机名。
#不要使用localhost或127.0.0.1,因为Harbor需要由外部客户机访问。
hostname = reg.mydomain.com

#用于访问UI和令牌/通知服务的协议,默认情况下是http。
#如果在nginx上启用了ssl,则可以将其设置为https。
ui_url_protocol = http

#mysql db的db_auth的根用户的密码,在任何生产使用之前更改,mysql db内存放的是用户验证信息,当用户登录时的账号密码会与mysql的内容进行比对,如果正确,就会给用户一个30分钟的临时令牌token
db_password = root123

#镜像复制作业线程最大数量。
max_job_workers = 3 

#确定是否为注册中心的令牌生成证书。
#如果该值为on,那么prepare脚本将创建新的根证书和私钥,以生成访问注册中心的令牌。如果该值为off,则使用默认的密钥/证书,也可以指定外部来源的根证书/密钥
#此标志还控制公证员证书的创建。
customize_crt = on

#nginx的cert和密钥文件的路径,它们只应用于协议设置为https
ssl_cert = /data/cert/server.crt
#证书的路径,仅当协议设置为 https 时才应用。
ssl_cert_key = /data/cert/server.key
#密钥的路径,仅当协议设置为 https 时才应用。

#密钥存储的路径,用于在复制策略中加密或解密远程 register 密码的密钥路径。
secretkey_path = /data

#Admiral's url, 注释此属性, or 将其值设置为NA when Harbor is 独立
admiral_url = NA

#Clair的postgres数据库的密码,只有在使用Clair部署Harbor时才有效。
#请在部署之前更新它,后续更新将导致Clair的API服务器和Harbor无法访问Clair的数据库。
clair_db_password = password

#注意:开始初始属性和结束初始属性之间的属性只在第一次引导时生效,这些属性的后续更改应该在web ui上执行

#开始初始属性,即可选参数,此处为分界线,上面是所需参数

#电子邮件帐户设置发送密码重置电子邮件。

#电子邮件服务器使用给定的用户名和密码在到主机的TLS连接上进行身份验证并充当身份。
#身份留空作为用户名。
email_identity = 
#Harbor需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才需要。
#请注意,在默认情况下SSL连接时没有启用。如果SMTP服务器需要SSL,但不支持STARTTLS
#那么应该通过设置启用SSL email_ssl = TRUE。
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启动时才有效。
#在第一次启动之后就没有效果了
#启动后从用户界面更改管理员密码。默认的用户名/密码是 admin/Harbor12345。
harbor_admin_password = Harbor12345

##默认情况下,验证模式是db_auth,即凭据存储在本地数据库中。
#如果希望根据LDAP服务器验证用户的凭据,请将其设置为ldap_auth。
auth_mode = db_auth

#ldap端点的url。
ldap_url = ldaps://ldap.mydomain.com

# 具有搜索LDAP/AD服务器权限的用户的DN。
#如果您的LDAP/AD服务器不支持匿名搜索,那么您应该配置这个DN和ldap_search_pwd。
#ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com

#ldap_searchdn的密码
#ldap_search_pwd = password

#用来在LDAP/AD中查找用户的基本DN
ldap_basedn = ou=people,dc=mydomain,dc=com

#搜索LDAP/AD筛选器,确保筛选器的语法正确。
#ldap_filter = (objectClass=person)

#  在搜索中用于匹配用户的属性可以是uid、cn、电子邮件、sAMAccountName或其他属性(取决于您的LDAP/AD)
ldap_uid = uid 

#搜索用户的范围,1-LDAP_SCOPE_BASE, 2-LDAP_SCOPE_ONELEVEL, 3-LDAP_SCOPE_SUBTREE
ldap_scope = 3 

#连接LDAP服务器时的超时(以秒为单位)。默认值(也是最合理的)是5秒。
ldap_timeout = 5

#打开或关闭自注册功能;禁用时,新用户只能由 Admin 用户创建
#只有管理员用户可以在 Harbour中创建新用户。
#注意:当 auth_mode 设置为 ldap_auth 时,自注册功能将始终处于禁用状态,并且该标志被忽略。
self_registration = on

#令牌服务创建的令牌过期时间(分钟),默认为30分钟
token_expiration = 30

#用于控制哪些用户具有创建项目的权限的标志
#默认值“everyone”允许每个人创建一个项目。
#设置为“adminonly”,只有管理员用户可以创建项目。
project_creation_restriction = everyone

#确定作业服务在连接到远程注册中心时是否应验证ssl证书。
#当远程注册中心使用自签名或不受信任的证书时,将此标志设置为off,将绕过 SSL/TLS 验证,这在远程实例具有自签名或不可信证书时经常使用。
verify_remote_cert = on
#************************结束初始属性************************
#############

另外,默认情况下,Harbour 将镜像存储在本地文件系统上。在生产环境中,可以考虑 使用其他存储后端而不是本地文件系统,

如 S3、Openstack Swif、Ceph 等。但需要更新 common/templates/registry/config.yml 文件。

docker-compose.yml其中写了多个容器的编排,有的容器还会挂载物理卷以提供存储备份
这个文件里面写了多个容器的编排,比如

其中有仓库镜像,挂载了物理卷

log日志容器,

还会装一个mysql数据库,镜像信息都会放在里面

jobservice 服务端

proxy 代理端

这些容器之间都会共享一个网络命名空间

查看install.sh
使用install.sh去调用docker-compose-yml文件。yml文件去出发多个容器的编排执行,创建多个容器

3、安装harbor

[root@harbor harbor]# cd /usr/local/harbor
[root@harbor harbor]# sh /usr/local/harbor/install.sh
.....
Creating nginx              ... done
Creating harbor-jobservice  ... done

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://192.168.100.21.
For more details, please visit https://github.com/vmware/harbor .

[root@harbor common]# ps aux|grep nginx
root      46553  0.0  0.0  32372  3224 ?        Ss   23:27   0:00 nginx: master process nginx -g daemon off;
nfsnobo+  46655  0.0  0.0  32748  1776 ?        S    23:27   0:00 nginx: worker process
nfsnobo+  46656  0.0  0.0  32748  1776 ?        S    23:27   0:00 nginx: worker process
nfsnobo+  46657  0.0  0.0  32748  1776 ?        S    23:27   0:00 nginx: worker process
nfsnobo+  46658  0.0  0.0  32748  1520 ?        S    23:27   0:00 nginx: worker process
root      47033  0.0  0.0 112824   98
4 pts/0    S+   23:27   0:00 grep --color=auto nginx

备注:还要记得要有docker-compose环境

查看容器与镜像

[root@harbor ~]# docker ps -a
CONTAINER ID   IMAGE                              COMMAND                  CREATED             STATUS                           PORTS                                                                                                                 NAMES
450db62916ff   vmware/harbor-jobservice:v1.2.2    "/harbor/harbor_jobs…"   About an hour ago   Up About an hour                                                                                                                                       harbor-jobservice
8245baf10c89   vmware/nginx-photon:1.11.13        "nginx -g 'daemon of…"   About an hour ago   Up About an hour                 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:4443->4443/tcp, :::4443->4443/tcp   nginx
ad9000705968   vmware/harbor-ui:v1.2.2            "/harbor/harbor_ui"      About an hour ago   Up About an hour                                                                                                                                       harbor-ui
e04f67ed937d   vmware/harbor-db:v1.2.2            "docker-entrypoint.s…"   About an hour ago   Up About an hour                 3306/tcp                                                                                                              harbor-db
a25564c2b140   vmware/registry:2.6.2-photon       "/entrypoint.sh serv…"   About an hour ago   Up About an hour                 5000/tcp                                                                                                              registry
5a3251439564   vmware/harbor-adminserver:v1.2.2   "/harbor/harbor_admi…"   About an hour ago   Up About an hour                                                                                                                                       harbor-adminserver
735fd7c98469   vmware/harbor-log:v1.2.2           "/bin/sh -c 'crond &…"   About an hour ago   Up About an hour                 127.0.0.1:1514->514/tcp                                                                                               harbor-log
3fa91c2d3f5f   compose_nginx_nginx                "/usr/local/nginx/sb…"   5 days ago          Exited (255) About an hour ago   0.0.0.0:1216->80/tcp, :::1216->80/tcp, 0.0.0.0:1217->443/tcp, :::1217->443/tcp                                        compose_nginx_nginx_1
[root@harbor ~]# docker images
REPOSITORY                   TAG               IMAGE ID       CREATED         SIZE
compose_nginx_nginx          latest            19d68c8db762   5 days ago      308MB
<none>                       <none>            3214fff1b536   5 days ago      204MB
centos                       stress            cc9f380c2556   5 days ago      520MB
192.168.100.21:5000/nginx    latest            8ac85260ea00   5 days ago      205MB
nginx                        v1                8ac85260ea00   5 days ago      205MB
nginx                        latest            822b7ec2aaf2   11 days ago     133MB
registry                     latest            b2cb11db9d3d   13 days ago     26.2MB
nginx                        1.21              8345d48257de   13 days ago     132MB
redis                        6.2-alpine3.14    f6f2296798e9   2 weeks ago     32.3MB
busybox                      latest            42b97d3c2ae9   3 weeks ago     1.24MB
nginx                        lnmp              dd34e67e3371   4 weeks ago     133MB
127.0.0.1/lvlq/cirros        vers1             f9cae1daf5f6   6 months ago    12.6MB
192.168.100.21/lvlq/cirros   vers1             f9cae1daf5f6   6 months ago    12.6MB
cirros                       latest            f9cae1daf5f6   6 months ago    12.6MB
hello-world                  latest            d1165f221234   6 months ago    13.3kB
centos                       7                 8652b9f0cb4c   10 months ago   204MB
vmware/harbor-log            v1.2.2            36ef78ae27df   3 years ago     200MB
vmware/harbor-jobservice     v1.2.2            e2af366cba44   3 years ago     164MB
vmware/harbor-ui             v1.2.2            39efb472c253   3 years ago     178MB
vmware/harbor-adminserver    v1.2.2            c75963ec543f   3 years ago     142MB
vmware/harbor-db             v1.2.2            ee7b9fa37c5d   3 years ago     329MB
vmware/nginx-photon          1.11.13           6cc5c831fc7f   3 years ago     144MB
vmware/registry              2.6.2-photon      5d9100e4350e   4 years ago     173MB
vmware/postgresql            9.6.4-photon      c562762cbd12   4 years ago     225MB
vmware/clair                 v2.0.1-photon     f04966b4af6c   4 years ago     297MB
vmware/harbor-notary-db      mariadb-10.1.10   64ed814665c6   4 years ago     324MB
vmware/notary-photon         signer-0.5.0      b1eda7d10640   4 years ago     156MB
vmware/notary-photon         server-0.5.0      6e2646682e3c   4 years ago     157MB
photon                       1.0               e6e4e4a2ba1b   5 years ago     128MB

4、登陆harbor

登陆web端http://192.168.100.21/harbor/sign-in


增加一个私人项目

查看harbor相关容器

[root@harbor ~]# cd /usr/local/harbor/
[root@harbor harbor]# ls
common                     docker-compose.yml     harbor.v1.2.2.tar.gz  NOTICE
docker-compose.clair.yml   harbor_1_1_0_template  install.sh            prepare
docker-compose.notary.yml  harbor.cfg             LICENSE               upgrade
[root@harbor harbor]#  docker-compose ps
       Name                     Command               State                  Ports
--------------------------------------------------------------------------------------------------
harbor-adminserver   /harbor/harbor_adminserver       Up
harbor-db            docker-entrypoint.sh mysqld      Up      3306/tcp
harbor-jobservice    /harbor/harbor_jobservice        Up
harbor-log           /bin/sh -c crond && rm -f  ...   Up      127.0.0.1:1514->514/tcp
harbor-ui            /harbor/harbor_ui                Up
nginx                nginx -g daemon off;             Up      0.0.0.0:443->443/tcp,:::443->443/tcp
                                                              , 0.0.0.0:4443->4443/tcp,:::4443->44
                                                              43/tcp,
                                                              0.0.0.0:80->80/tcp,:::80->80/tcp
registry             /entrypoint.sh serve /etc/ ...   Up      5000/tcp

备注:这条命令只能在/usr/local/harbor/下操作

4、本地终端使用docker 上传和下载镜像

在本地通过 127.0.0.1 来登录和推送镜像。默认情况下, Register 服务器在端口 80 上侦听。

指定192.168.100.21也可以

先登录本地

[root@harbor harbor]# docker login -u admin -p Harbor12345 http://127.0.0.1
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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

下载一个小镜像进行后续验证操作,此时没有指定仓库名,默认从公网仓库拉取镜像

[root@harbor ~]# docker pull nginx:latext
[root@harbor ~]# docker tag nginx:latest 127.0.0.1/library/nginx:v1  #打上对应公开库的地址
[root@harbor ~]# docker push 127.0.0.1/library/nginx:v1   #上传到本地library公开库

[root@harbor ~]# docker tag nginx:latest 127.0.0.1/lvlq/nginx:v2   #打上对应私有库的地址
[root@harbor ~]# docker push 127.0.0.1/lvlq/nginx:v2     #上传到私有库


删除镜像,重新下载

[root@harbor ~]# docker rmi 127.0.0.1/library/nginx:v1

[root@harbor ~]# docker rmi 127.0.0.1/lvlq/nginx:v2

[root@harbor ~]# docker pull 127.0.0.1/library/nginx:v1
127.0.0.1/library/nginx:v1
[root@harbor ~]# docker pull 127.0.0.1/lvlq/nginx:v2
127.0.0.1/lvlq/nginx:v2
[root@harbor ~]# docker images    #下载完成
REPOSITORY                   TAG               IMAGE ID       CREATED         SIZE

127.0.0.1/library/nginx      v1                822b7ec2aaf2   13 days ago     133MB
127.0.0.1/lvlq/nginx         v2                822b7ec2aaf2   13 days ago     133MB

5、在client端进行下载

[root@client ~]# docker login http://192.168.100.21
Username: admin
Password:
INFO[0018] Error logging in to endpoint, trying next endpoint  error="Get \\"https://192.168.100.21/v2/\\": dial tcp 192.168.100.21:443: connect: connection refused"
Get "https://192.168.100.21/v2/": dial tcp 192.168.100.21:443: connect: connection refused

也出现相同报错

出现这问题的原因 Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜

像默认使用的是 HTTP 服务

问题解决思路如下:

[root@client ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.100.21 --containerd=/run/containerd/containerd.sock
[root@client ~]# systemctl daemon-reload 
[root@client ~]#  systemctl restart docker
[root@client ~]# docker login http://192.168.100.21
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

以上是关于docker harbor私有仓库的主要内容,如果未能解决你的问题,请参考以下文章

Docker------搭建本地私有仓库及Horbor私有仓库

Docker--Harbor私有仓库

docker——harbor私有仓库部署与管理

docker——harbor私有仓库部署与管理

使用Harbor搭建企业级私有docker仓库

搭建本地Docker私有仓库 与 Harbor私有仓库的部署与管理