原文の転載元: Harbor 高可用性クラスターの設計と展開 (オフライン インストール方法に基づく)
建築から美へ 北京で公開2022-09-05 09:28
編集者のおすすめ:
純粋に便利で実用的であるため、推奨度は 5 つ星です。
次の記事は、Jianke Li Dabai が執筆した Harbor Advanced Practice からのものです。
【概要】 Harbor オフライン設置方式に基づく高可用性ソリューションの設計と導入。
1. 環境説明
1.1 アーキテクチャ図
ハーバーの高可用性アーキテクチャ図
[アーキテクチャ分析]: Harbor の Redis キャッシュ コンポーネントと PostgreSQL データベース コンポーネントをシステムの外部に移行して高可用性を実現し、外部共有ストレージを使用して複数の Harbor インスタンス間でのデータ共有を実現します。Harbor インスタンスは水平方向に拡張できます。
1.2 ホストリスト
IPアドレス | CPU名 | 説明する |
---|---|---|
192.168.2.107 | 港1 | ハーバー インスタンス 1、ポート 8021 |
192.168.2.108 | 港2 | ハーバー インスタンス 2、ポート 8021 |
192.168.2.110 | 港湾データ | Harbor インスタンスの共有ストレージ、外部データベース、外部キャッシュ サービスをデプロイする |
192.168.2.111 | / | 負荷分散 VIP、ポート 8121 |
1.3 サービスバージョン
仕える | バージョン要件 | インストールされているバージョン |
---|---|---|
港 | / | 2.3.5 |
ドッカー | 17.06.0+ | 19.03.8 |
Docker-compose | 1.18.0以降 | v2.2.3 |
レディス | 6.0.16 | 6.2.7 |
PostgreSQL | v13.2 | 13.5 |
2. ホストの初期化
ハーバーインスタンスが初期化されました
-
ドッカーをインストールする
-
docker-compose をインストールする
-
カーネルパラメータを構成する
2.1 ドッカーをインストールする
$ wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ yum install -y docker-ce
$ systemctl enable --now docker
$ systemctl status docker
$ cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://3hjcmqfe.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "500m",
"max-file": "2"
}
}
EOF
$ systemctl daemon-reload
$ systemctl restart docker
exec-opts": ["native.cgroupdriver=systemd"]、#Drive registry-mirrors: ミラー アクセラレーション アドレス、複数の max-file: ライブを保持するログの最大数-restore: コンテナーを再起動せずに docker を再起動します。主に次の場所で使用されます。 k8s
2.2 docker-compose のインストール
docker-compose バージョン 1.18.0 以降をインストールします。ここではバージョン v2.2.3 をインストールします。
$ wget https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64
$ mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ docker-compose version
Docker Compose version v2.2.3
2.3 カーネルパラメータの設定
$ modprobe br_netfilter
$ cat >> /etc/sysctl.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1 #路由转发
EOF
$ sysctl -p
3. NFS を使用して外部共有ストレージを提供する
192.168.2.110
NFS サービスをデプロイするときは、Harbor1 インスタンスと Harbor2 インスタンスが使用する共有ストレージを提供します。192.168.2.110
NFS サーバーとして、ハーバー インスタンスはクライアントです。
3.1 NFS サーバーの導入
1) NFS をインストールして起動します。
$ yum install -y nfs-utils
$ systemctl start nfs && systemctl enable nfs && systemctl status nfs
$ chkconfig nfs on #设置为开机自启
2) 共有ディレクトリを作成する
クライアントのデータは、リモートの共有ディレクトリに保存されます。
$ mkdir -p /data/harbor_data
3) 構成を変更する
$ cat /etc/exports
/data/harbor_data 192.168.2.0/24(rw,no_root_squash) #允许哪个网段的客户端使用指定共享目录
$ exportfs -arv #使配置文件生效
exporting 192.168.2.0/24:/data/harbor_data
4) nfsサービスを再起動します
$ systemctl restart nfs
5) 共有ディレクトリ情報を確認する
$ showmount -e localhost
export list for localhost:
/data/harbor_data
3.2 クライアントのデプロイ
ハーバー1とハーバー2で運用
$ yum -y install nfs-utils
$ systemctl start nfs-utils && systemctl enable nfs-utils && systemctl status nfs-utils
3.3 クライアントが NFS 共有ストレージをマウントする
Harbor1 ノードと Harbor2 ノード上で操作し、インスタンスのストレージ ディレクトリを作成して、NFS にマウントします。
$ mkdir -p /data/harbor_data
$ cat <<EOF >> /etc/fstab
192.168.2.110:/data/harbor_data /data/harbor_data nfs defaults 0 0
EOF
$ mount -a
マウント形式: NFSIP: 共有ディレクトリ ローカル ディレクトリ nfs デフォルト 0 0
-
正常に使用できるかどうかをテストします。
[root@harbor2 ~]# touch /data/harbor_data/test.txt
[root@harbor1 ~]# ls /data/harbor_data/
test.txt
4. Redis キャッシュ サービスのデプロイ (ソース コード)
これはデモンストレーション環境です。実際には、
生产环境
Redis サービスの高可用性とデータのバックアップを作成してください。
192.168.2.110
Redis キャッシュ サービスをデプロイする場合は、harbor1
とインスタンスにharbor2
外部 Redis キャッシュ サービスを提供します。
4.1 インストールパッケージをダウンロードする
$ wget https://download.redis.io/releases/redis-6.2.7.tar.gz
4.2 依存関係パッケージをインストールする
$ yum install -y gcc gcc-c++
4.3 ソースコードのコンパイル
$ mkdir -p /app/
$ tar zxvf redis-6.2.7.tar.gz -C /app
$ cd /app/redis-6.2.7/
$ make #编译
$ make install #安装
4.4 設定ファイルの変更
Redis はデフォルトでローカル使用のみをサポートします。ここでいくつかのパラメーターを変更する必要があります。
-
外部接続可能。
-
Redis 起動モード。
-
Redis リモート接続パスワード;
$ vim /app/redis-6.2.7/redis.conf
#bind 127.0.0.1 -::1 #75行,注释掉bind的行,允许任何主机连接;
daemonize yes #259行,将no修改为yes,使redis可以使用守护进程方式启动;
requirepass lidabai666 #903行,设置redis连接的auth密码(lidabai666)
4.5 Redis サービスの開始
以前の構成ではデーモン プロセスを使用して起動するため、systemctl を使用して redis サービスを直接起動できます。
$ pwd
/app/redis-6.2.7
$ redis-server redis.conf
4.6 サービスの検証
1) Redis サービスのバージョンを確認する
$ redis-cli -v
redis-cli 6.2.7
2) ビューポート
Redis はデフォルトでポート 6379 をリッスンします
$ ps aux | grep 6379
root 6200 0.1 0.2 162416 10020 ? Ssl 17:59 0:00 redis-server *:6379
root 6231 0.0 0.0 112720 984 pts/0 R+ 18:01 0:00 grep --color=auto 6379
3) クライアントが Redis に接続する
harbor1
そしてharbor2
Redisクライアントとして
$ which redis-cli #查看redis-cli工具位置
/usr/local/bin/redis-cli
[root@harbor-data redis-6.2.7]# scp /usr/local/bin/redis-cli 192.168.2.107:/usr/local/bin/
[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 接続パスワードを指定します。
5. PostgreSQL 外部ストレージ サービスのデプロイ (ソース コード)
192.168.2.110
PostgreSQL データベース サービスをソース コードでホストにインストールし、harbor1 インスタンスと Harbor2 インスタンスに共有ストレージを提供します。
5.1 新しい postgres ユーザーを作成する
デフォルトでは、スーパー ユーザー (root) は postgresql を起動できないため、ユーザー postgres を手動で作成する必要があります。
$ useradd postgres
$ id postgres
uid=1000(postgres) gid=1000(postgres) 组=1000(postgres)
5.2 依存パッケージのインストール
$ yum -y install readline-devel zlib-devel gcc zlib
5.3 ソースコードパッケージをダウンロードして解凍する
$ wget https://ftp.postgresql.org/pub/source/v13.5/postgresql-13.5.tar.gz --no-check-certificate
$ tar zxvf postgresql-13.5.tar.gz -C /app/
5.4 コンパイルとインストール
$ cd /app/postgresql-13.5/
$ ./configure --prefix=/usr/local/postgresql
$ make && make install
5.5 データディレクトリの作成
$ mkdir -p /data/postgresql/data
$ chown -R postgres:postgres /usr/local/postgresql/
$ chown -R postgres:postgres /data/postgresql/data/
5.6 postgres 環境変数を設定する
[root@harbor-data postgresql-13.5]# su - postgres
[postgres@harbor-data ~]$ vim + .bash_profile
PGHOME=/usr/local/postgresql #psql安装目录
export PGHOME
PGDATA=/data/postgresql/data #数据库目录
export PGDATA
PATH=$PATH:$HOME/bin:$HOME/.local/bin:$PGHOME/bin
export PATH
[postgres@harbor-data ~]$ source ./.bash_profile
[postgres@harbor-data ~]$ which psql
/usr/local/postgresql/bin/psql
バージョンを表示 [postgres@harbor-data ~]$ psql -V psql (PostgreSQL) 13.5
5.7 データベースの初期化
Red Hat ファミリのディストリビューションのポリシーにより、PostgreSQL のインストールでは自動起動や自動データベース初期化が有効になりません。データベースのインストールを完了するには、ディストリビューションに応じて次の手順を実行する必要があります。
[postgres@ceph3 ~]$ initdb
......
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using: #表示初始化成功
pg_ctl -D /data/postgresql/data -l logfile start
5.8 PostgreSQLの起動
初期化が成功したら、プロンプトに従って起動コマンドを実行してください。
[postgres@harbor-data ~]$ pg_ctl -D /data/postgresql/data -l logfile start
waiting for server to start.... done
server started
5.9 Postgresqlのパスワードを設定(変更)する
psql ローカルログインはデフォルトではパスワード不要なので、パスワードを設定してもパスワードなしでログインできます。設定ファイル pg_hba.conf のローカル設定が trust に設定されているはずですが、セキュリティ上の理由からパスワードに変更します。これは、パスワードを使用してログインできることを意味します(パスワードを忘れた場合も可能です)。この方法を使用します。まず信頼に設定してからパスワードを変更し、次にパスワードに設定します)。
[postgres@harbor-data ~]$ psql
psql (13.5)
Type "help" for help.
postgres=# \password
Enter new password: #输入设置的密码 Lidabai666
Enter it again: #确认密码(再次输入)
postgres=# \q #退出
5.10 PostgreSQL へのリモート ログインをセットアップする
[postgres@harbor-data ~]$ vim /data/postgresql/data/postgresql.conf
listen_addresses = '*' #60行,监听所有地址
[postgres@harbor-data ~]$ vim + /data/postgresql/data/pg_hba.conf
local all all password
host all all 0.0.0.0/0 password
host all all ::1/128 password
5.10 PostgreSQLの再起動
$ pg_ctl -D /data/postgresql/data -l /data/postgresql/data/postgres.log restartwaiting for server to shut down.... done
server stopped
waiting for server to start.... done
server started
5.11 データベースの作成
Harbor 2.3.5 が作成する必要があるデータベース:
-
公証人サーバー
-
公証人署名者
-
レジストリ
現在、Harbor は PostgraSQL データベースのみをサポートしています。外部 PostgreSQL 上に registry、notary_signer、notary_servers の 3 つのデータベースを手動で作成する必要があります。Harbor が起動すると、対応するデータベースの下にテーブルが自動的に生成されます。
これは主にデモンストレーション環境であるため、PostgreSQL データベースのユーザーはスーパー管理者です
postgres
。実稼働環境の場合は、新しいユーザーを作成し、harbor、notary_signer、および notary_servers の 3 つのデータベースに対応する権限を付与することをお勧めします。 。
[postgres@harbor-data ~]$ psql
Password for user postgres: #输入密码
postgres=# create database registry;
CREATE DATABASE
postgres=# create database notary_signer;
CREATE DATABASE
postgres=# create database notary_servers;
CREATE DATABASE
postgres=# \l
5.12 ユーザーの作成
postgres=# create user server with password 'lidabai666';
CREATE ROLE
postgres=# create user signer with password 'lidabai666';
CREATE ROLE
postgres=# \du
6. 負荷分散設定(Nginx + Keepalived)
keepalive と Nginx を使用して、ハーバーの高可用性を実現します。
harbor1
ロード バランシング用の VIP を提供するには、キープアライブ サービスをおよびノードにインストールしますharbor2
。Nginx サービスは、VIP からのリクエストをバックエンド サーバー グループ ポートに転送します。
6.1 nginx と keepalived をインストールする
ハーバー1とハーバー2で運用
$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
$ yum install -y nginx keepalived
$ yum -y install nginx-all-modules.noarch #安装nginx的stream模块
nginx は 1.9.0 から steam モジュールを追加しました。これは 4 層プロトコルの転送、プロキシ、負荷分散などを実装するために使用されます。nginx のバイナリ インストールの場合は、--with-stream パラメータを ./configure に追加してストリーム モジュールをインストールします。
6.2 nginx設定ファイルの変更
在harbor1和harbor2的Nginx服务配置文件一样。
$ vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto; #自动设置nginx的工作进程数量
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024; #工作进程的连接数
}
# 四层负载均衡,为两台harbor提供负载均衡
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
access_log /var/log/nginx/harbor-access.log main;
upstream harbor{
server 192.168.2.107:8021; # harbor1
server 192.168.2.108:8021; # harbor2
}
server {
listen 8121; #由于nginx与harbor节点复用,这个监听端口不能是8021,否则会冲突
proxy_pass harbor;
}
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80 default_server;
server_name _;
location / {
}
}
}
nginx設定ファイルの構文を検出する
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
6.3 キープアライブ設定の変更
本处以harbor1为keepalived服务的主节点,harbor2为keepalived的备节点。主备节点的keepalived配置文件不一样。
1) マスターノード(harbor1)
[root@harbor1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
router_id master1
}
vrrp_instance lidabai {
state MASTER
interface ens33
mcast_src_ip:192.168.2.107
virtual_router_id 107
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.111/24 #虚拟VIP地址
}
track_script {
chk_nginx
}
}
##### 健康检查
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
2) スタンバイノード(harbor2)
[root@harbor2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
router_id master2
}
vrrp_instance lidabai {
state BACKUP
interface ens33
mcast_src_ip:192.168.2.108
virtual_router_id 107
priority 80 #权重
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.111/24
}
track_script {
chk_nginx
}
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
6.4 ヘルスチェックスクリプトの作成
在主备节点(harbor1和harbor2)同样操作。
$ vim /etc/keepalived/check_nginx.sh
#!/bin/bash
#1、判断Nginx是否存活
counter=`ps -C nginx --no-header | wc -l`
if [ $counter -eq 0 ]; then
#2、如果不存活则尝试启动Nginx
service nginx start
sleep 2
#3、等待2秒后再次获取一次Nginx状态
counter=`ps -C nginx --no-header | wc -l`
#4、再次进行判断,如Nginx还不存活则停止Keepalived,让地址进行漂移
if [ $counter -eq 0 ]; then
service keepalived stop
fi
fi
$ chmod +x /etc/keepalived/check_nginx.sh
6.5 サービスの開始
まず、master1 ノードと master2 ノードで nginx サービスを開始し、次に keepalived サービスを開始します。
1) nginxサービスを開始する
[root@harbor1 ~]# systemctl enable --now nginx #启动nginx服务并设置开机自启
[root@harbor2 ~]# systemctl enable --now nginx
[root@harbor1 ~]# systemctl status nginx.service
[root@harbor2 ~]# systemctl status nginx.service
2) キープアライブサービスを開始します
[root@harbor1 ~]# systemctl enable --now keepalived
[root@harbor2 ~]# systemctl enable --now keepalived
[root@harbor1 ~]# systemctl status keepalived.service
[root@harbor2 ~]# systemctl status keepalived.service
6.6 VIPを見る
在harbor1节点查看VIP是否成功绑定。
[root@harbor1 ~]# ip addr
......
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:f1:a3:65 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.107/24 brd 192.168.2.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.2.111/24 scope global secondary ens33 #VIP地址
valid_lft forever preferred_lft forever
inet6 fe80::80b0:1d7f:b5d4:19e8/64 scope link tentative dadfailed
......
VIP は ifconfig を通じて表示することはできませんが、
hostname -I
コマンドを通じて表示することもできます。
7. ハーバーインスタンス 1 をデプロイします
ハーバー 1 192.168.2.107 ホストにハーバー サービスを展開します。
7.1 オフライン インストール パッケージをダウンロードして解凍する
$ mkdir /app #创建安装目录
$ wget https://github.com/goharbor/harbor/releases/download/v2.3.5/harbor-offline-installer-v2.3.5.tgz
$ tar zxvf harbor-offline-installer-v2.3.5.tgz -C /app/
7.2 設定ファイルの変更
構成ファイルのテンプレートを構成ファイルにコピーし、対応するパラメーターを変更します。
[root@harbor1 ~]# cd /app/harbor/
[root@harbor1 harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor1 harbor]# vim harbor.yml
hostname: 192.168.2.107
http:
port: 8021
#取消https安全加密访问方式:
#https:
# port: 443
# certificate: /your/certificate/path
# private_key: /your/private/key/path
## 启用外部代理,启用后hostname将不再使用
external_url: http:192.168.2.111:8121
## 配置共享存储,即挂载的NFS目录
data_volume: /data/harbor_data
_version: 2.3.0
## 配置外部数据库
external_database:
harbor:
host: 192.168.2.110 # 数据库主机地址
port: 5432 # 数据库端口
db_name: registry # 数据库名称
username: postgres # 连接该数据库的用户名
password: Lidabai666 # 连接数据库的密码
ssl_mode: disable
max_idle_conns: 2
max_open_conns: 0
notary_signer:
host: 192.168.2.110
port: 5432
db_name: notary_signer
username: postgres
password: Lidabai666
ssl_mode: disable
notary_server:
host: 192.168.2.110
port: 5432
db_name: notary_server
username: postgres
password: Lidabai666
ssl_mode: disable
##配置外部Redis实例:
external_redis:
host: 192.168.2.110:6379 #redis服务IP地址和端口号。如果redis是哨兵模式,这里应该是host_sentinel1:port_sentinel1,host_sentinel2:port_sentinel2
password: lidabai666 #连接外部redis服务的密码
# sentinel_master_set: #仅在使用 Sentinel模式(哨兵模式)时使用
registry_db_index: 1
jobservice_db_index: 2 #job服务的数据库索引
chartmuseum_db_index: 3 #chartmuseum插件的Redis索引
trivy_db_index: 5 #Trivy扫描器的数据索引
idle_timeout_seconds: 30 #超时时间
#启用metrics数据采集插件:
metric:
enabled: true
port: 9090
path: /metrics
7.3 構成ファイルをコンポーネントに挿入する
Harbor.yml 構成ファイルの内容を各コンポーネントの構成ファイルに挿入します。
[root@harbor1 harbor]# ./prepare
7.4 ハーバーのインストール
イメージはインストール中に自動的にインポートされ、実行が完了すると Harbor サービスが自動的に開始されます。
[root@harbor1 harbor]# ./install.sh --with-trivy --with-chartmuseum
-Harbor がインストールされ、正常に開始されました。- インストールが成功したことを意味します。
7.5 サービスステータスの確認
[root@harbor1 harbor]# docker-compose ps
7.6 Harbor UIへのブラウザログイン
インスタンスのホスト IP + ポートを使用して、ブラウザーのハーバー UI にアクセスします。http://192.168.2.107:8021
ユーザー名: admin
パスワード: Harbor12345
8. ハーバー インスタンス 2 をデプロイします
手順はハーバー インスタンス 1 のデプロイと同じです。harbor.yml ファイル内のホスト名の値を現在のホストの IP アドレスに変更するだけです。
$ mkdir /app
$ wget https://github.com/goharbor/harbor/releases/download/v2.3.5/harbor-offline-installer-v2.3.5.tgz
$ tar zxvf harbor-offline-installer-v2.3.5.tgz -C /app/
$ scp 192.168.2.107:/app/harbor/harbor.yml /app/harbor/
$ vim /app/harbor/harbor.yml’
hostname: 192.168.2.108
9. サービスの検証
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
エラーが発生します:
デーモンからのエラー応答: Get https://192.168.2.111:8121/v2/: http: サーバーが HTTPS クライアントに HTTP 応答を返しました。Docker 構成ファイルにパラメーターを追加します。
[root@harbor1 harbor]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://3hjcmqfe.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.2.111:8121"],
"log-driver": "json-file",
"log-opts": {
"max-size": "500m",
"max-file": "2"
}
}
[root@harbor1 harbor]# systemctl restart docker #然后重启docker
9.3 イメージを Harbor にプッシュする
[root@harbor1 harbor]# docker pull alpine:3.16
[root@harbor1 harbor]# docker tag alpine:3.16 192.168.2.111:8121/library/alpine:3.16
[root@harbor1 harbor]# docker push 192.168.2.111:8121/library/alpine:3.16
その後、画像が正常にプッシュされたことが Harbor UI で確認できます。