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设置。