• 使用Harbor搭建Docker仓库


    1 认识 Harbor

    1.1 Harbor 介绍

    Harbor github项目地址:https://github.com/goharbor/harbor

    Harbor是一个开源的可信云本机注册表项目,用于存储,签名和扫描内容。Harbor通过添加用户通常需要的功能(如安全性,身份和管理)来扩展开源Docker Distribution。使注册表更接近构建和运行环境可以提高图像传输效率。Harbor支持在注册表之间复制映像,还提供用户管理,访问控制和活动审计等高级安全功能

    1.2 Harbor 特征

    云本机注册表:Harbor 支持容器映像和Helm图表,可用作云本机环境(如容器运行时和业务流程平台)的注册表。

    基于角色的访问控制:用户和存储库通过“项目”进行组织,用户可以对项目下的图像拥有不同的权限。

    基于策略的映像复制:可以基于具有多个过滤器(存储库,标记和标签)的策略在多个注册表实例之间复制(同步)映像。如果遇到任何错误,Harbor将自动重试进行复制。非常适合负载平衡,高可用性,多数据中心,混合和多云场景。

    漏洞扫描:Harbor定期扫描图像并警告用户漏洞。

    LDAP / AD支持:Harbor与现有企业LDAP / AD集成以进行用户身份验证和管理,并支持将LDAP组导入Harbor并为其分配适当的项目角色。

    图像删除和垃圾收集:可以删除图像,并可以回收它们的空间。

    公证:可以确保图像的真实性。

    图形用户门户:用户可以轻松浏览,搜索存储库和管理项目。

    审计:跟踪存储库的所有操作。

    RESTful API:适用于大多数管理操作的RESTful API,易于与外部系统集成。

    易于部署:提供在线和离线安装程序。

    1.3 harbor 配置参数

    1.3.1 参数介绍

    ① 配置参数位于文件harbor.yml中;
    ② 在harbor.yml中有两类参数,必需参数和可选参数。

    • 必需(required)参数:需要在配置文件中设置这些参数。如果用户更新harbor.yml并运行install.sh脚本以重新安装Harbor,harbor.yml将会生效;
    • 可选参数:这些参数对于更新是可选的,用户可以将这部分参数保留为默认值,并在启动Harbor后在Web Portal上更新这部分参数。如果它们已经启用harbor.yml,则这些参数只会在首次启动Harbor时生效。harbor.yml将忽略对这些参数的后续更新。

    ③ 注意:如果您选择通过Portal设置这些参数,请务必在Harbor启动后立即执行此操作。特别是必须在Harbor中注册或创建任何新用户之前设置所需的auth_mode,当系统中有用户时(除默认管理员用户外),无法更改auth_mode;
    ④ 请注意至少需要更改hostname属性(指定harbor仓库域名)。

    1.3.2 必需参数

    hostname:目标主机的主机名,用于访问Portal和注册表服务。它应该是目标计算机的IP地址或完全限定的域名(FQDN),例如,192.168.1.10或reg.yourdomain.com。不要使用localhost或127.0.0.1作为主机名 - 外部客户端需要访问注册表服务

    ui_url_protocol:http或https,默认为http,用于指定访问Portal和令牌/通知服务的协议。如果启用了公证,则此参数必须为https。默认情况下,这是http。要设置https协议,请参阅使用HTTPS访问配置Harbor。

    db_password:用于db_auth的PostgreSQL数据库的root密码。更改此密码以用于任何生产用途

    max_job_workers :(默认值为10)作业服务中的最大复制工作者数。对于每个映像复制作业,工作程序将存储库的所有标记同步到远程目标。增加此数量可以在系统中实现更多并发复制作业。但是,由于每个工作者都消耗一定量的网络/ CPU / IO资源,请根据主机的硬件资源仔细选择该属性的值。

    customize_crt:(on or off. Default is on),如果此属性on,在准备脚本创建注册表的令牌生成/验证私钥和根证书。当外部源提供密钥和根证书时,将此属性设置为off。有关详细信息,请参阅自定义密钥和港口令牌服务证书。

    ssl_cert:SSL证书的路径,仅在协议设置为https时应用。

    ssl_cert_key:SSL密钥的路径,仅在协议设置为https时应用。

    secretkey_path:用于加密或解密复制策略中远程注册表密码的密钥路径。

    log_rotate_count:设置日志文件在被删除之前会被轮换次数。如果count为0,则删除旧版本而不是旋转。

    log_rotate_size:仅当日志文件大于log_rotate_size字节时才会轮换日志文件。如果大小后跟k,则假定大小以千字节为单位。如果使用M,则大小以兆字节为单位,如果使用G,则大小为千兆字节。尺寸100,尺寸100k,尺寸100M和尺寸100G都是有效的。

    http_proxy:为Clair配置http代理,例如http://my.proxy.com:3128。

    https_proxy:为Clair配置https代理,例如http://my.proxy.com:3128。

    no_proxy:为Clair配置无代理,例如127.0.0.1,localhost,core,registry。

    1.3.3 可选参数

    电子邮件设置:Harbor需要这些参数才能向用户发送“密码重置”电子邮件,并且仅在需要该功能时才需要。另外,请注意,在默认情况下SSL连接时没有启用-如果你的SMTP服务器需要SSL,但不支持STARTTLS,那么你应该通过设置启用SSL email_ssl = TRUE。如果电子邮件服务器使用自签名证书或不受信任证书,则设置
    email_insecure = true
    email_server = smtp.mydomain.com
    email_server_port = 25
    email_identity =
    email_username = sample_admin@mydomain.com
    email_password = abc
    email_from = admin sample_admin@mydomain.com
    email_ssl = false
    email_insecure = false

    harbor_admin_password:管理员的初始密码。此密码仅在Harbor首次启动时生效。之后,将忽略此设置,并且应在Portal中设置管理员密码。请注意,默认用户名/密码为admin / Harbor12345

    auth_mode:使用的身份验证类型。默认情况下,它是db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为ldap_auth。重要信息:从现有Harbor实例升级时,必须确保在启动新版本的Harbor之前auth_mode相同harbor.yml。否则,用户可能无法在升级后登录。

    ldap_url:LDAP端点URL(例如ldaps://ldap.mydomain.com)。 仅在auth_mode设置为
    ldap_auth时使用。

    ldap_searchdn:具有搜索LDAP / AD服务器权限的用户的DN(例如
    uid=admin,ou=people,dc=mydomain,dc=com)。

    ldap_search_pwd:ldap_searchdn指定的用户密码。
    ldap_basedn:查找用户的基本DN,例如ou=people,dc=mydomain,dc=com,仅在auth_mode
    设置为ldap_auth时使用。

    ldap_filter:用于查找用户的搜索过滤器,例如(objectClass=person)。

    ldap_uid:用于在LDAP搜索期间匹配用户的属性,它可以是uid,cn,email或其他属性。

    ldap_scope:搜索用户的范围,0-LDAP_SCOPE_BASE,1-LDAP_SCOPE_ONELEVEL,2-
    LDAP_SCOPE_SUBTREE。默认值为2。

    ldap_timeout:连接LDAP服务器时超时(以秒为单位)。默认值为5。

    ldap_verify_cert:验证来自LDAP服务器的证书。默认为true。

    ldap_group_basedn:在LDAP / AD中查找组的基本dn,例如
    ou=group,dc=mydomain,dc=com。

    ldap_group_filter:搜索LDAP / AD组的过滤器,例如objectclass=group。

    ldap_group_gid:用于命名LDAP / AD组的属性,它可以是cn,name。

    ldap_group_scope:搜索ldap组的范围。0-LDAP_SCOPE_BASE,1-LDAP_SCOPE_ONELEVEL,2-
    LDAP_SCOPE_SUBTREE。默认值为2。

    self_registration:启用/禁用用户注册他/她自己的能力,默认启用。禁用时,新用户只能由管理员用户创建,只有管理员用户可以在Harbor中创建新用户。 注意:当auth_mode设置为ldap_auth时,始终禁用自注册功能,并忽略此标志。

    token_expiration:令牌服务创建的令牌的到期时间(以分钟为单位),默认为30分钟。

    project_creation_restriction:用于控制用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目,设置为“adminonly”,这样只有管理员才能创建项目。

    1.3.4 配置存储后端(可选)

    默认情况下,Harbor将图像存储在本地文件系统中。在生产环境中,您可以考虑使用其他存储后端,而不是本地文件系统,如S3,OpenStack Swift,Ceph等。这些参数是注册表的配置。

    registry_storage_provider_name:注册表的存储提供程序名称,可以是filesystem,s3,gcs,azure等。默认为filesystem。

    registry_storage_provider_config:存储提供程序配置的逗号分隔“key:value”对,例如“key1:value,key2:value2”。默认为空字符串。

    registry_custom_ca_bundle:自定义根ca证书的路径,它将注入到注册表和图表存储库容器的信任库中。当用户使用自签名证书托管内部存储时,通常需要这样做。

    例如,如果使用Openstack Swift作为存储后端,则参数可能如下所示:

    registry_storage_provider_name = swift
    registry_storage_provider_config = “ username:admin,password:ADMIN_PASS,
    authurl:http:// keystone_addr:35357 / v3 / aut
    
    • 1
    • 2
    • 3

    注意:有关注册表存储后端的详细信息,请参阅“注册表配置参考”

    注册表配置参考链接:https://docs.docker.com/registry/configuration/

    2 安装 Harbor

    2.1 安装docker编排工具 Docker-Compose

    [root@johnnyg03 ~]# yum install https://rpmfind.net/linux/epel/7/x86_64/Packages/d/docker-compose-1.18.0-4.el7.noarch.rpm -y
    
    [root@johnnyg03 ~]# docker-compose version 
    docker-compose version 1.18.0, build 8dd22a9
    docker-py version: 2.6.1
    CPython version: 3.6.8
    OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2 安装搭建Harbor

    2.2.1 下载Harbor安装包

    [root@johnnyg03 ~]# wget -c https://github.com/goharbor/harbor/releases/download/v2.4.1/harbor-offline-installer-v2.4.1.tgz
    
    [root@johnnyg03 ~]# ll harbor-offline-installer-v2.4.1.tgz 
    -rw-rw-rw- 1 root root 612698835 Aug  5 20:06 harbor-offline-installer-v2.4.1.tgz
    
    • 1
    • 2
    • 3
    • 4
    //解压至/usr/local
    [root@johnnyg03 ~]# tar xf harbor-offline-installer-v2.4.1.tgz -C /usr/local/
    
    • 1
    • 2
    [root@johnnyg03 ~]# cd /usr/local/harbor/
    [root@johnnyg03 harbor]# ll
    total 601612
    -rw-r--r-- 1 root root      3361 Dec 16  2021 common.sh
    -rw-r--r-- 1 root root 616006217 Dec 16  2021 harbor.v2.4.1.tar.gz
    -rw-r--r-- 1 root root      8999 Dec 16  2021 harbor.yml.tmpl
    -rwxr-xr-x 1 root root      2500 Dec 16  2021 install.sh
    -rw-r--r-- 1 root root     11347 Dec 16  2021 LICENSE
    -rwxr-xr-x 1 root root      1881 Dec 16  2021 prepare
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.2.2 配置Harbor服务

    [root@johnnyg03 harbor]# cp harbor.yml.tmpl harbor.yml
    
    • 1
    [root@johnnyg03 harbor]# vim harbor.yml
    hostname: johnnyg.openlab.com
    //下方此部分如果不进行加密直接注释,否则报错
    #https:
    #  # https port for harbor, default is 443
    #  port: 443
    #  # The path of cert and key files for nginx
    #  certificate: /your/certificate/path
    #  private_key: /your/private/key/path
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    [root@johnnyg03 harbor]# vim /etc/hosts
    http://1.13.249.218/ johnnyg.openlab.com
    
    • 1
    • 2
    //安装部署启动Harbor
    [root@johnnyg03 harbor]# ./install.sh
    
    • 1
    • 2
    //可以看到Harbor自动开启很多容器服务
    [root@johnnyg03 harbor]# docker ps -a
    CONTAINER ID   IMAGE                                COMMAND                  CREATED         STATUS                   PORTS                                   NAMES
    353ed74e8e2c   goharbor/harbor-jobservice:v2.4.1    "/harbor/entrypoint.…"   7 minutes ago   Up 7 minutes (healthy)                                           harbor-jobservice
    ec2bb70608b7   goharbor/nginx-photon:v2.4.1         "nginx -g 'daemon of…"   7 minutes ago   Up 7 minutes (healthy)   0.0.0.0:80->8080/tcp, :::80->8080/tcp   nginx
    9abb3e3d5be1   goharbor/harbor-core:v2.4.1          "/harbor/entrypoint.…"   7 minutes ago   Up 7 minutes (healthy)                                           harbor-core
    cb8d47180da9   goharbor/registry-photon:v2.4.1      "/home/harbor/entryp…"   7 minutes ago   Up 7 minutes (healthy)                                           registry
    5dd93394f575   goharbor/harbor-portal:v2.4.1        "nginx -g 'daemon of…"   7 minutes ago   Up 7 minutes (healthy)                                           harbor-portal
    e24e310d7fc8   goharbor/redis-photon:v2.4.1         "redis-server /etc/r…"   7 minutes ago   Up 7 minutes (healthy)                                           redis
    c036675029b0   goharbor/harbor-db:v2.4.1            "/docker-entrypoint.…"   7 minutes ago   Up 7 minutes (healthy)                                           harbor-db
    04a7e8bc22de   goharbor/harbor-registryctl:v2.4.1   "/home/harbor/start.…"   7 minutes ago   Up 7 minutes (healthy)                                           registryctl
    ab95148a1d28   goharbor/harbor-log:v2.4.1           "/bin/sh -c /usr/loc…"   7 minutes ago   Up 7 minutes (healthy)   127.0.0.1:1514->10514/tcp               harbor-log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3 使用 Harbor

    3.1 登录

    user:admin(默认)
    password:Harbor12345(默认)
    在这里插入图片描述
    在这里插入图片描述

    3.2 用户管理

    在这里插入图片描述
    在这里插入图片描述

    3.3 新建项目

    【注:此处访问级别默认为私有(不勾选公开)表示上传下载镜像均需要进行登录认证,如果勾选公开表示为公有,上传下载镜像无需登录认证】
    在这里插入图片描述

    3.4 项目管理

    点击下图中红框处进入项目管理页面
    请添加图片描述
    点击下图中红框处添加成员
    请添加图片描述
    在这里插入图片描述
    在这里插入图片描述

    3.5 上传下载镜像到 Harbor 仓库

    //修改docker的daemon.json守护进程文件
    [root@johnnyg03 harbor]# vim /etc/docker/daemon.json 
    {
      "registry-mirrors": ["https://registry.docker-cn.com"],
      "insecure-registries": ["10.0.2.12:5000"],
      "insecure-registries": ["johnnyg.openlab.com"]		//添加此行为harbor仓库域名(允许使用http访问)
    }
    [root@johnnyg03 harbor]# systemctl restart docker
    //重启docker之后,所有容器自动关闭,需要重启
    [root@johnnyg03 harbor]# docker start `docker ps -aq`
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    //为需要上传仓库的镜像打标签(标签名:仓库地址/镜像名:版本)
    [root@johnnyg03 harbor]# docker tag busybox:latest johnnyg.openlab.com/demo/busybox:latest
    [root@johnnyg03 harbor]# docker tag nginx:latest johnnyg.openlab.com/demo/nginx:latest
    [root@johnnyg03 harbor]# docker images
    REPOSITORY                         TAG       IMAGE ID       CREATED        SIZE
    johnnyg.openlab.com/demo/busybox   latest    beae173ccac6   7 months ago   1.24MB
    johnnyg.openlab.com/demo/nginx     latest    605c77e624dd   7 months ago   141MB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    //由于在创建仓库项目时选择了私有仓库,因此需要进行认证
    //登录所使用的账号可以是仓库默认管理员admin & 自创账户
    //此处使用默认管理员admin登录
    [root@johnnyg03 harbor]# docker login johnnyg.openlab.com
    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
    • 9
    • 10
    • 11
    //上传镜像至harbor仓库
    [root@johnnyg03 harbor]# docker push johnnyg.openlab.com/demo/busybox:latest
    The push refers to repository [johnnyg.openlab.com/demo/busybox]
    01fd6df81c8e: Pushed 
    latest: digest: sha256:62ffc2ed7554e4c6d360bce40bbcf196573dd27c4ce080641a2c59867e732dee size: 527
    
    • 1
    • 2
    • 3
    • 4
    • 5
    //测试使用自创账户tom登录
    [root@johnnyg03 harbor]# docker login johnnyg.openlab.com
    Username: tom
    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
    • 9
    • 10
    //使用自创账户tom上传镜像至harbor仓库
    [root@johnnyg03 harbor]# docker push johnnyg.openlab.com/demo/nginx:latest
    The push refers to repository [johnnyg.openlab.com/demo/nginx]
    d874fd2bc83b: Layer already exists 
    32ce5f6a5106: Layer already exists 
    f1db227348d0: Layer already exists 
    b8d6e692a25e: Layer already exists 
    e379e8aedd4d: Layer already exists 
    2edcec3590a4: Layer already exists 
    latest: digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 size: 1570
    //可见上传成功
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    从下图可见,刚刚使用默认管理员admin & 自创账户tom上传的镜像均已存在(在harbor仓库demo项目中显示)
    在这里插入图片描述

  • 相关阅读:
    【裴蜀定理】CF1055C Lucky Days
    这些Java基础知识,诸佬们都还记得嘛(学习,复习,面试都可)
    js的indexOf方法
    (66)MIPI DSI LLP介绍(六)
    如何让自己的SpringBoot程序在Windows环境下打包运行?
    小白入门深度学习 | 6-6:Inception v3 算法原理
    解决方案 | 电子签让公共事业服务更便捷
    【ShardingSphere-proxy +PostgreSQL实现读写分离(静态策略)】
    MySqL速成教程笔记系列八
    迁移学习是什么?
  • 原文地址:https://blog.csdn.net/JohnnyG2000/article/details/126293571