どうも、Tです。
プライベート用のコンテナレジストリHarborの基本動作を確認してみたので備忘録です。
目次
環境
Harbor(コンテナレジストリ)
# helm list --namespace harbor-system NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION harbor harbor-system 1 2025-07-24 13:48:19.749107727 +0900 JST deployed
Podman(コンテナイメージのPush、Pullに利用)
# podman --version podman version 5.4.0
事前準備
コンテナレジストリHarborをデプロイして使えるようにしておきます。
Harborのデプロイ方法は下記にまとめました。

コンテナイメージのPush・PullはPodmanから行います。
Podmanのインストール方法は下記にまとめました。

Harbor設定
コンテナイメージをPush・PullするためにHarborの設定を行っていきます。
ユーザー作成
今回はPrivateレジストリとして作成するためログインのためのユーザーを作成します。
Harborにログインします。
「Administration」->「Users」画面を開き「NEW USER」をクリックします。
下記に任意のユーザー情報を入力し「OK」をクリックします。
検証用ユーザー「test-user」が作成できました。
プロジェクト作成
コンテナレジストリとしてアクセスするプロジェクトを作成します。
「Projects」画面を開き「NEW PROJECT」をクリックします。
「Project Name」に任意の名前を入力して「OK」をクリックします。
検証用プロジェクト「test-proj」が作成できました。
「test-proj」をクリックします。
メンバー追加
プロジェクトにメンバーを追加します。
プロジェクトの「Members」タブをクリックし「USER」をクリックします。
Nmaeに検証用ユーザー「test-user」を入力、Roleに「Developer」を選択し「OK」をクリックします。
コンテナイメージのPushとPullが行えれば良いのでRoleにDeveloperを選択しています。
プロジェクトとユーザー(メンバー)の概要については下記に記載されています。
https://goharbor.io/docs/2.4.0/administration/managing-users/
Roleの細かい権限内容については下記に記載されています。
https://goharbor.io/docs/2.4.0/administration/managing-users/user-permissions-by-role/
メンバーが追加できました。
PodmanからコンテナイメージのPush・Pull
PodmanからHarborのコンテナレジストリに、コンテナイメージをPush・Pullができるか確認します。
podman設定変更(TLS検証無効)
Harborの証明書は自己証明書のため、podmanからアクセスする際に下記のようなエラーが表示されコンテナレジストリにアクセスできません。
Error: authenticating creds for "192.168.10.208:30003": pinging container registry 192.168.10.208:30003: Get "https://192.168.10.208:30003/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority
podmanコマンドに–tls-verify=falseオプションを付けることでも回避できますが、コマンドを打つたびにオプションを付けるのは面倒なため、Harborのコンテナレジストリにアクセスする場合に、TLS検証なしでアクセスできるようにします。
下記の設定ファイルを編集します。
$ sudo vi /etc/containers/registries.conf
末尾に下記を追記します。locationは、HarborのIPアドレス・ポート番号になります。
[[registry]] location = "192.168.10.208:30003" insecure = true
上記設定については、下記の資料に詳しく記載されています。
https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/10/html-single/building_running_and_managing_containers/index#configuring-container-registries
コンテナイメージPush
Pushするためのコンテナイメージを準備します。インターネットからhello-worldコンテナイメージをPullし、イメージが存在することを確認します。
$ podman pull hello-world Resolved "hello-world" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf) Trying to pull quay.io/podman/hello:latest... Getting image source signatures Copying blob 81df7ff16254 done | Copying config 5dd467fce5 done | Writing manifest to image destination 5dd467fce50b56951185da365b5feee75409968cbab5767b9b59e325fb2ecbc0 $ podman images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/podman/hello latest 5dd467fce50b 14 months ago 787 kB
下記の設定ファイルで短縮名としてマッピングされているため正常な動作です。
$ cat /etc/containers/registries.conf.d/000-shortnames.conf | grep hello-world "hello-world" = "quay.io/podman/hello"
Pullしたhello-worldコンテナイメージに、harborに保存する用のタグ名を付けて、イメージが存在することを確認します。
$ podman tag quay.io/podman/hello:latest 192.168.10.208:30003/test-proj/hello:v1 $ podman images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.10.208:30003/test-proj/hello v1 5dd467fce50b 14 months ago 787 kB quay.io/podman/hello latest 5dd467fce50b 14 months ago 787 k
<registryhost>/<username>/<name>:<tag>
検証用ユーザー「test-user」でHarborにログインします。
$ podman login 192.168.10.208:30003 Username: test-user Password: Login Succeeded!
HarborにタグをつけたコンテナイメージをPushします。
$ podman push 192.168.10.208:30003/test-proj/hello:v1 Getting image source signatures Copying blob 2114fc8b7058 done | Copying config 5dd467fce5 done | Writing manifest to image destination
Harborコンテナレジストリにタグをつけたコンテナイメージが保存されていることが確認できます。
$ skopeo list-tags docker://192.168.10.208:30003/test-proj/hello { "Repository": "192.168.10.208:30003/test-proj/hello", "Tags": [ "v1" ] }
skopeoコマンドは、コンテナイメージ操作を行うコマンドですが、今回はタグ情報の取得に利用しています。
「docker://」は「Docker Registry HTTP API V2」に対応しているレジストリであることを指定しています。
docker://docker-reference An image in a registry implementing the “Docker Registry HTTP API V2”. By default, uses the authorization state in
$XDG_RUNTIME_DIR/containers/auth.json
, which is set usingskopeo login
.
Harborから見るとhelloリポジトリが作成されていることが確認できます。
「test-proj/hello」をクリックします。
リポジトリの中を確認するとPushしたv1タグが登録されていることが確認できます。
Harborからログアウトします。
$ podman logout 192.168.10.208:30003 Removed login credentials for 192.168.10.208:30003
コンテナイメージPull
HarborコンテナレジストリからコンテナイメージをPullできることを確認します。
ローカルにコンテナイメージがあることを確認します。
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.10.208:30003/test-proj/hello v1 5dd467fce50b 14 months ago 787 kB quay.io/podman/hello latest 5dd467fce50b 14 months ago 787 k
ローカルにコンテナイメージを削除します。
$ podman rmi 192.168.10.208:30003/test-proj/hello:v1 $ podman rmi quay.io/podman/hello:latest $ podman images REPOSITORY TAG IMAGE ID CREATED SIZE
検証用ユーザー「test-user」でHarborにログインします。
$ podman login 192.168.10.208:30003 Username: test-user Password: Login Succeeded!
Harborから先ほどPushしたコンテナイメージをPullします。
$ podman pull 192.168.10.208:30003/test-proj/hello:v1 Trying to pull 192.168.10.208:30003/test-proj/hello:v1... Getting image source signatures Copying blob ce980a8f5545 done | Copying config 5dd467fce5 done | Writing manifest to image destination 5dd467fce50b56951185da365b5feee75409968cbab5767b9b59e325fb2ecbc0
ローカルにコンテナイメージが保存されたことを確認します。
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.10.208:30003/test-proj/hello v1 5dd467fce50b 14 months ago 786 kB
Pullしたコンテナイメージを実行できることを確認します。
$ podman run --rm -it 192.168.10.208:30003/test-proj/hello:v1 !... Hello Podman World ...! .--"--. / - - \ / (O) (O) \ ~~~| -=(,Y,)=- | .---. /` \ |~~ ~/ o o \~~~~.----. ~~ | =(X)= |~ / (O (O) \ ~~~~~~~ ~| =(Y_)=- | ~~~~ ~~~| U |~~ Project: https://github.com/containers/podman Website: https://podman.io Desktop: https://podman-desktop.io Documents: https://docs.podman.io YouTube: https://youtube.com/@Podman X/Twitter: @Podman_io Mastodon: @Podman_io@fosstodon.org
Pullしたイメージを削除します。
$ podman rmi 192.168.10.208:30003/test-proj/hello:v1 $ podman images REPOSITORY TAG IMAGE ID CREATED SIZE
Harborからログアウトします。
$ podman logout 192.168.10.208:30003 Removed login credentials for 192.168.10.208:30003
コンテナイメージ・プロジェクト削除
Harborから検証で利用したコンテナイメージとプロジェクトを削除します。
コンテナイメージ削除
「Projects」->「test-proj」の「Repositories」タブを開き「test-proj/hello」ににチェックを入れ「DELETE」をクリックします。
確認画面で「DELETE」をクリックします。
コンテナイメージ(レジストリ)を削除できました。
プロジェクト削除
「Projects」画面で「test-proj」にチェックを入れ「ACTION」->「Delete」をクリックします。
確認画面で「DELETE」をクリックします。
プロジェクトを削除できました。
参考

まとめ
他にもいろいろ機能ありますが、プライベート用としてこれだけ使えれば十分かなぁ。Harbor思ったより使いやすいです。