搭建单机版Harbor仓库和升级为高可用版

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

搭建单机版Harbor仓库和升级为高可用版

创建新项目

搭建单机版Harbor仓库和升级为高可用版

搭建单机版Harbor仓库和升级为高可用版

测试打标签上传

[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仓库和升级为高可用版

基于单机版制作高可用版的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并选择

搭建单机版Harbor仓库和升级为高可用版

搭建单机版Harbor仓库和升级为高可用版

测试

# 修改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 指向存储
上一篇:进阶Docker笔记(2)—搭建私有仓库


下一篇:docker 总结