Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由vmware
开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了
开源 Docker Distribution。作为一个企业级私有 Registry 服务器,Harbor 提供了更
好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。Harbor
支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中,
确保数据和知识产权在公司内部网络中管控,另外,Harbor 也提供了高级的安全
特性,诸如用户管理,访问控制和活动审计等。
vmware 官方开源服务列表地址:https://vmware.github.io/harbor/cn/
harbor 官方 github 地址:https://github.com/vmware/harbor
harbor 官方网址:https://goharbor.io/
Harbor 功能官方介绍:
基于角色的访问控制:用户与 Docker 镜像仓库通过“项目”进行组织管理,
一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
镜像复制:镜像可以在多个 Registry 实例中复制(同步)。尤其适合于负载均衡,
高可用,混合云和多云的场景。
图形化用户界面:用户可以通过浏览器来浏览,检索当前 Docker 镜像仓库,管
理项目和命名空间。
AD/LDAP 支:Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理。
审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化:已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会
添加进来。
RESTful API - RESTful API :提供给管理员对于 Harbor 更多的操控, 使得与其它管
理软件集成变得更容易。
部署简单:提供在线和离线两种安装工具, 也可以安装到 vSphere 平台(OVA 方
式)虚拟设备。
nginx:harbor 的一个反向代理组件,代理 registry、ui、token 等服务。这个代理
会转发 harbor web 和 docker client 的各种请求到后端服务上。
harbor-adminserver:harbor 系统管理接口,可以修改系统配置以及获取系统信
息。
harbor-db:存储项目的元数据、用户、规则、复制策略等信息。
harbor-jobservice:harbor 里面主要是为了镜像仓库之前同步使用的。
harbor-log:收集其他 harbor 的日志信息。
harbor-ui:一个用户界面模块,用来管理 registry。
registry:存储 docker images 的服务,并且提供 pull/push 服务。
redis:存储缓存信息
webhook:当 registry 中的 image 状态发生变化的时候去记录更新日志、复制等
操作。
token service:在 docker client 进行 pull/push 的时候负责 token 的发放。
安装 Harbor:
下载地址:https://github.com/vmware/harbor/releases
安装文档:
https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
https://github.com/goharbor/harbor/blob/master/docs/README.md
下载docker-compose:
https://github.com/docker/compose/releases
安装docker-compose
harbor 需要docker-17.06或者更高版本,docker-compose-1.18.0以上
# 在线下载
[root@Bj-Ubuntu ~]# wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64
[root@Bj-Ubuntu ~]# cp docker-compose-Linux-x86_64 /usr/bin/docker-compose
授权
[root@Bj-Ubuntu ~]# chmod +x /usr/bin/docker-compose
测试
[root@Bj-Ubuntu ~]# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
docker-compose使用
# 查看Harbor容器的运行状态
[root@ubuntu-1804 harbor]# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------
harbor-core /harbor/entrypoint.sh Up (healthy)
harbor-db /docker-entrypoint.sh Up (healthy)
harbor-jobservice /harbor/entrypoint.sh Up (healthy)
harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp
harbor-portal nginx -g daemon off; Up (healthy)
nginx nginx -g daemon off; Up (healthy) 0.0.0.0:80->8080/tcp
redis redis-server /etc/redis.conf Up (healthy)
registry /home/harbor/entrypoint.sh Up (healthy)
registryctl /home/harbor/start.sh Up (healthy)
trivy-adapter /home/scanner/entrypoint.sh Up (healthy)
# 启动Harbor容器
docker-compose start
# 停止Harbor容器
docker-compose stop
# 重启Harbor容器
docker-compose restart
# 停止并删除Harbor容器,加上-v参数可以同时移除挂载在容器上的目录
docker-compose down
# 创建并启动Harbo容器,参数“-d”表示后台运行命令
docker-compose up -d
安装harbor
# 解压
[root@Bj-Ubuntu ~]# tar xf harbor-offline-installer-v2.2.3.tgz
[root@Bj-Ubuntu ~]# cd harbor/
[root@Bj-Ubuntu ~/harbor]# ll
total 502868
drwxr-xr-x 2 root root 4096 Jul 17 11:24 ./
drwx------ 7 root root 4096 Jul 17 11:24 ../
-rw-r--r-- 1 root root 3361 Jul 5 13:39 common.sh
-rw-r--r-- 1 root root 514891405 Jul 5 13:40 harbor.v2.2.3.tar.gz
-rw-r--r-- 1 root root 7840 Jul 5 13:39 harbor.yml.tmpl
-rwxr-xr-x 1 root root 2500 Jul 5 13:39 install.sh*
-rw-r--r-- 1 root root 11347 Jul 5 13:39 LICENSE
-rwxr-xr-x 1 root root 1881 Jul 5 13:39 prepare*
改配置文件
[root@Bj-Ubuntu ~/harbor]# cp harbor.yml.tmpl harbor.yml
[root@Bj-Ubuntu ~/harbor]# vim harbor.yml
hostname: 172.31.0.19
harbor_admin_password: 123456
data_volume: /data/harbor # 这个目录生产环境建议使用挂载的某个单独分区来挂载
启动 (注意:本机不能有启动会占用的端口,harbor会用到的端口,比如80,不然会报错)
[root@Bj-Ubuntu ~/harbor]# ./install.sh
登陆浏览器访问测试
用户:admin
密码:123456
创建新项目
测试打标签上传
[root@long-ubuntu ~]# docker tag centos7.9-base:v1 172.31.0.19/m44/centos7.9-base:v1
# 上传,发现报错,提示没有登录
[root@long-ubuntu ~]# docker push 172.31.0.19/m44/centos7.9-base:v1
# 登录,发现报错,dial tcp 172.31.0.19:443: connect: connection refused
[root@long-ubuntu ~]# docker login 172.31.0.19
Username: admin
Password:
# 解决办法:
在docker.service配置文件添加 --insecure-registry
[root@long-ubuntu ~]# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 172.31.0.19 --insecure-registry harbor.longxuan.vip
# 重新加载
[root@long-ubuntu ~]# systemctl daemon-reload
[root@long-ubuntu ~]# systemctl restart docker
还要在/etc/hosts 文件添加
[root@long-ubuntu ~]# cat /etc/hosts
172.31.0.19 harbor.longxuan.vip
登录发现报错:
unauthorized: unauthorized to access repository: baseimages/jdk-base, action: push: unauthorized to access repository: baseimages/jdk-base, action: push
# 解决方法:重新登录docker login harbor.longxuan.vip
Username: admin
Password:
# 或者重新打标签把域名改成使用IP地址,即可
测试1
# 打标签
[root@long-ubuntu ~]# docker tag tomcat-base:v8.5.54 harbor.longxuan.vip/baseimages/tomcat-base:v8.5.54
# 上传
[root@long-ubuntu ~]# docker push harbor.longxuan.vip/baseimages/tomcat-base:v8.5.54
测试2,其他机器pull镜像试试(前提条件是这台机器安装有docker环境)
[root@long-ubuntu ~]# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 172.31.0.19 --insecure-registry harbor.longxuan.vip
# 重新加载
[root@long-ubuntu ~]# systemctl daemon-reload
[root@long-ubuntu ~]# systemctl restart docker
# 添加域名解析
[root@long-ubuntu ~]# vim /etc/hosts
172.31.0.19 harbor.longxuan.vip
测试登录并拉取镜像
[root@long-ubuntu ~]# docker login harbor.longxuan.vip
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
# 拉取
[root@long-ubuntu ~]# docker pull harbor.longxuan.vip/baseimages/centos7.9-base:v1
v1: Pulling from baseimages/centos7.9-base
2d473b07cdd5: Pull complete
63ef7c9402ed: Pull complete
0b032c9ff74a: Pull complete
Digest: sha256:911d70953b9a281f0bc4da622f88b600c5893057f9e2e3e9dec2fc389f3ab309
Status: Downloaded newer image for harbor.longxuan.vip/baseimages/centos7.9-base:v1
harbor.longxuan.vip/baseimages/centos7.9-base:v1
添加扫描功能
[root@Bj-Ubuntu ~/harbor]# ./prepare --with-trivy
[root@Bj-Ubuntu ~/harbor]# docker-compose up -d
网页刷新即可,如下图就是可以开启扫描功能
基于单机版制作高可用版的harbor仓库
环境:
haproxy + keepalived 172.18.8.18 Centos8
haproxy + keepalived 172.18.8.28 Centos8
harbor 172.18.8.119 Ubuntu1804
harbor 172.18.8.129 Ubuntu1804
两台haproxy一样的操作
[root@localhost ~]# yum install keepalived haproxy psmisc -y
[root@localhost ~]# cat /etc/sysctl.conf
[root@localhost ~]# net.ipv4.ip_nonlocal_bind = 1
改haproxy配置
[root@localhost ~]# cat /etc/haproxy/haproxy.cfg
listen harbor-80
bind 172.18.8.188:80
mode http
#balance source
balance roundrobin
server 172.18.8.119 172.18.8.119:80 check inter 3000 fall 2 rise 5
server 172.18.8.129 172.18.8.129:80 check inter 3000 fall 2 rise 5
改keepalived配置
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL1 #backup 为数字2
vrrp_mcast_group4 224.0.100.100
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 1
weight -30
fall 3
rise 2
timeout 2
}
vrrp_instance VI_1 {
state BACKUP #如果是非抢占模式都是backup 为BACKUP
interface eth0
virtual_router_id 66
priority 100 #backup 为80
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.8.188/16 dev eth0 label eth0:1
}
track_interface {
eth0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
track_script {
check_haproxy
}
}
判断haproxy脚本
[root@localhost ~]# cat /etc/keepalived/check_haproxy.sh
#!/bin/bash
# 为0就表示进程存在,否则表示不存在
/usr/bin/killall -0 haproxy || systemctl restart haproxy
keepalived-notify脚本
[root@localhost ~]# cat /etc/keepalived/notify.sh
!/bin/bash
contact='root@localhost'
notify() {
mailsubject="$(hostname) to be $1:vip floating"
mailbody="$(date +'%F %T'):vrrp transition,$(hostname) change to be $1"
echo $mailbody | mail -s "$mailsubject" $contract
}
case $1 in
master)
notify master
systemctl start nginx
;;
backup)
notify backup
systemctl restart nginx
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
esac
授权给两个脚本
[root@localhost ~]# chmod +x /etc/keepalived/*.sh
启动服务
[root@localhost ~]# systemctl restart keepalived haproxy
然后就测试
两台操作一样
[root@long-ubuntu ~]# apt purge ufw lxd lxd-client lxcfs lxc-common -y
[root@long-ubuntu ~]# apt install -y iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip
[root@long-ubuntu ~]# apt-get remove docker docker-engine docker.io
[root@long-ubuntu ~]# apt-get install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
[root@long-ubuntu ~]# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
[root@long-ubuntu ~]# sudo add-apt-repository "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
[root@long-ubuntu ~]# apt install -y docker-ce=5:19.03.15~3-0~ubuntu-bionic docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic
[root@long-ubuntu ~]# sudo mkdir -p /etc/docker
[root@long-ubuntu ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://rzd1bb7q.mirror.aliyuncs.com"]
}
EOF
[root@long-ubuntu ~]# sudo systemctl daemon-reload
[root@long-ubuntu ~]# sudo systemctl restart docker
[root@long-ubuntu ~]# wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64
[root@long-ubuntu ~]# ll
[root@long-ubuntu ~]# cp docker-compose-Linux-x86_64 /usr/bin/docker-compose
[root@long-ubuntu ~]# chmod +x /usr/bin/docker-compose
[root@long-ubuntu ~]# docker-compose --version
[root@long-ubuntu ~]# tar xf harbor-offline-installer-v2.2.3.tgz
改配置文件
[root@Bj-Ubuntu ~/harbor]# cp harbor.yml.tmpl harbor.yml
[root@Bj-Ubuntu ~/harbor]# vim harbor.yml
hostname: 172.18.8.119
harbor_admin_password: 123456
data_volume: /data/harbor # 这个目录生产环境建议使用挂载的某个单独分区来挂载
启动安装脚本
[root@ubuntu-1804 harbor]# ./install.sh --with-trivy
停止
[root@ubuntu-1804 harbor]# docker-compose stop
全部启动
[root@ubuntu-1804 harbor]# docker-compose up -d
web界面配置
创建仓库管理时,填写的url是对方的,复制管理才能看到对方的url并选择
测试
# 修改docker.service配置文件
root@ubuntu-1804:~# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 172.18.8.188 --insecure-registry harbor.longxuan.vip
重新加载并重启
root@ubuntu-1804:~# systemctl daemon-reload
root@ubuntu-1804:~# systemctl restart docker
重启docker-compose
# 先停止
[root@ubuntu-1804 harbor]# docker-compose stop
# 启动
[root@ubuntu-1804 harbor]# docker-compose start
# 创建并启动Harbo容器,参数“-d”表示后台运行命
[root@ubuntu-1804 harbor]# docker-compose up -d
登录
[root@ubuntu-1804 ~]# docker login harbor.longxuan.vip
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 # 当看到这个说明登录成功
拉取一个镜像并上传测试
[root@ubuntu-1804 ~]# docker pull nginx:1.18.0
给镜像重新打标签
[root@ubuntu-1804 ~]# docker tag nginx:1.18.0 172.18.8.188/m44/nginx-1.18:v1
上传镜像
[root@ubuntu-1804 ~]# docker push 172.18.8.188/m44/nginx-1.18:v1
The push refers to repository [172.18.8.188/m44/nginx-1.18]
4fa6704c8474: Pushed
4fe7d87c8e14: Pushed
6fcbf7acaafd: Pushed
f3fdf88f1cb7: Pushed
7e718b9c0c8c: Pushed
v1: digest: sha256:9b0fc8e09ae1abb0144ce57018fc1e13d23abd108540f135dc83c0ed661081cf size: 1362
查看web界面应该就会看到两边都有镜像
总结
haproxy使用默认的轮询算法没有办法登录,需要设置成源地址轮询哈希算法(要是mode是http 就可以使用默认轮询算法)
(建议使用非抢占模式)keepalived + HAProxy 配置的监听脚本是判断haproxy是否存在,如果不存在就重启haproxy,同时vip不会飘走,当机器出现两个软件服务都down的时候才会执行权重-30,VIP会飘到backup机器,同时采用了非抢占模式,当原来的master重启恢复,VIP也不会抢回来到原来的master,同时原来的master就会变成backup机器
harbor只能在线实时同步,如果有出现某一台宕机,同时还有操作上传镜像的,另外宕机这台是不能同步的,也就是当启动宕机的这台服务器查看harbor不会看到刚才上传的镜像
真要做到高可用方法:
镜像最好放存储,把harbor的数据目录默认/data 指向存储