• Harbor高可用集群设计及部署(基于离线安装方式)


    一、环境说明

    1.1 架构图

    【架构解析】:将Harbor的redis缓存组件、PostgreSQL数据库组件迁移到系统外部做高可用,使用外部共享存储实现多个Harbor实例的数据共享,Harbor实例可横向扩展。

    1.2 主机清单

    IP地址主机名描述
    192.168.2.107harbor1Harbor实例1,8021端口
    192.168.2.108harbor2Harbor实例2,8021端口
    192.168.2.110harbor-data部署Harbor实例的共享存储、外部数据库、外部缓存服务
    192.168.2.111/负载均衡VIP,8121端口

    二、主机初始化

    Harbor实例进行初始化

    • 安装docker

    • 安装docker-compose

    • 配置内核参数

    2.1 安装docker

    1. $ wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    2. $ yum install -y docker-ce
    3. $ systemctl enable --now docker
    4. $ systemctl status docker
    5. $ cat < /etc/docker/daemon.json
    6. {
    7. "registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],
    8. "exec-opts": ["native.cgroupdriver=systemd"],
    9. "registry-mirrors": ["https://3hjcmqfe.mirror.aliyuncs.com"],
    10. "log-driver": "json-file",
    11. "log-opts": {
    12. "max-size": "500m",
    13. "max-file": "2"
    14. }
    15. }
    16. EOF
    17. $ systemctl daemon-reload
    18. $ systemctl restart docker

    exec-opts": ["native.cgroupdriver=systemd"],     #驱动器 registry-mirrors: 镜像加速地址,可多个 max-file: log最多保留数量 live-restore: 重启docker不重启容器,多用于k8s上

    2.2 安装docker-compose

    安装docker-compose 1.18.0以上的版本,本处安装v2.2.3版本。

    1. $ wget https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64
    2. $ mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
    3. $ chmod +x /usr/local/bin/docker-compose
    4. $ docker-compose version
    5. Docker Compose version v2.2.3

    2.3 配置内核参数

    1. $ modprobe br_netfilter
    2. $ cat >> /etc/sysctl.conf << EOF
    3. net.bridge.bridge-nf-call-ip6tables = 1
    4. net.bridge.bridge-nf-call-iptables = 1
    5. net.ipv4.ip_forward = 1 #路由转发
    6. EOF
    7. $ sysctl -p

    三、使用NFS提供外部共享存储

    192.168.2.110部署NFS服务提供共享存储给Harbor1实例、Harbor2实例使用。192.168.2.110作为NFS服务端,harbor实例为客户端。

    3.1 部署NFS服务端

    1)安装并启动nfs

    1. $ yum install -y nfs-utils
    2. $ systemctl start nfs && systemctl enable nfs && systemctl status nfs
    3. $ chkconfig nfs on #设置为开机自启

    2)创建共享目录

    客户端的数据将远程存入到共享目录下。

    $ mkdir -p /data/harbor_data

    3)修改配置

    1. $ cat /etc/exports
    2. /data/harbor_data 192.168.2.0/24(rw,no_root_squash) #允许哪个网段的客户端使用指定共享目录
    3. $ exportfs -arv #使配置文件生效
    4. exporting 192.168.2.0/24:/data/harbor_data

    4)重启nfs服务

    $ systemctl restart nfs 

    5)检查共享目录信息

    1. $ showmount -e localhost
    2. export list for localhost:
    3. /data/harbor_data

    3.2 部署客户端

    在harbor1和harbor2上操作

    1. yum -y install nfs-utils
    2. systemctl start nfs-utils &&  systemctl enable nfs-utils && systemctl status  nfs-utils

    3.3 客户端挂载NFS共享存储

    在harbor1和harbor2节点操作,创建实例的存储目录,然后挂载到NFS。

    1. mkdir -p /data/harbor_data 
    2. cat <<EOF >> /etc/fstab
    3. 192.168.2.110:/data/harbor_data /data/harbor_data nfs  defaults  0 0
    4. EOF 
    5. $ mount -a

    挂载格式:NFSIP:共享目录   本地目录  nfs defaults 0 0

    • 测试是否可以正常使用:

    1. [root@harbor2 ~]# touch  /data/harbor_data/test.txt 
    2. [root@harbor1 ~]# ls /data/harbor_data/
    3. test.txt

    四、部署Redis缓存服务(源码)

    本处为演示环境,实际生产环境请对Redis服务做高可用数据备份

    192.168.2.110部署Redis缓存服务,为harbor1harbor2实例提供外部redis缓存服务。

    4.1 下载安装包

    1. wget https://download.redis.io/releases/redis-6.2.7.tar.gz

    4.2 安装依赖包

    $ yum  install  -y  gcc  gcc-c++
    

    4.3 源码编译

    1. mkdir -p /app/
    2. tar zxvf  redis-6.2.7.tar.gz  -C /app
    3. cd /app/redis-6.2.7/
    4. make   #编译
    5. make  install   #安装

    4.4 修改配置文件

    redis默认只支持本地使用,本处需要修改几个参数:

    • 外部可连接;

    • redis启动方式;

    • redis远程连接密码;

    1. $ vim  /app/redis-6.2.7/redis.conf 
    2. #bind 127.0.0.1 -::1  #75行,注释掉bind的行,允许任何主机连接;
    3. daemonize yes       #259行,将no修改为yes,使redis可以使用守护进程方式启动;
    4. requirepass lidabai666   #903行,设置redis连接的auth密码(lidabai666)

    4.5 启动Redis服务

    前面配置了使用守护进程方式启动,所以直接使用systemctl则可以启动redis服务。

    1. pwd
    2. /app/redis-6.2.7
    3. redis-server redis.conf

    4.6 服务验证

    1)查看Redis服务版本

    1. redis-cli -v
    2. redis-cli 6.2.7

    2)查看端口

    redis默认监听6379端口

    1. $ ps aux | grep  6379
    2. root  6200  0.1  0.2 162416 10020 ?  Ssl 17:59  0:00 redis-server *:6379
    3. root  6231  0.0  0.0 112720  984 pts/0  R+  18:01  0:00 grep --color=auto 6379

    3)客户端连接Redis

    harbor1harbor2作为redis客户端

    1. which redis-cli      #查看redis-cli工具位置
    2. /usr/local/bin/redis-cli
    3. [root@harbor-data redis-6.2.7]# scp /usr/local/bin/redis-cli  192.168.2.107:/usr/local/bin/
    4. [root@harbor-data redis-6.2.7]# scp /usr/local/bin/redis-cli  192.168.2.108:/usr/local/bin/

    客户端使用redis-cli工具连接Redis服务器

    [root@harbor1 ~]# redis-cli  -h 192.168.2.110 -p 6379 -a lidabai666
    

    -a 参数指定redis连接密码

    五、部署PostgreSQL外部存储服务(源码)

    192.168.2.110主机以源码的方式安装PostgreSQL数据库服务,为harbor1和harbor2实例提供共享存储。

    5.1 新建postgres用户

    默认超级用户(root)不能启动postgresql,需要手动建用户postgres。

    1. useradd postgres
    2. id postgres
    3. uid=1000(postgres) gid=1000(postgres) 组=1000(postgres)

    5.2 安装依赖包

    yum -y install readline-devel  zlib-devel  gcc zlib
    

    5.3 下载解压源码包

    1. wget https://ftp.postgresql.org/pub/source/v13.5/postgresql-13.5.tar.gz --no-check-certificate
    2. tar zxvf postgresql-13.5.tar.gz   -C  /app/

    5.4 编译安装

    1. cd /app/postgresql-13.5/
    2. $ ./configure  --prefix=/usr/local/postgresql
    3. $ make && make install

    5.5 创建数据目录

    1. $ mkdir -p /data/postgresql/data
    2. $ chown -R postgres:postgres /usr/local/postgresql/
    3. $ chown -R postgres:postgres /data/postgresql/data/

    5.6 设置postgres环境变量

    1. [root@harbor-data postgresql-13.5]# su  - postgres
    2. [postgres@harbor-data ~]$ vim + .bash_profile
    3. PGHOME=/usr/local/postgresql   #psql安装目录
    4. export PGHOME
    5. PGDATA=/data/postgresql/data    #数据库目录
    6. export PGDATA
    7. PATH=$PATH:$HOME/bin:$HOME/.local/bin:$PGHOME/bin
    8. export PATH
    9. [postgres@harbor-data ~]$ source ./.bash_profile
    10. [postgres@harbor-data ~]$ which psql
    11. /usr/local/postgresql/bin/psql

    查看版本 [postgres@harbor-data ~]$ psql -V psql (PostgreSQL) 13.5

    5.7 初始化数据库

    由于 Red Hat 系列发行版的政策,PostgreSQL 安装不会启用自动启动或自动初始化数据库。要完成数据库安装,您需要根据您的发行版执行以下步骤:

    1. [postgres@ceph3 ~]$ initdb
    2. ......
    3. You can change this by editing pg_hba.conf or using the option -A, or
    4. --auth-local and --auth-host, the next time you run initdb.
    5. Success. You can now start the database server using:    #表示初始化成功
    6.     pg_ctl -D /data/postgresql/data -l logfile start

    5.8 启动PostgreSQL

    根据刚才初始化成功后的提示执行启动命令!

    1. [postgres@harbor-data ~]$ pg_ctl -D /data/postgresql/data -l logfile start
    2. waiting for server to start.... done
    3. server started

    5.9 设置(修改)Postgresql密码

    默认psql本地登录是不需要密码的,即使我们设置了密码,也不需要密码就能登录。应为配置文件pg_hba.conf中的local设置为trust , 为了安全我们修改为 password,就是使用密码才能登陆,(当我们忘记密码的时间,也可以使用这用方式,先设置为trust之后,修改密码,然后在设置为password。)

    1. [postgres@harbor-data ~]$ psql
    2. psql (13.5)
    3. Type "help" for help.
    4. postgres=# \password    
    5. Enter new password:     #输入设置的密码 Lidabai666
    6. Enter it again:      #确认密码(再次输入)
    7. postgres=# \q    #退出

    5.10  设置可远程登录PostgreSQL

    1. [postgres@harbor-data ~]$ vim /data/postgresql/data/postgresql.conf
    2. listen_addresses = '*'    #60行,监听所有地址
    3. [postgres@harbor-data ~]$ vim + /data/postgresql/data/pg_hba.conf
    4. local   all             all                                 password
    5. host    all             all             0.0.0.0/0            password
    6. host    all             all             ::1/128             password

    5.10 重启PostgreSQL

    1. $ pg_ctl -D /data/postgresql/data -l /data/postgresql/data/postgres.log restartwaiting for server to shut down.... done
    2. server stopped
    3. waiting for server to start.... done
    4. server started

    5.11 创建数据库

    Harbor 2.3.5需要创建的数据库:

    • notaryserver

    • notarysigner

    • registry

    目前Harbor仅支持PostgraSQL数据库,需要手动在外部的PostgreSQL上创建registry、notary_signer、notary_servers三个数据库,Harbor启动时会自动在对应数据库下生成表。

    因为本处主要是演示环境,PostgreSQL数据库的用户就以超级管理员postgres为例,如果是生产环境,建议新建用户,并授予harbor、notary_signer、notary_servers三个数据库相对应的权限。

    1. [postgres@harbor-data ~]$ psql
    2. Password for user postgres: #输入密码
    3. postgres=# create database registry;
    4. CREATE DATABASE
    5. postgres=# create database notary_signer;
    6. CREATE DATABASE
    7. postgres=# create database notary_servers;
    8. CREATE DATABASE
    9. postgres=# \l

    5.12 创建用户

    1. postgres=create user server with password 'lidabai666';
    2. CREATE ROLE
    3. postgres=create user signer with password 'lidabai666';
    4. CREATE ROLE
    5. postgres=# \du

    六、负载均衡设置(Nginx + Keepalived)

    使用keepalived和Nginx实现harbor的高可用。在harbor1harbor2节点上安装keepalived服务来提供VIP实现负载均衡。Nginx服务则实现将来到VIP的请求转发到后端服务器组harbor

    6.1 安装nginx和keepalived

    在harbor1和harbor2操作

    1. $ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    2. $ yum install -y nginx keepalived
    3. $ yum -y install nginx-all-modules.noarch     #安装nginx的stream模块

    nginx从1.9.0开始新增了steam模块,用来实现四层协议的转发、代理、负载均衡等。二进制安装的nginx则在./configure时添加--with-stream参数来安装stream模块。

    6.2 修改nginx配置文件

    在harbor1和harbor2的Nginx服务配置文件一样。
    1. $ vim /etc/nginx/nginx.conf
    2. user nginx;
    3. worker_processes auto;   #自动设置nginx的工作进程数量
    4. error_log /var/log/nginx/error.log;
    5. pid /run/nginx.pid;
    6. include /usr/share/nginx/modules/*.conf;
    7. events {
    8.     worker_connections 1024;   #工作进程的连接数
    9. }
    10. # 四层负载均衡,为两台harbor提供负载均衡
    11. stream {
    12.     log_format  main  '$remote_addr $upstream_addr - [$time_local$status $upstream_bytes_sent';
    13.     access_log  /var/log/nginx/harbor-access.log  main;
    14.     upstream harbor{
    15.        server 192.168.2.107:8021;   # harbor1
    16.        server 192.168.2.108:8021;   # harbor2
    17.     }
    18.     server {
    19.        listen  8121;  #由于nginx与harbor节点复用,这个监听端口不能是8021,否则会冲突
    20.        proxy_pass harbor;
    21.     }
    22. }
    23. http {
    24.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    25.                       '$status $body_bytes_sent "$http_referer" '
    26.                       '"$http_user_agent" "$http_x_forwarded_for"';
    27.     access_log  /var/log/nginx/access.log  main;
    28.     sendfile            on;
    29.     tcp_nopush          on;
    30.     tcp_nodelay         on;
    31.     keepalive_timeout   65;
    32.     types_hash_max_size 2048;
    33.     include             /etc/nginx/mime.types;
    34.     default_type        application/octet-stream;
    35.     server {
    36.         listen       80 default_server;
    37.         server_name  _;
    38.         location / {
    39.         }
    40.     }
    41. }

    检测nginx配置文件语法

    1. $ nginx -t
    2. nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    3. nginx: configuration file /etc/nginx/nginx.conf test is successful

    6.3 修改keepalived配置

    本处以harbor1为keepalived服务的主节点,harbor2为keepalived的备节点。主备节点的keepalived配置文件不一样。

    1)主节点(harbor1)

    1. [root@harbor1 ~]# cat  /etc/keepalived/keepalived.conf
    2. ! Configuration File for keepalived
    3. global_defs {
    4.    notification_email {
    5.      859281177@qq.com
    6.    }
    7.    router_id master1
    8. }
    9. vrrp_instance lidabai {
    10.     state MASTER
    11.     interface ens33
    12.     mcast_src_ip:192.168.2.107
    13.     virtual_router_id 107
    14.     priority 100
    15.     advert_int 1
    16.     nopreempt
    17.     authentication {
    18.         auth_type PASS
    19.         auth_pass 1111
    20.     }
    21.     virtual_ipaddress {
    22.         192.168.2.111/24  #虚拟VIP地址
    23.     }
    24.     track_script {
    25.         chk_nginx
    26.     }
    27. }
    28. ##### 健康检查
    29. vrrp_script chk_nginx {      
    30.     script "/etc/keepalived/check_nginx.sh"
    31.     interval 2
    32.     weight -20
    33. }

    2)备节点(harbor2)

    1. [root@harbor2 ~]# cat  /etc/keepalived/keepalived.conf 
    2. ! Configuration File for keepalived
    3. global_defs {
    4.    notification_email {
    5.      859281177@qq.com
    6.    }
    7.    router_id master2
    8. }
    9. vrrp_instance lidabai {
    10.     state BACKUP
    11.     interface ens33
    12.     mcast_src_ip:192.168.2.108
    13.     virtual_router_id 107
    14.     priority 80    #权重
    15.     advert_int 1
    16.     nopreempt
    17.     authentication {
    18.         auth_type PASS
    19.         auth_pass 1111
    20.     }
    21.     virtual_ipaddress {
    22.         192.168.2.111/24
    23.     }
    24.     track_script {
    25.     chk_nginx
    26.     }
    27. }
    28. vrrp_script chk_nginx {
    29.   script "/etc/keepalived/check_nginx.sh"
    30.   interval 2
    31.   weight -20
    32. }

    6.4 编写健康检查脚本

    在主备节点(harbor1和harbor2)同样操作。
    1. $ vim /etc/keepalived/check_nginx.sh 
    2. #!/bin/bash
    3. #1、判断Nginx是否存活
    4. counter=`ps -C nginx --no-header | wc -l`
    5. if [ $counter -eq 0 ]; then
    6.     #2、如果不存活则尝试启动Nginx
    7.     service nginx start
    8.     sleep 2
    9.     #3、等待2秒后再次获取一次Nginx状态
    10.     counter=`ps -C nginx --no-header | wc -l`
    11.     #4、再次进行判断,如Nginx还不存活则停止Keepalived,让地址进行漂移
    12.     if [ $counter -eq 0 ]; then
    13.         service  keepalived stop
    14.     fi
    15. fi
    16. chmod +x /etc/keepalived/check_nginx.sh 

    6.5 启动服务

    先启动master1和master2节点上的nginx服务,再启动keepalived服务

    1)启动nginx服务

    1. [root@harbor1 ~]# systemctl enable --now nginx   #启动nginx服务并设置开机自启
    2. [root@harbor2 ~]# systemctl enable --now nginx
    3. [root@harbor1 ~]# systemctl status nginx.service 
    4. [root@harbor2 ~]# systemctl status nginx.service

    2)启动keepalived服务

    1. [root@harbor1 ~]# systemctl enable --now keepalived
    2. [root@harbor2 ~]# systemctl enable --now keepalived
    3. [root@harbor1 ~]# systemctl status keepalived.service
    4. [root@harbor2 ~]# systemctl status keepalived.service

    6.6 查看VIP

    在harbor1节点查看VIP是否成功绑定。
    1. [root@harbor1 ~]# ip addr
    2. ......
    3. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    4.     link/ether 00:0c:29:f1:a3:65 brd ff:ff:ff:ff:ff:ff
    5.     inet 192.168.2.107/24 brd 192.168.2.255 scope global noprefixroute ens33
    6.        valid_lft forever preferred_lft forever
    7.     inet 192.168.2.111/24 scope global secondary ens33     #VIP地址
    8.        valid_lft forever preferred_lft forever
    9.     inet6 fe80::80b0:1d7f:b5d4:19e8/64 scope link tentative dadfailed 
    10. ......

    通过ifconfig是无法查看到VIP的,通过hostname -I命令也可以查看到VIP。

    七、部署Harbor实例1

    在harbor1 192.168.2.107主机上部署harbor服务

    7.1 下载解压离线安装包

    1. mkdir /app   #创建安装目录
    2. wget https://github.com/goharbor/harbor/releases/download/v2.3.5/harbor-offline-installer-v2.3.5.tgz
    3. tar zxvf harbor-offline-installer-v2.3.5.tgz  -C  /app/

    7.2 修改配置文件

    将配置文件模板复制为配置文件,然后修改对应参数。

    1. [root@harbor1 ~]# cd /app/harbor/
    2. [root@harbor1 harbor]# cp harbor.yml.tmpl  harbor.yml
    3. [root@harbor1 harbor]# vim harbor.yml
    4. hostname: 192.168.2.107
    5. http:
    6.   port: 8021
    7. #取消https安全加密访问方式:
    8. #https:
    9. #  port: 443
    10. #  certificate: /your/certificate/path
    11. #  private_key: /your/private/key/path
    12. ## 启用外部代理,启用后hostname将不再使用
    13. external_url: http:192.168.2.111:8121
    14. ## 配置共享存储,即挂载的NFS目录
    15. data_volume: /data/harbor_data
    16. _version: 2.3.0
    17. ## 配置外部数据库
    18. external_database:
    19.    harbor:
    20.      host: 192.168.2.110   # 数据库主机地址
    21.      port: 5432    # 数据库端口
    22.      db_name: registry    # 数据库名称
    23.      username: postgres   # 连接该数据库的用户名
    24.      password: Lidabai666   # 连接数据库的密码
    25.      ssl_mode: disable
    26.      max_idle_conns: 2
    27.      max_open_conns: 0
    28.    notary_signer:   
    29.      host: 192.168.2.110
    30.      port: 5432
    31.      db_name: notary_signer
    32.      username: postgres
    33.      password: Lidabai666
    34.      ssl_mode: disable
    35.    notary_server:
    36.      host: 192.168.2.110
    37.      port: 5432
    38.      db_name: notary_server
    39.      username: postgres
    40.      password: Lidabai666
    41.      ssl_mode: disable
    42. ##配置外部Redis实例:
    43. external_redis:      
    44.    host: 192.168.2.110:6379   #redis服务IP地址和端口号。如果redis是哨兵模式,这里应该是host_sentinel1:port_sentinel1,host_sentinel2:port_sentinel2
    45.    password:  lidabai666  #连接外部redis服务的密码
    46. #  sentinel_master_set:  #仅在使用 Sentinel模式(哨兵模式)时使用
    47.    registry_db_index: 1
    48.    jobservice_db_index: 2   #job服务的数据库索引
    49.    chartmuseum_db_index: 3  #chartmuseum插件的Redis索引
    50.    trivy_db_index: 5   #Trivy扫描器的数据索引
    51.    idle_timeout_seconds: 30  #超时时间
    52. #启用metrics数据采集插件:
    53. metric:
    54.    enabled: true   
    55.    port: 9090
    56.    path: /metrics

    7.3 将配置文件注入到组件中

    将harbor.yml配置文件的内容注入到各组件的配置文件中。

    [root@harbor1 harbor]# ./prepare

    7.4 安装Harbor

    安装期间会自动导入镜像,执行完成会自动启动Harbor服务。

    [root@harbor1 harbor]# ./install.sh --with-trivy --with-chartmuseum

    -Harbor has been installed and started successfully.- 表示安装成功!

    7.5 查看服务状态

    [root@harbor1 harbor]# docker-compose ps

    7.6 浏览器登录Harbor UI

    使用实例主机IP+端口在浏览器访问harbor UI Http://192.168.2.107:8021

    用户名:admin
    密码:Harbor12345

    八、部署Harbor实例2

    操作步骤跟部署Harbor实例1一致,仅将harbor.yml文件中hostname的值修改为当前主机的IP地址即可。

    1. mkdir /app
    2. wget https://github.com/goharbor/harbor/releases/download/v2.3.5/harbor-offline-installer-v2.3.5.tgz
    3. tar zxvf harbor-offline-installer-v2.3.5.tgz  -C  /app/
    4. scp  192.168.2.107:/app/harbor/harbor.yml /app/harbor/
    5. vim /app/harbor/harbor.yml’
    6. hostname: 192.168.2.108

    九、服务验证

    9.1 浏览器访问VIP和端口

    http://192.168.2.111:8121

    在Harbor UI界面测试镜像推送、拉取、创建用户、创建项目等是否正常

    9.2 命令行登录Harbor

    $ docker login http://192.168.2.111:8121 -u admin -p Harbor12345

    出现报错:
    Error response from daemon: Get https://192.168.2.111:8121/v2/: http: server gave HTTP response to HTTPS client 在docker配置文件中添加参数:

    1. [root@harbor1 harbor]# vim /etc/docker/daemon.json
    2. {
    3. "registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],
    4. "exec-opts": ["native.cgroupdriver=systemd"],
    5. "registry-mirrors": ["https://3hjcmqfe.mirror.aliyuncs.com"],
    6. "insecure-registries": ["192.168.2.111:8121"],
    7. "log-driver": "json-file",
    8. "log-opts": {
    9. "max-size": "500m",
    10. "max-file": "2"
    11. }
    12. }
    13. [root@harbor1 harbor]# systemctl restart docker #然后重启docker

    9.3 向Harbor推送镜像

    1. [root@harbor1 harbor]# docker pull alpine:3.16
    2. [root@harbor1 harbor]# docker tag alpine:3.16 192.168.2.111:8121/library/alpine:3.16
    3. [root@harbor1 harbor]# docker  push 192.168.2.111:8121/library/alpine:3.16

    然后可以在Harbor UI界面查看到镜像已经推送成功!

  • 相关阅读:
    IDEA中如何配置多个版本的JDK
    day61 layui和分页原理
    使用 JavaScript Promise 读取 Github 某用户的数据
    玉米稻风波被中途扼杀 国稻种芯-何登骥:生物育种风险机制
    Linux常用命令
    读书笔记(一)C++prime
    RedisSyncer 中采用链式策略处理同步数据
    QsciScintilla等编辑器实现不同区域鼠标右键处理方式不同的方法
    CSS前端面试问题
    jmeter实战
  • 原文地址:https://blog.csdn.net/zfw_666666/article/details/126028310