当前位置 博文首页 > RtxTitanV的博客:搭建Harbor私有镜像仓库

    RtxTitanV的博客:搭建Harbor私有镜像仓库

    作者:[db:作者] 时间:2021-07-07 10:13

    Docker容器应用的开发和运行离不开可靠的镜像管理,部署一个私有的镜像仓库是十分有必要的。虽然Docker官方提供了docker-registry用于构建私有的镜像仓库。但它的功能没有Harbor丰富,而Harbor提供了包括权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面等功能,基本满足企业级需求,应用也很广泛。

    本文主要对搭建Harbor私有镜像仓库进行简单总结。

    一、Harbor简介

    Harbor是为企业用户设计的容器镜像仓库开源项目,提供了包括权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册、HA和中文支持等企业必需的功能。Harbor还是CNCF(云原生计算基金会)的一个项目,提供合规性,高性能和互操作性,以帮助跨例如Kubernetes和Docker等云原生计算平台的项目进行持续和安全地管理。

    二、前置条件

    Harbor将被部署为多个Docker容器。因此,可以将其部署在任何支持Docker的Linux发行版上。搭建Harbor镜像仓库所需的具体前置条件如下。

    1.硬件

    部署Harbor最低和推荐的硬件配置:

    • CPU:最低2CPU,推荐4CPU。
    • 内存:最低4GB,推荐8GB。
    • 磁盘:最低40GB,推荐160GB。

    2.软件

    Harbor在目标主机上要求安装的软件:

    • Docker Engine:17.06.0-ce +版或更高版本,安装可参考Docker在CentOS7上的安装及常用命令。
    • Docker Compose:1.18.0版或更高版本,安装可参考Docker Compose在Linux上的安装。
    • Openssl:首选最新版本,用于生成Harbor的证书和密钥。

    3.网络端口

    Harbor在目标主机上要求开放以下端口:

    • 443:HTTPS协议,Harbor在此端口上接收HTTPS请求。可以在配置文件中更改。
    • 4443:HTTPS协议,Harbor与Docker内信任服务间的连接。仅在启用Notary的情况下才需要。可以在配置文件中更改。
    • 80:HTTP协议,Harbor在此端口上接收HTTP请求。可以在配置文件中更改。

    三、环境信息

    准备两台主机,这里使用的是虚拟机,harbor-server用来搭建Harbor镜像仓库,这里选择搭建v2.0.1版的Harbor仓库,docker-client用来演示登录、推送和拉取等基本操作。这里harbor-server满足搭建的前置条件,两台主机均安装了Docker和Docker Compose。具体环境如下:

    主机名ip配置操作系统DockerDocker ComposeHarbor备注
    harbor-server192.168.1.64C4GCentOS Linux release 8.1.191119.03.111.26.0v2.0.1Harbor镜像仓库服务器,Docker和Docker Compose必须安装,Haebor选择v2.01
    docker-client192.168.1.84C2GCentOS Linux release 8.1.191119.03.111.26.0/运行Docker的普通服务器,Docker必须安装,Docker Compose可选安装

    四、下载安装

    Harbor安装包分为在线安装包和离线安装包:

    • 在线安装包:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小。
    • 离线安装包:包含预构建的镜像,因此安装包较大。推荐使用离线安装包。

    1.手动下载并上传至目标服务器

    可以从官方发布页面下载指定版本的Harbor离线或在线安装包,如下图所示:
    手动下载安装包
    然后上传到目标服务器。这里上传到harbor-server主机/usr/local目录下并进入/usr/local目录。

    2.通过命令下载

    也可以通过命令在目标服务器即harbor-server下载安装包,先安装wget:

    yum install -y wget
    

    进入/usr/local目录:

    cd /usr/local
    

    下载离线安装包:

    wget https://github.com/goharbor/harbor/releases/download/v2.0.1/harbor-offline-installer-v2.0.1.tgz
    

    下载在线安装包:

    wget https://github.com/goharbor/harbor/releases/download/v2.0.1/harbor-online-installer-v2.0.1.tgz
    

    3.解压安装包

    解压离线安装包:

    tar -zxvf harbor-offline-installer-v2.0.1.tgz
    

    解压在线安装包:

    tar -zxvf harbor-online-installer-v2.0.1.tgz
    

    这里使用的离线安装包安装。解压完成后进入/usr/local/harbor目录:

    cd harbor
    

    五、配置对Harbor的HTTPS访问

    在开发和测试环境中,可以使用HTTP访问,但在生产环境,最好使用HTTPS。默认情况下,Harbor不附带证书。要配置HTTPS,必须创建SSL证书。可以使用由受信任的第三方CA机构签名的证书,也可以使用自签名证书。这里使用openssl创建自签名证书,如果没安装openssl工具的可以执行以下命令安装,有openssl工具就直接跳过:

    yum install -y openssl 
    

    下文中的harbor.domain.com为自定义的域名,也可以使用ip地址。

    1.生成CA证书

    生成CA证书私钥:

    openssl genrsa -out ca.key 4096
    

    生成CA证书:

    openssl req -x509 -new -nodes -sha512 -days 3650 \
     -subj "/C=CN/ST=Chongqing/L=Chongqing/O=RtxTitanV/OU=Personal/CN=harbor.domain.com" \
     -key ca.key \
     -out ca.crt
    

    2.生成服务器证书

    生成私钥:

    openssl genrsa -out harbor.domain.com.key 4096
    

    生成证书签名请求(CSR):

    openssl req -sha512 -new \
        -subj "/C=CN/ST=Chongqing/L=Chongqing/O=RtxTitanV/OU=Personal/CN=harbor.domain.com" \
        -key harbor.domain.com.key \
        -out harbor.domain.com.csr
    

    生成一个v3版x509扩展文件:

    cat > v3.ext <<-EOF
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1=harbor.domain.com
    EOF
    

    如果没有使用域名而是直接使用ip地址,则执行以下命令生成v3版x509扩展文件:

    cat > v3.ext <<-EOF
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = IP:192.168.1.6
    EOF
    

    使用该v3.ext文件为Harbor主机生成证书:

    openssl x509 -req -sha512 -days 3650 \
        -extfile v3.ext \
        -CA ca.crt -CAkey ca.key -CAcreateserial \
        -in harbor.domain.com.csr \
        -out harbor.domain.com.crt
    

    3.将证书提供给Harbor和Docker

    在Harbor主机创建证书目录并将服务器证书和密钥复制到该目录下:

    mkdir -p /data/cert/harbor/ && cp harbor.domain.com.crt harbor.domain.com.key /data/cert/harbor/
    

    harbor.domain.com.crt转化为harbor.domain.com.cert供Docker使用,Dockr守护进程将.crt文件看成CA证书,将.cert看成客户端证书:

    openssl x509 -inform PEM -in harbor.domain.com.crt -out harbor.domain.com.cert
    

    在Harbor主机创建Docker证书目录并将服务器证书、密钥和CA证书复制到该目录下:

    mkdir -p /etc/docker/certs.d/harbor.domain.com/ && cp harbor.domain.com.cert harbor.domain.com.key ca.crt /etc/docker/certs.d/harbor.domain.com/
    

    如果将默认的nginx端口443映射到其他端口,需创建/etc/docker/certs.d/altrialily.com:port文件夹或/etc/docker/certs.d/harbor_IP:port

    重启Docker:

    systemctl restart docker
    

    4.修改Harbor配置文件

    v2.0.1版本Harbor配置文件名为harbor.yml.tmpl,将它拷贝到一份新的文件,名为harbor.yml

    cp harbor.yml.tmpl harbor.yml
    

    使用vi编辑器修改配置:

    vi harbor.yml
    

    修改如下配置:

    # 设置访问地址,可以设置ip或域名
    # 不能使用localhost或127.0.0.1,因为需要被外部客户端访问
    hostname: harbor.domain.com
    
    # http配置
    http:
      # http端口,默认为80。如果启用https,该端口将重定向到https端口
      port: 8088
    
    # https配置
    https:
      # harbor的https端口,默认为443
      port: 443
      # 指定生成的服务器证书和私钥的路径
      certificate: /data/cert/harbor/harbor.domain.com.crt
      private_key: /data/cert/harbor/harbor.domain.com.key
    
    # 设置Harbor登录密码,默认为Harbor12345,可以修改
    harbor_admin_password: rtxtitanv
    

    六、部署Harbor

    Harbor使用一个nginx实例作为所有服务的反向代理,通过使用prepare脚本可以为nginx配置启用HTTPS。以下命令为运行prepare脚本以启用HTTPS:

    ./prepare
    

    执行完成之后查看文件,生成了docker-compose.yml文件。
    生成了docker-compose.yml文件
    通过以下命令或sudo ./install.sh启动Harbor:

    docker-compose up -d
    

    查看容器,发现启动成功:
    发现启动成功
    如果想停止并删除所有实例(镜像不会删除),可以执行以下命令:

    docker-compose down -v
    

    下面验证Harbor是否部署成功,首先在Windows主机中访问Harbor仓库管理页面。由于是自定义域名,先打开C:\Windows\System32\drivers\etc\hosts文件,添加以下域名解析后保存:

    192.168.1.6 harbor.domain.com
    

    然后访问https://harbor.domain.com,出现Harbor登录页面,输入用户名密码登录:
    Harbor登录页面
    登录成功
    能够访问Harbor仓库管理页面,说明Harbor镜像仓库搭建成功。下面在Windows主机中添加证书受信,先将ca.crt下载到Windows主机中,右键安装证书进行导入,选择本地计算机:
    安装证书进行导入
    选择将证书存储到受信任的根证书颁发机构:
    将证书存储到受信任的根证书颁发机构
    再次访问Harbor仓库管理页面,不会提示不安全连接了:
    不会提示不安全连接了

    七、Harbor基本使用

    1.在Harbor主机登录Harbor仓库并推送镜像

    下面在Harbor主机即harbor-server主机登录Harbor仓库。执行以下命令添加域名解析:

    cat >> /etc/hosts << EOF
    192.168.1.6 harbor.domain.com
    EOF
    

    执行以下命令使用admin用户登录harbor.domain.com

    docker login harbor.domain.com
    

    admin用户登录成功
    下面进行镜像推送,注意推送至library项目必须先登录具有library管理权限的用户,而登录的admin用户默认就具有library的管理权限,所以可以推送。执行以下命令给redis:alpine镜像打上TAG并推送至harbor.domain.comlibrary中:

    docker tag redis:alpine harbor.domain.com/library/myredis:v1
    docker push harbor.domain.com/library/myredis:v1
    

    推送harbor.domain.com/library/myredis:v1镜像
    查看Harbor镜像仓库library项目发现推送成功:
    harbor.domain.com/library/myredis:v1镜像推送成功

    注意:如果使用HTTP而不是HTTPS连接Harbor镜像仓库,由于Harbor默认不允许HTTP连接,则必须在Docker客户端主机中使用--insecure-registry将Harbor镜像仓库访问地址添加进允许连接访问的列表中。即在Docker客户端主机中使用vi编辑器修改/etc/docker/daemon.json文件:

    vi /etc/docker/daemon.json
    

    新增以下内容:

    {
    "insecure-registries" : ["这里填自己的域名或ip:这里填HTTP暴露的端口(80可省略)", "0.0.0.0"]
    }
    

    daemon.json更新后必须重启Docker客户端主机中的Docker和Harbor主机中的Harbor:

    systemctl restart docker
    docker-compose down -v
    docker-compose up -d
    

    2.在Docker客户端主机登录Harbor仓库并拉取镜像

    下面在docker-client主机登录Harbor仓库。先在docker-client主机执行以下命令添加域名解析:

    cat >> /etc/hosts << EOF
    192.168.1.6 harbor.domain.com
    EOF
    

    然后将Harbor主机即harbor-server主机的Docker证书目录(/etc/docker/certs.d/harbor.domain.com/)复制到docker-client主机/etc/docker/certs.d/目录下,在harbor-server主机执行以下命令:

    scp -r /etc/docker/certs.d/ root@192.168.1.8:/etc/docker/certs.d/
    

    然后在docker-client主机使用admin用户登录harbor.domain.com,登录成功:
    docker-client主机使用admin用户登录harbor.domain.com成功
    登出harbor.domain.com

    docker logout harbor.domain.com
    

    登出harbor.domain.com
    拉取镜像:

    docker pull harbor.domain.com/library/myredis:v1
    

    拉取镜像成功
    拉取镜像成功,因为library在Harbor中是公开项目,所以不用登陆也能拉取镜像,但推送至library必须先登录具有library管理权限的用户。

    3.创建Harbor用户并赋予项目权限

    在Harbor仓库管理页面创建一个新用户:
    在Harbor仓库管理页面创建一个新用户
    使用rtxtitanv用户登录harbor.domain.com并推送一个镜像至library,发现没有权限:
    使用rtxtitanv用户登录harbor.domain.com并推送一个镜像至library没有权限
    library项目下的成员中添加rtxtitanv用户,赋予用户该项目的管理权限,有以下5种权限,这里选项目管理员:
    在library项目下的成员中添加rtxtitanv用户,赋予用户该项目的管理权限
    再次上传,发现上传成功:
    再次上传
    上传成功

    4.创建Harbor项目并验证访问权限

    新建一个名为myproject的项目,访问级别设置为私有,不设置存储容量上限:
    新建一个名为myproject的项目
    myproject的项目创建成功
    然后赋予rtxtitanv用户该项目的管理权限后,推送一个harbor.domain.com/myproject/myredis:v3镜像至myproject
    赋予rtxtitanv用户该项目的管理权限后推送一个harbor.domain.com/myproject/myredis:v3镜像至myproject
    然后在harbor-server主机拉取这个镜像,如果登录了用户先登出再拉取,发现没有权限:
    如果登录了用户先登出再拉取结果没有权限
    这里为了演示再创建一个名为harbortest的用户,没有赋予myproject项目的管理权限,登录harbortest用户拉取镜像,发现依然没权限:
    登录没有赋予myproject项目的管理权限的harbortest用户拉取镜像结果依然没权限
    然后登录赋予了myproject管理权限的rtxtitanv用户拉取镜像,拉取成功:
    然后登录赋予了myproject管理权限的rtxtitanv用户拉取镜像成功
    说明私有访问级别的项目必须登录具有该项目管理权限的用户才能进行推送和拉取镜像。

    cs