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私有仓库的主要内容,如果未能解决你的问题,请参考以下文章