Harbor -- 搭建Docker本地私人仓库

480 阅读2分钟

一、环境

  • CentOS 7

  • Docker

  • docker-compose

    • 安装docker-compose

       sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
       sudo chmod +x /usr/local/bin/docker-compose
      

二、初步安装

1、下载Harbor

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

  • harbor-offline-installer-v2.3.4.tgz:离线版,包含安装所需的镜像;
  • harbor-online-installer-v2.3.4.tgz:在线版,不包含安装所需的镜像,安装时,会在线拉取所需的镜像;

2、拷贝与解压

将安装包拷贝到镜像仓库服务器上,然后解压:

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

进入解压后的目录,查看目录下的文件:

 cd harbor
 ll

image.png

3、配置Harbor

复制一份yaml文件

 cp harbor.yml.tmpl harbor.yml

修改harbor.yml文件:

 vim harbor.yml

修改hostname,修改端口号port(也可不修改),https方式后续会说明,这里先不使用https模式,因而将https方式注释掉;

image.png

记住harbor首次登录密码,登录之后可以修改;修改数据存放路径,我放在/data/harbor下;

image.png

保存并退出;

4、执行安装

执行同目录下的install.sh脚本;

 ./install.sh

等待执行完成;

image.png

执行完成之后,即可使用地址192.168.10.131:5555访问:

image.png image.png

使用账号密码登录,账号默认是admin,密码默认是Harbor12345,如果在harbor.yml文件修改了密码则使用修改后的密码登录;

5、配置Docker

修改Docker配置文件daemon.json

 vim /etc/docker/daemon.json

添加以下内容:

 {
     "insecure-registries": [
         "192.168.10.131:5555"
     ]
 }

image.png

保存并退出,重启Docker:

 systemctl restart docker

6、验证

  • 测试镜像上传

    先下载一个nginx镜像:

     docker pull nginx
    

    nginx镜像打标签:

     ## 192.168.10.131:5555为镜像仓库的IP和端口号
     ## library为镜像仓库的路径
     ## 将镜像打上此标签后,才能将镜像推到镜像仓库的library路径
     docker tag nginx 192.168.10.131:5555/library/nginx:v1
    

    推送镜像:

     ## 登录镜像仓库,账号admin,也可以使用创建的新账号
     docker loing 192.168.10.131:5555
    

    image.png

     ## 登录成功后,开始推送
     docker push 192.168.10.131:5555/library/nginx:v1
    

    image.png

    也可以在网页上看到刚上传的镜像:

    image.png

  • 测试镜像拉取

    先将本地镜像192.168.10.131:5555/library/nginx:v1删除:

     docker rmi -f 192.168.10.131:5555/library/nginx:v1
    

    image.png

    拉取本地仓库的镜像:

     docker pull 192.168.10.131:5555/library/nginx:v1
    

    image.png

三、使用域名访问

1、分析

初步安装后,从镜像仓库中拉取镜像或者将镜像推送到镜像仓库中时,都是使用的IP地址+端口号访问;这种方式有以下缺点:

  • 不方便记忆
  • 后续仓库服务器IP变化时,改动太大;

因而期望通过域名访问。

2、方案

使用https + 自签名证书方式可以实现通过域名访问,域名设置为:mirrors.cn

3、操作

  • 生成CA证书

    创建目录:

     mkdri /data/cert
     cd /data/cert
    

    生成 CA 证书私钥:

     openssl genrsa -out ca.key 4096
    

    生成 CA 证书:

     openssl req -x509 -new -nodes -sha512 -days 3650 \
      -subj "/C=CN/ST=GuangDong/L=GuangDong/O=kaifa/OU=Personal/CN=mirrors.cn" \
      -key ca.key \
      -out ca.crt
    
  • 生成服务器证书

    生成私钥:

     openssl genrsa -out mirrors.cn.key 4096
    

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

     openssl req -sha512 -new \
         -subj "/C=CN/ST=GuangDong/L=GuangDong/O=kaifa/OU=Personal/CN=mirrors.cn" \
         -key mirrors.cn.key \
         -out mirrors.cn.csr
    

    生成 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=mirrors.cn
     DNS.2=mirrors
     DNS.3=k8smaster
     EOF
    

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

     openssl x509 -req -sha512 -days 3650 \
         -extfile v3.ext \
         -CA ca.crt -CAkey ca.key -CAcreateserial \
         -in mirrors.cn.csr \
         -out mirrors.cn.crt
    
  • 配置Docker

    .crt文件转换为.cert文件:

     openssl x509 -inform PEM -in mirrors.cn.crt -out mirrors.cn.cert
    

    将服务器证书、密钥和 CA 文件复制到 Harbor 主机上的 Docker 证书文件夹中:

     ## 创建文件夹
     cd /etc/docker
     mkdir certs.d && cd certs.d
     mkdir mirrors.cn
     cd /data/cert/
     ## 复制
     cp mirrors.cn.cert /etc/docker/certs.d/mirrors.cn/
     cp mirrors.cn.key /etc/docker/certs.d/mirrors.cn/
     cp ca.crt /etc/docker/certs.d/mirrors.cn/
    

    如果将默认端口 443 映射到其他端口,需创建新文件夹,并将上述证书复制到新文件夹中:

     /etc/docker/certs.d/yourdomain.com:port
     /etc/docker/certs.d/harbor_IP:port
    

    重新启动 Docker 引擎:

     systemctl restart docker
    
  • 配置Harbor

    将服务器证书和密钥复制到 Harbor 主机上的证书文件夹中:

     ## 若是在/data/cert/目录生成,则不需要复制
     cp mirrors.cn.crt /data/cert/
     cp mirrors.cn.key /data/cert/
    

    修改harbor配置文件harbor.yml,开启https:

    image.png

    保存并退出;如果 Harbor 正在运行,请停止并删除现有实例:

     docker-compose down -v
    

    运行同目录下的脚本prepare,重新生成配置文件,增加上其他chart功能等:

     ./prepare --with-notary --with-trivy --with-chartmuseum
    

    重新启动Harbor:

     docker-compose up -d
    

4、验证

  • 配置

    在测试服务器上的Docker配置文件中添加以下内容:

     {
       "insecure-registries": [
         "https://mirrors.cn"
       ]
     }
    

    image.png

    配置完重启Docker:

     systemctl restart docker
    

    查看当前镜像:

     docker images
    

    image.png

  • 测试拉取镜像

    拉取镜像nginx:v1

     docker pull mirrors.cn/library/nginx:v1
    

    image.png

    查看镜像:

     docker images
    

    image.png

  • 测试推送镜像

    nginx镜像打标签:

     docker tag nginx mirrors.cn/library/nginx:v2
    

    登录mirrors.cn

     docker login mirrors.cn
    

    推送镜像:

     docker push mirrors.cn/library/nginx:v2
    

    image.png

    从客户端上查看推送的镜像:

    image.png

四、镜像代理

1、分析

现象: 目前镜像仓库只支持本地的拉取和推送,当拉取的镜像不存在时,就报错了;

期望: 当拉取的镜像不存在时,自动去其他镜像仓库中拉取,比如:docekr-cnustc

2、方案

通过配置镜像代理实现

3、操作

登录Harbor客户端,点击仓库管理,然后选择新建目标:

image.png

创建ustc镜像源:

image.png

创建新项目:

image.png

配置使用代理:

image.png

点击确定,当前Harbor有两个项目,一个镜像代理proxy,一个项目library

image.png

4、验证

  • 环境

    为了让测试效果更直观,先将镜像仓库的nginx镜像和服务器本地nginx镜像删除:

    image.png image.png

  • 测试利用代理获取镜像

    使用以下命令拉取镜像:

     ## 格式
     docker pull <harbor_server_name>/<proxy_project_name>/<project_name>/<image_name>:<image_tag>
     ## 示例
     docker pull mirrors.cn/proxy/library/nginx
    

    image.png

    查看客户端:

    image.png