• 【docker系列】使用docker-compose安装私有镜像仓库Harbor


    在之前的文章中我们已经为大家介绍了docker registry v2私有镜像仓库,在实际的企业级生产环境中实际上很少会直接使用docker registry v2,而是使用Harbor。Harbor基于docker registry v2的基础上为用户提供了图形管理界面,同时支持多角色多用户的镜像访问权限管理,以及国际化的语言支撑(包括中文)。总之,Harbor面向用户更加友好,适用于多团队、多项目组情况下的镜像管理工作!

    一、安装的准备工作

    第一步:前置条件,已经正确安装docker、docker-compose。

    第二步:下载harbor离线安装包,可选版本在github-https://github.com/goharbor/harbor/releases,我下载的是v2.5.0离线安装版本。

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

    第三步: 在压缩包所在目录(最好单独建一个目录)解压压缩包

    tar xzvf ./harbor-offline-installer-v2.5.0.tgz
    
    • 1

    解压之后的目录是harbor(后面所有的操作都在这个目录下进行),目录内的内容如下

    # cd harbor   
    # ls -ltr
    总用量 647720
    -rwxr-xr-x. 1 root root      1881 47 15:52 prepare
    -rw-r--r--. 1 root root     11347 47 15:52 LICENSE
    -rwxr-xr-x. 1 root root      2500 47 15:52 install.sh
    -rw-r--r--. 1 root root      9917 47 15:52 harbor.yml.tmpl
    -rw-r--r--. 1 root root      3361 47 15:52 common.sh
    -rw-r--r--. 1 root root 663227387 47 15:52 harbor.v2.5.0.tar.gz
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    第四步: 新建一个目录,用于存放harbor持久化数据,包括Registry镜像、管理数据数据库文件等。这个目录在后文中会用到。

    mkdir -p /root/data/harbor
    
    • 1

    第五步::防火墙开放端口5000,harbor默认端口是80(这个通常需要修改),我自定义为5000。

    二、生成服务端及客户端证书

    证书用于docker CLI客户端与Harbor服务端进行通信。Harbor服务端安装需要使用域名,如果没有域名,我们在/etc/hosts里面配置一个ip和域名的解析关系即可,如:harbor.zimug.cn。毕竟在局域网内我们自己使用。

    你的服务器IP地址  harbor.zimug.cn
    
    • 1

    使用域名生成CA证书,会提示输入信息:Country Name填CN,Common Name填域名。

    openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
    
    • 1

    生成服务端证书签名请求,会提示输入信息:Country Name填CN,Common Name填域名。

    openssl req -newkey rsa:4096 -nodes -sha256 -keyout harbor.zimug.cn.key -out harbor.zimug.cn.csr
    
    • 1

    生成服务端证书

    openssl x509 -req -days 365 -in harbor.zimug.cn.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.zimug.cn.crt
    
    • 1

    我的工作目录是/root/images/harbor/harbor,最终生成的文件如下

    /root/images/harbor/harbor/ca.key   #CA私有证书
    /root/images/harbor/harbor/ca.crt   #CA证书
    /root/images/harbor/harbor/harbor.zimug.cn.key   #服务器私有证书
    /root/images/harbor/harbor/harbor.zimug.cn.csr   #服务器证书请求文件
    /root/images/harbor/harbor/ca.srl   #无用
    /root/images/harbor/harbor/harbor.zimug.cn.crt  #服务器证书
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    三、修改harbor配置文件

    harbor的配置文件里面有很多的配置内容,

    # cp ./harbor.yml.tmpl   ./harbor.yml;  #复制模板文件为正式的配置文件
    
    • 1

    harbor.yml配置文件,下文中被我添加中文注释的部分,是通常必须要修改的参数。其他的参数根据自己的需要修改:

    # harbor安装的ip地址或域名,用于访问harbor 管理界面和registry仓库服务。
    # 不能设置为 localhost or 127.0.0.1,因为Harbor需要被外部客户端访问
    hostname: 你的服务器IP地址
    
    # http 相关的配置
    http:
      # http端口, 默认是80. 如果启用了https,访问这个端口将被转发请求到https 端口
      # 这里尽量不要改,找一台80端口没被占用的服务器安装harbor,后续镜像上传打标签更加方便不用加端口(http服务默认就是80)
      port: 80
    
    # https 相关的配置
    https:
      # https port for harbor, default is 443
      port: 443
      # 配置服务端证书
      certificate: /root/images/harbor/harbor/harbor.zimug.cn.crt
      private_key: /root/images/harbor/harbor/harbor.zimug.cn.key
    
    # # Uncomment following will enable tls communication between all harbor components
    # internal_tls:
    #   # set enabled to true means internal tls is enabled
    #   enabled: true
    #   # put your cert and key files on dir
    #   dir: /etc/harbor/tls/internal
    
    # Uncomment external_url if you want to enable external proxy
    # And when it enabled the hostname will no longer used
    # external_url: https://reg.mydomain.com:8433
    
    # Harbor admin 管理员初始化密码
    # 它仅仅用于第一次安装harbor初始化登录使用
    # Harbor启动之后进入管理节面之后记得通过UI修改密码
    harbor_admin_password: Harbor12345
    
    # 安装数据库的配置
    database:
      # 数据库的root用户密码,用于生产环境必须修改为强度高的密码
      password: root123
      # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
      max_idle_conns: 100
      # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
      # Note: the default number of connections is 1024 for postgres of harbor.
      max_open_conns: 900
    
    # harbor持久化数据保存目录,上文中新建的目录
    data_volume: /root/data/harbor
    
    
    # ……
    # 后面省略了若干配置参数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    四、执行安装脚本

    执行install.shshell脚本,完成docker Harbor的安装。下面是整个脚本的执行过程的日志输出,我们来分析下harbor的安装过程都做了什么?

    # ./install.sh 
    
    [Step 0]: checking if docker is installed ...
    Note: docker version: 20.10.14
    [Step 1]: checking docker-compose is installed ...
    Note: docker-compose version: 1.29.2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Step 0:检查docker是否安装,Step 1检查docker-compose是否安装。(我的主机既安装docker compose的1.x版本,也安装了docker compose的v2版本,但是我们看到1.x版本的被识别出来了)

    [Step 2]: loading Harbor images ...
    Loaded image: goharbor/harbor-core:v2.5.0
    Loaded image: goharbor/harbor-jobservice:v2.5.0
    Loaded image: goharbor/notary-signer-photon:v2.5.0
    Loaded image: goharbor/harbor-db:v2.5.0
    Loaded image: goharbor/harbor-registryctl:v2.5.0
    Loaded image: goharbor/redis-photon:v2.5.0
    Loaded image: goharbor/harbor-portal:v2.5.0
    Loaded image: goharbor/trivy-adapter-photon:v2.5.0
    Loaded image: goharbor/nginx-photon:v2.5.0
    Loaded image: goharbor/registry-photon:v2.5.0
    Loaded image: goharbor/notary-server-photon:v2.5.0
    Loaded image: goharbor/chartmuseum-photon:v2.5.0
    Loaded image: goharbor/prepare:v2.5.0
    Loaded image: goharbor/harbor-log:v2.5.0
    Loaded image: goharbor/harbor-exporter:v2.5.0
    
    [Step 3]: preparing environment ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    第2、3步骤下载了n多的镜像(上文中我删除了大量的镜像分层下载的日志),这些镜像都是harbor的组件,整体组成了harbar,如果手工搭建工作量还是很大的,还好我们有docker compose。

    [Step 4]: preparing harbor configs ...
    prepare base dir is set to /root/images/harbor/harbor
    Generated configuration file: /config/portal/nginx.conf
    Generated configuration file: /config/log/logrotate.conf
    Generated configuration file: /config/log/rsyslog_docker.conf
    Generated configuration file: /config/nginx/nginx.conf
    Generated configuration file: /config/core/env
    Generated configuration file: /config/core/app.conf
    Generated configuration file: /config/registry/config.yml
    Generated configuration file: /config/registryctl/env
    Generated configuration file: /config/registryctl/config.yml
    Generated configuration file: /config/db/env
    Generated configuration file: /config/jobservice/env
    Generated configuration file: /config/jobservice/config.yml
    Generated and saved secret to file: /data/secret/keys/secretkey
    Successfully called func: create_root_cert
    Generated configuration file: /compose_location/docker-compose.yml
    Clean up the input dir
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    第四步,重要了!/root/images/harbor是我安装包解压的目录,即安装目录。所有的配置文件都生成到了安装目录下/root/images/harbor/barbor,如上文所示。

    [Step 5]: starting Harbor ...
    Creating network "harbor_harbor" with the default driver
    Creating harbor-log ... done
    Creating redis         ... done
    Creating registryctl   ... done
    Creating harbor-db     ... done
    Creating registry      ... done
    Creating harbor-portal ... done
    Creating harbor-core   ... done
    Creating nginx             ... done
    Creating harbor-jobservice ... done
    ✔ ----Harbor has been installed and started successfully.----
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    第5步,启动了9个容器。

    • harbor-portal:在比较旧的版本叫做admin server,harbor应用的门户即:前端web服务应用界面。本质也是nginx,用于部署前端应用。
    • harbor-core:这是Harbor的核心后端服务,主要token的发放与验证、webhook等服务及部分tpl UI界面。
    • harbor-db:harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。
    • harbor-jobservice:harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了实现镜像在仓库之间同步;
    • harbor-log:harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。
    • nginx:充当逆向代理服务网关的功能,负责流量转发和安全验证。
    • redis:缓存、session等
    • registry:registry就是docker原生的仓库,负责保存docker镜像。
    • registryctl:harbor与registry交互控制服务

    五、浏览器访问测试

    浏览器访问测试,80端口是http默认端口,所以不需要加。

    http://你的服务器ip地址
    
    • 1

    尝试用一下吧。我们可以创建一个用户叫做zimug,按照提示信息填写即可。主要是用户名密码
    在这里插入图片描述

    六、docker客户端测试

    测试完浏览器,我们再用docker客户端登陆一下试试。

    # docker login harbor.zimug.cn
    Username: admin
    Password: 
    Error response from daemon: Get "https://harbor.zimug.cn/v2/": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0
    
    • 1
    • 2
    • 3
    • 4

    报错了因为我们没有配置客户端证书,直接使用CA证书即可。

    mkdir -p /etc/docker/certs.d/harbor.zimug.cn;
    cp ./ca.crt /etc/docker/certs.d/harbor.zimug.cn/ca.crt;
    
    • 1
    • 2

    vim /etc/docker/daemon.json,修改或加上下面的一行

    {
    "insecure-registries":["harbor.zimug.cn"]
    }
    
    • 1
    • 2
    • 3

    加载配置重新启动docker守护进程

    systemctl daemon-reload && systemctl restart docker
    
    • 1

    重启docker守护进程,会导致docker compose启动的容器全部重启,因为启动顺序的原因可能会导致失败。可以用docker compose先都停掉,再启动harbor

    docker-compose stop
    docker-compose start
    
    • 1
    • 2

    再次登录测试

    # docker login harbor.zimug.cn
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    七、向Harbor推送镜像

    首先在harbor新建一个项目
    在这里插入图片描述

    # 从docker hub下载一个镜像
    docker pull busybox;
    # 为镜像打一个私有仓库的标签,格式为:仓库服务地址/项目名称/镜像名称:[TAG],TAG可以不写默认就是latest。
    docker tag busybox harbor.zimug.cn/test/busybox ;
    # 推送镜像到harbor仓库
    docker push harbor.zimug.cn/test/busybox;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    通过harbor管理界面查看一下,如下图所示推送成功。
    在这里插入图片描述

  • 相关阅读:
    Kubernetes v1.21.5部署xxl-job 2.3.1
    红队隧道应用篇之Frp内网穿透(十)
    UE4 材质学习 (06-LandscapeLayerBlend地形节点的应用例子)
    分层架构理论基础
    六、Vue基础之六
    【Vue】修饰符&表单提交方式&自定义组件
    基于el-form实现自动展开/收起的查询条件组件
    程序设计:C语言 UNIX/LINUX 环境变量替换
    主动营销和被动营销哪种外贸获客方式最有效?
    Mybatis自定义类型映射处理器
  • 原文地址:https://blog.csdn.net/hanxiaotongtong/article/details/125608193