Docker仓库之分布式仓库 Harbor

一、介绍

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

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

#harbor是由很多容器组成实现完整功能
    Proxy:对应启动组件nginx。它是一个nginx反向代理,代理Notary client(镜像认证)、Docker client(镜像上传下载等)和浏览器的访问请求(Core Service)给后端的各服务
    UI(Core Service):对应启动组件harbor-ui。底层数据存储使用mysql数据库,主要提供了四个子功能:
        UI:一个web管理页面ui
        API:Harbor暴露的API服务
        Auth:用户认证服务,decode后的token中的用户信息在这里进行认证;auth后端可以接db、ldap、uaa三种认证实现
        Token服务(上图中未体现):负责根据用户在每个project中的role来为每一个docker push/pull命令issuing一个token,如果从docker client发送给registry的请求没有带token,registry会重定向请求到token服务创建token
    Registry:对应启动组件registry。负责存储镜像文件,和处理镜像的pull/push命令。Harbor对镜像进行强制的访问控制,Registry会将客户端的每个pull、push请求转发到token服务来获取有效的token
    Admin Service:对应启动组件harbor-adminserver。是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候需要加载adminserver的配置
    Job Sevice:对应启动组件harbor-jobservice。负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log
    Log Collector:对应启动组件harbor-log。日志汇总组件,通过docker的log-driver把日志汇总到一起
    DB:对应启动组件harbor-db,负责存储project、 user、 role、replication、image_scan、access等的metadata数据

 

 

 

 

 

二、Harbor之http:

1.安装指定版本:docker  docker-compose
yum list docker-ce --showduplicates
yum install docker-ce-19.03.15-3.el7  docker-ce-cli-19.03.15-3.el7
yum install docker-compose
systemctl enable docker  systemctl start docker

2.下载离线完整安装包
wget   https://github.com/vmware/harbor/releases/download/v1.7.5/harbor-offlineinstaller-v1.7.5.tgz -O /usr/local


3.安装和升级pyhton-pip和通过pip安装,版本较新docker_compose,推荐使用。方法二、直接安装:yum install docker_compose
[root@localhost7F harbor]# yum install python3-pip
[root@localhost7F harbor]# pip3 install --upgrade pip
[root@localhost7F harbor]# pip3 install docker-compose


4.配置文件设置
[root@localhost7F harbor]# cd /usr/local/
[root@localhost7F harbor]# tar  xvf harbor-offlineinstaller-v1.7.5.tgz 
[root@localhost7F harbor]# cd /usr/local/harbor

[root@localhost7F harbor]# vim harbor.cfg 
hostname = 192.168.80.150 
harbor_admin_password = Harbor123456



5.使用脚本下载各镜像,并启动
[root@localhost7F harbor]# ./install.sh 
[root@localhost7F harbor]# docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
goharbor/chartmuseum-photon     v0.8.1-v1.7.5       ca910ae935e8        3 years ago         113MB
goharbor/harbor-migrator        v1.7.5              326685e45678        3 years ago         679MB
goharbor/redis-photon           v1.7.5              6886d1b5b009        3 years ago         101MB
goharbor/clair-photon           v2.0.8-v1.7.5       970bdadc8995        3 years ago         164MB
goharbor/notary-server-photon   v0.6.1-v1.7.5       667b2f0fb68d        3 years ago         135MB
goharbor/notary-signer-photon   v0.6.1-v1.7.5       9ea20ae211bc        3 years ago         132MB
goharbor/harbor-registryctl     v1.7.5              b5781fe85ba3        3 years ago         102MB
goharbor/registry-photon        v2.6.2-v1.7.5       789d7a921303        3 years ago         86.7MB
goharbor/nginx-photon           v1.7.5              172196970055        3 years ago         35.9MB
goharbor/harbor-log             v1.7.5              26784a32e151        3 years ago         81.4MB
goharbor/harbor-jobservice      v1.7.5              0755114a9c68        3 years ago         84.1MB
goharbor/harbor-core            v1.7.5              86925c0ee5d5        3 years ago         95.6MB
goharbor/harbor-portal          v1.7.5              9a9082e62030        3 years ago         40.6MB
goharbor/harbor-adminserver     v1.7.5              b2afe190593f        3 years ago         72.3MB
goharbor/harbor-db              v1.7.5              c1226370ffaa        3 years ago         138MB
 

3--5步骤配置的另一种启动方法:
[root@localhost7F harbor]# yum install python3-pip
[root@localhost7F harbor]# pip3 install --upgrade pip
[root@localhost7F harbor]# pip3 install docker-compose
[root@localhost7F harbor]# ./prepare  #更新配置文件,生成docker-compose.yml文件
[root@localhost7F harbor]# docker-compose up  -d  启动docker-compose.yml文件,会从管网下载镜像,比较慢。



6.web客户端测试登录harbor: 创建项目

#登录失败
[root@localhost7B ~]# docker login 192.168.80.150
Username: admin
Password: 
Error response from daemon: Get https://192.168.80.150/v2/: dial tcp 192.168.80.150:443: connect: connection refused


#客户端启动文件中设置
[root@localhost7B haproxy]# vim  /lib/systemd/system/docker.service 
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock  --insecure-registry 192.168.80.150
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
[root@localhost7B ~]# systemctl daemon-reload 
[root@localhost7B ~]# systemctl restart docker

#登录成功
[root@localhost7B ~]# docker login 192.168.80.150
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

#测试push镜像到harbor:
[root@localhost7B ~]# docker pull centos:7 
[root@localhost7B ~]# docker tag centos:7  192.168.80.150/system/centos:7
[root@localhost7B ~]# 
[root@localhost7B ~]# docker images |grep 192.168.80.150
192.168.80.150/system/centos   7                   eeb6ee3f44bd        13 months ago       204MB
[root@localhost7B ~]# 
[root@localhost7B ~]# docker push 192.168.80.150/system/centos:7
The push refers to repository [192.168.80.150/system/centos]
174f56854903: Pushed 
7: digest: sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f size: 529



#另一客户端测试下载
[root@localhost7C certs.d]# cat /etc/docker/daemon.json
{
"insecure-registries":["192.168.80.150"]
}
[root@localhost7C certs.d]# systemctl daemon-reload
[root@localhost7C certs.d]# systemctl restart docker


[root@localhost7C certs.d]# docker login 192.168.80.150
Username: admin
Password:
Login Succeeded

[root@localhost7C certs.d]# docker pull 192.168.80.150/system/centos:7
Trying to pull repository 192.168.80.150/system/centos ...
7: Pulling from 192.168.80.150/system/centos
2d473b07cdd5: Pull complete
Digest: sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f
Status: Downloaded newer image for 192.168.80.150/system/centos:7

[root@localhost7C certs.d]# docker images | grep 192.168.80.150
192.168.80.150/system/centos 7 eeb6ee3f44bd 13 months ago 204 MB



 

二、Harbor之https:

7.创建证书,这种方式比较合同一个harbor服务器使用。
#创建证书
[root@localhost7F harbor]# mkdir  /usr/local/harbor/certs/ 
#生成私有key
[root@localhost7F harbor]# openssl genrsa -out /usr/local/harbor/certs/harbor-ca.key  
#签证
[root@localhost7F harbor]# openssl req -x509 -new -nodes -key /usr/local/harbor/certs/harbor-ca.key -subj "/CN=harbor1.abc.com" -days 7120 -out /usr/local/harbor/certs/harbor-ca.crt 


8.后期修改配置文件的流程
[root@localhost7F harbor]# docker-compose  stop
[root@localhost7F harbor]# vim harbor.cfg 
hostname = harbor.abc.com
ui_url_protocol = https 
ssl_cert = /usr/local/harbor/certs/harbor-ca.crt 
ssl_cert_key = /usr/local/harbor/certs/harbor-ca.key
harbor_admin_password = 123456

#更新配置文件
[root@localhost7F harbor]# ./prepare 
[root@localhost7F harbor]# docker-compose start



9.client 同步在crt证书:如果使用自签名的https证书,仍然会提示证书不受信任的问题。需要将自签名的ca证书发送到所有的docker客户端的指定目录。
[root@localhost7B ~]# mkdir /etc/docker/certs.d/harbor.abc.com -p 

#在client端创建与域名相同的文件夹
[root@localhost7F harbor]#scp /usr/local/harbor/certs/harbor-ca.crt 192.168.80.110:/etc/docker/certs.d/harbor.abc.com/

#添加host文件解析
[root@localhost7B ~]# vim /etc/hosts 
192.168.80.150 harbor.abc.com 
 

10测试登录harbor:上传和下载镜像
[root@localhost7B ~]# docker login harbor.abc.com

 

三、实现Harbor的高可用,https双主复制

    前提:
    两台配置https
    两台主机相互拷贝了证书
    搭建一台DNS解析服务,且两台都使用了DNS。
    如果使用IP地址,无需要添加hosts  DNS  申请证书等操作。
    
    
        IP           计算机名       功能软件
    192.168.80.120  localhost7C     DNS
    192.168.80.150  localhost7F     docker  harbor
    192.168.80.160  localhost7G        docker  harbor
    192.168.80.110  localhost7B     docker客户端测试机
    192.168.80.1    物理主机        web测试   

1.安装各服务器的docker  docker-compoose  harbor  参考上面教程


2.安装DNS服务器
为什么要做DNS服务器:Harbor是运行在容器中的,容器的DNS是宿主机的DNS地址,而且不能使用宿主机的hosts文件
    
安装bind软件包以及工具包
yum -y install bind bind-utils bind-libs bind-chroot


#修改主配置文件
[root@localhost7C ~]# cat  /etc/named.conf 
options {
        listen-on port 53 { any; };# 改为any,监听地址
        ...
        ...
        allow-query     { any; };  # 改为any,谁可以对当前DNS服务器提出解析请求,any是任何人



#修改区域配置文件
[root@localhost7C ~]# cat  /etc/named.rfc1912.zones
    ...
    ...
zone "abc.com" IN {  
        type master;
        file "abc.com.zone";  
        allow-update { none; };
};
 
zone "80.168.192.in-addr.arpa" IN {  
        type master;
        file "192.168.80.arpa";  
        allow-update { none; };
};


#创建正向和反向解析配置文件,注意文件权限。
[root@localhost7C ~]# cd /var/named
#  文件名与区域配置文件中的文件名一致
[root@localhost7C ~]# cp -p named.localhost abc.com.zone      # 正向解析
[root@localhost7C ~]# cp -p named.localhost 192.168.80.arpa   # 反向解析
[root@localhost7C ~]# chown root:named  abc.com.zone 192.168.80.arpa

#修改正向解析
[root@localhost7C ~]# cat  abc.com.zone 
$TTL 1D
@       IN SOA  @  34867893.qq.com. (  
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
           IN NS    @
              A    192.168.80.120
dns        IN A    192.168.80.120
harbor1    IN A    192.168.80.150
harbor2    IN A    192.168.80.160

#修改反向解析
[root@localhost7C ~]# cat  192.168.80.arpa 
$TTL 1D
@       IN SOA  @  34867893.qq.com. (  
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS    dns.abc.com.
dns   IN  A     192.168.80.120
120   IN PTR    dns.abc.com.
150   IN PTR    harbor1.abc.com.
160   IN PTR    harbor2.abc.com.
3.HTTPS自签证书(本实验使用第二个种)

方式一:
7.创建证书
[root@localhost7F harbor]# mkdir  /usr/local/harbor/certs/ 
#生成私有key
[root@localhost7F harbor]# openssl genrsa -out /usr/local/harbor/certs/harbor-ca.key  
#签证
[root@localhost7F harbor]# openssl req -x509 -new -nodes -key /usr/local/harbor/certs/harbor-ca.key -subj "/CN=harbor1.abc.com" -days 7120 -out /usr/local/harbor/certs/harbor-ca.crt 
----------------------------------------------------------------------

方式二:
#生成CA私钥和证书
openssl req  -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509  -subj "/CN=abc.com" -days 365 -out ca.crt

#生成域名私钥和证书请求文件(csr)
 openssl req  -newkey rsa:4096 -nodes -sha256 -subj "/CN=harbor1.abc.com" -keyout harbor1.abc.com.key -out harbor1.abc.com.csr
#生成域名证书
openssl x509 -req -in harbor1.abc.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial  -out harbor1.abc.com.crt

#Harbor2.abc.com 同理,使用同一个的CA证书,也可以另外创建一个CA。
openssl req  -newkey rsa:4096 -nodes -sha256 -subj "/CN=harbor2.abc.com" -keyout harbor2.abc.com.key -out harbor2.abc.com.csr
openssl x509 -req -in harbor2.abc.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial  -out harbor2.abc.com.crt

----------------------------------------------------------------------
方式三:
生成CA证书私钥
openssl genrsa -out ca.key 4096
# 生成CA证书
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=abc.com" -key ca.key -out ca.crt

#生成一个x509 v3扩展文件
#无论使用域名还是IP地址连接到Harbor主机,都必须创建此文件,以便可以为Harbor主机生成符合主题备用名称(SAN)和x509 v3的证书扩展要求
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor1.abc.com
DNS.2=abc
DNS.3=harbor1
EOF

# 生成域名私钥
openssl genrsa -out harbor1.abc.com.key 4096
# 生成证书签名请求
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=abc.com"  -key harbor1.abc.com.key  -out harbor1.abc.com.csr
# 生成harbor证书
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in harbor1.abc.com.csr -out harbor1.abc.com.crt



转换harbor证书->docker(不是必须)
部署 harbor 本身就是给 docker 准备的,所以 docker 在使用 harbor 时,也会用到证书。docker 的守护进程将 .crt 文件解释为 CA 证书,.cert 文件为客户端证书
openssl x509 -inform PEM -in harbor1.abc.com.crt -out harbor1.abc.com.cert



#另一个域名同理,使用相同的CA证书
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor2.abc.com
DNS.2=abc
DNS.3=harbor2
EOF

openssl genrsa -out harbor2.abc.com.key 4096
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=abc.com"  -key harbor2.abc.com.key  -out harbor2.abc.com.csr
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in harbor2.abc.com.csr -out harbor2.abc.com.crt
4.各服务器Harbor设置DNS地址
echo "nameserver 192.168.80.120" >> /etc/resolv.conf

5.各服务器添加hosts解析
echo "192.168.80.160  harbor2.abc.com"  >> /etc/hosts
echo "192.168.80.150  harbor1.abc.com"  >> /etc/hosts



6.DNS测试
[root@localhost7B ~]# nslookup
> harbor1.abc.com  #正向
Server:        192.168.80.120
Address:    192.168.80.120#53

Name:    harbor1.abc.com
Address: 192.168.80.150

> 192.168.80.160  #反向
160.80.168.192.in-addr.arpa    name = harbor2.abc.com.

    
7.创建证书目录和复制证书。
好多博客将.crt转换成.cert,可省略
好多博客将所有文件复制到/etc/docker/certs.d/xxx.abc.com/下,其实,只复制对方的crt一个文件即可。

#在 harbor1 创建 harbor2 的证书目录,并将harbor1证书复制到harbor2
[root@localhost7F certs]#mkdir /etc/docker/certs.d/harbor2.abc.com
[root@localhost7F certs]# scp harbor1.abc.com.crt   harbor2.abc.com:/etc/docker/certs.d/harbor1.abc.com/


#在 harbor2 创建 harbor1 的证书目录,并将harbor2证书复制到harbor1
[root@localhost7G certs]#mkdir /etc/docker/certs.d/harbor1.abc.com
[root@localhost7G certs]# scp harbor2.abc.com.crt   harbor1.abc.com:/etc/docker/certs.d/harbor2.abc.com/

    
8.设置配置文件
[root@localhost7F harbor]# docker-compose  stop
[root@localhost7F harbor]# vim harbor.cfg 
hostname = harbor1.abc.com
ui_url_protocol = https 
ssl_cert = /usr/local/harbor/certs/harbor1.abc.com.crt 
ssl_cert_key = /usr/local/harbor/certs/harbor1.abc.com.key
harbor_admin_password = Harbor123456

#更新配置文件
[root@localhost7F harbor]# ./prepare 
[root@localhost7F harbor]# docker-compose start    

10.web登录到harbor。两个服务器都创建 system web 两个项目。

 

客户端测试
#将两台harbor的证书复制到客户机测试,测试发现,复制CA.crt和abc.com.crt都可。
[root@localhost7B certs]#mkdir /etc/docker/certs.d/harbor1.abc.com
[root@localhost7B certs]#mkdir /etc/docker/certs.d/harbor2.abc.com
[root@localhost7F certs]# scp harbor1.abc.com.crt 192.168.80.110:/etc/docker/certs.d/harbor1.abc.com/
[root@localhost7G certs]# scp harbor2.abc.com.crt 192.168.80.110:/etc/docker/certs.d/harbor2.abc.com/


[root@localhost7B ~]# docker login harbor1.abc.com
[root@localhost7B ~]# docker tag centos:7 harbor1.abc.com/system/cnetos7:v1
[root@localhost7B ~]# docker push harbor1.abc.com/system/cnetos7:v1

[root@localhost7B ~]# docker login harbor2.abc.com
[root@localhost7B ~]# docker tag nginx:v1 harbor2.abc.com/web/nginx:v1
[root@localhost7B ~]# docker push harbor2.abc.com/web/nginx:v1

 

harbor1

harbor2

 

11.设置同步镜像

条件:
1.添加hosts 文件解析
2.添加DNS地址
3.因为使用了域名,且是 https 访问,所以两台harbor服务器必须要互换证书

创建harbor主主复制,可以在harbor的web界面里创建相互之间镜像同步关系,同步关系可以选择相同用户或不同用户之间。这样就保证了harbor双机热备关系。
1) "系统管理"->"仓库管理"->"新建目标", 填写对端harbor信息
2) "系统管理"->"复制管理"->"新建规则", 规则里会引用目的Registry,也就是上面一步创建的目标。同步模式有Push-based,Pull-based;触发模式有自动和定时。

 

目标名:自定义
目标URL:如果是域名的形式,必须在有域名服务可以解析域名,hosts是没用的,除非是ip的形式访问
访问ID:harbor2 的登录用户名,或者在 harbor2 创建的账户
访问密码:账户密码
验证远程证书:取消复选框(因为证书是自签证书,所以不需要验证)

最后测试连接成功后,再确定(测试通不过,一般是DNS 和证书的问题)

 

名称:自定义

描述: 自定义

源项目,本服务器要推送出去的项目名称(system或web)

目标:上面创建的目标

 

 

上面为单向推送,同理,在harbor2设置。

 

posted @ 2022-11-09 10:43  yuanbangchen  阅读(302)  评论(0编辑  收藏  举报