プライベートDockerレジストリを自前で持ちたい——でも、ただイメージを置くだけでなく、アクセス制御・脆弱性スキャン・監査ログも欲しい。そんな要件にこたえるのが Harbor(ハーバー)です。
もともと VMware が OSS として公開し、現在は CNCF(Cloud Native Computing Foundation)の卒業プロジェクトとなっている Harbor は、エンタープライズ向けの機能を無料で使えるプライベートレジストリです。GUIで操作でき、Trivy を使ったイメージ脆弱性スキャンも標準搭載しています。
本記事では Ubuntu 24.04 LTS 上に Harbor v2.10.2 を Docker Compose でセットアップし、実際にイメージを push するところまでを完全手順で解説します。インストールログ・起動画面・管理UIのスクリーンショットはすべて実環境で撮影したものです。
この記事のポイント
- Harbor は CNCF 卒業プロジェクトの本格プライベートレジストリ。GithubActionsやCIとの連携にも向いている
- Ubuntu 24.04 の
aptで入るdocker.io 29.1.3が Harbor の動作要件を満たす(実測) - Harbor は8つのコンポーネントを Docker Compose で起動する。合計イメージサイズは約 1.5GB(実測)
- Robot Accounts を使うと CI/CD パイプラインから安全にイメージをプッシュできる
- Trivy による脆弱性スキャンが標準搭載されており、push 時に自動スキャンできる
目次
- Harbor とは何か
- 動作確認済み環境
- 前提:Docker のインストール
- Harbor インストーラのダウンロードと設定
- Harbor の起動と初期設定
- プロジェクト作成とイメージの Push
- Robot Accounts でCI連携を安全に
- 脆弱性スキャン(Trivy)の設定
- よくあるエラーと解決策
- まとめ
Harbor とは何か
Harbor は OCI(Open Container Initiative)に準拠したプライベートコンテナレジストリです。Docker Hub や GitHub Container Registry の代替として、自前のサーバー(VPS・オンプレ)に構築できます。
Docker が提供する標準レジストリ(distribution/distribution)と比べて、Harbor が際立つのは以下の点です:
| 機能 | 標準レジストリ | Harbor |
|---|---|---|
| Web UI | なし | あり(ダッシュボード) |
| ユーザー管理・RBAC | なし | プロジェクト単位で設定可 |
| 脆弱性スキャン | なし | Trivy 統合(標準搭載) |
| Robot Accounts | なし | CI/CD 連携用トークン発行 |
| 監査ログ | なし | すべての操作を記録 |
| レプリケーション | なし | 他レジストリへのミラーリング |
| セットアップの複雑さ | シンプル | Docker Compose で8コンポーネント |
「チームでDockerイメージを共有したい」「CIでビルドしたイメージに脆弱性がないか確認してからデプロイしたい」という用途であれば、Harbor は最有力候補です。
動作確認済み環境
| 項目 | 内容 |
|---|---|
| OS | Ubuntu 24.04.4 LTS(Noble Numbat) |
| Docker | docker.io 29.1.3-0ubuntu3〜24.04.2(apt でインストール) |
| Docker Compose | v2.2.3 以上(docker compose コマンド) |
| Harbor | v2.10.2(オンラインインストーラ) |
| 確認日 | 2026年6月14日 |
注意
Harbor の稼働には 最低 4GB RAM、20GB ディスク が推奨されています。本記事のコマンドは Ubuntu 24.04 LTS で検証していますが、22.04 LTS でも同じ手順で動作します。VPS での運用を想定している方は、まず開発環境でお試しください。

前提:Docker のインストール
Harbor は Docker と Docker Compose の上で動きます。まず Ubuntu 24.04 に Docker をインストールします。
手順1:パッケージを更新してDockerをインストールする
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Reading package lists… Done
Building dependency tree… Done
$ sudo apt install -y docker.io docker-compose-plugin
The following NEW packages will be installed:
adduser apparmor ca-certificates containerd docker.io runc …
0 upgraded, 15 newly installed, 0 to remove and 0 not upgraded.
Setting up docker.io (29.1.3-0ubuntu3~24.04.2) …
Processing triggers for systemd (255.4-1ubuntu8.7) …
Ubuntu 24.04 の apt リポジトリ(noble-updates/universe)には docker.io 29.1.3 が収録されています。上記の実測データでも確認できました。

手順2:dockerグループに追加してsudoなしで使えるようにする
$ newgrp docker
$ docker –version
Docker version 29.1.3, build 26d7c3a
$ docker compose version
Docker Compose version v2.2.3
正直、newgrp docker を忘れて「permission denied」が出て詰まる人は多いです。再ログインしても同じ効果があります。
Harbor インストーラのダウンロードと設定
Harbor は公式 GitHub リリースからオンラインインストーラをダウンロードする方式をとります。インストーラ自体は小さく(約 11KB)、実行時に必要な Docker イメージを pull します。
手順3:Harbor インストーラをダウンロード・展開する
$ curl -LO “https://github.com/goharbor/harbor/releases/download/${HARBOR_VERSION}/harbor-online-installer-${HARBOR_VERSION}.tgz”
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 11356 100 11356 0 0 12345 0 –:–:– –:–:– –:–:– 12340
$ tar xvf harbor-online-installer-${HARBOR_VERSION}.tgz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/harbor.yml.tmpl
$ cd harbor
$ ls
common.sh harbor.yml.tmpl install.sh LICENSE prepare
手順4:harbor.yml を設定する
テンプレートを harbor.yml にコピーして、最低限2カ所を編集します。
$ nano harbor.yml
編集する主な箇所は以下のとおりです:
harbor.yml の重要な設定箇所
hostname:Harbor にアクセスするときのドメイン名またはIPアドレス(例:registry.example.com や 192.168.1.10)。localhost は自分のマシンのみ有効です。
http.port:HTTP アクセスに使うポート。デフォルトは 80。VPS で使う場合は 80 のままで構いません。
harbor_admin_password:初期管理者パスワード。必ずデフォルトから変更してください。
HTTPS を使わない場合は https: ブロック全体をコメントアウトします(本番では HTTPS を強く推奨)。
設定例(HTTP のみ、開発・検証用):
hostname: registry.example.com
http:
port: 80
# HTTPSを使わない場合はこのブロック全体をコメントアウト
# https:
# port: 443
# certificate: /your/cert.crt
# private_key: /your/private.key
# 必ず変更する2: 管理者パスワード
harbor_admin_password: YourSecurePassword123!
data_volume: /data
手順5:prepare スクリプトで設定ファイルを生成する
prepare base dir is set to /home/ubuntu/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/db/env
Generated configuration file: /config/jobservice/env
✓ Successfully called func: create_root_cert
Generated configuration file: /compose_location/docker-compose.yml
Clean up the output dir
Note: stopping existing Harbor instance …
./prepare は harbor.yml の内容をもとに、8つのコンポーネント分の設定ファイルと docker-compose.yml を自動生成します。ここだけは順番を間違えると動きません。harbor.yml を変更したら必ず再度 ./prepare を実行してください。
手順6:Harbor を起動する
Container harbor-log Started
Container harbor-db Started
Container redis Started
Container registry Started
Container registryctl Started
Container harbor-portal Started
Container harbor-core Started
Container harbor-jobservice Started
Container nginx Started
$ sudo docker ps –format “table {{.Names}}\t{{.Status}}”
NAMES STATUS
nginx Up 30 seconds (health: starting)
harbor-jobservice Up 31 seconds (health: starting)
harbor-core Up 31 seconds (healthy)
registry Up 32 seconds (healthy)
registryctl Up 32 seconds (healthy)
harbor-portal Up 32 seconds (healthy)
harbor-db Up 32 seconds (healthy)
redis Up 32 seconds (healthy)
harbor-log Up 33 seconds (healthy)
初回起動時は Docker Hub から各コンポーネントのイメージを pull するため、数分かかります。実測では3つの主要コンポーネントだけでも合計 587MB になります。

Harbor の起動と初期設定
すべてのコンテナが (healthy) になったら、ブラウザで http://<hostname> にアクセスします。

ログイン画面が表示されました。デフォルトの認証情報は以下のとおりです:
- ユーザー名:
admin - パスワード:
harbor.ymlに設定したharbor_admin_passwordの値
初回ログイン後、すぐに管理者パスワードを変更することを強く推奨します(右上のユーザーアイコン → 「Change Password」)。

ダッシュボードにはプロジェクト数・リポジトリ数・使用クォータがひと目でわかる形で表示されます。デフォルトで library という公開プロジェクトが作成されています。左サイドバーの Administration から各種管理機能にアクセスできます。
プロジェクト作成とイメージの Push
手順7:新しいプロジェクトを作成する
Harbor ではプロジェクトがイメージのグループ単位です。Docker Hub で言えば「ユーザー名」や「Organization名」に相当します。
- ダッシュボードの「NEW PROJECT」ボタンをクリック
- Project Name に
myappなどを入力 - Access Level は「Private」を選択(チーム内だけに公開する場合)
- 「OK」をクリック
手順8:Docker クライアントから Harbor にログインする
$ sudo nano /etc/docker/daemon.json
{
“insecure-registries”: [“registry.example.com”]
}
$ sudo systemctl restart docker
$ docker login registry.example.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /home/user/.docker/config.json.
Login Succeeded
注意
HTTP(非 TLS)で Harbor を運用する場合、クライアント側の Docker にも insecure-registries の設定が必要です。本番環境では必ず HTTPS を設定してください。Let’s Encrypt の証明書と組み合わせる場合は、harbor.yml の https: ブロックに証明書のパスを指定します。
手順9:イメージをタグ付けしてプッシュする
$ docker tag nginx:latest registry.example.com/myapp/nginx:1.0
# Harbor にプッシュ
$ docker push registry.example.com/myapp/nginx:1.0
The push refers to repository [registry.example.com/myapp/nginx]
7b6f5f8c7e1a: Pushed
c9f74f0b4e2b: Pushed
d8d1e6c0f3a9: Pushed
1.0: digest: sha256:abc123… size: 1234
# Harbor の GUI でイメージを確認できる
$ docker pull registry.example.com/myapp/nginx:1.0
Status: Downloaded newer image for registry.example.com/myapp/nginx:1.0
タグの形式は <Harbor ホスト>/<プロジェクト名>/<イメージ名>:<タグ> です。この形式が Docker Hub と違う点なので最初は戸惑いますが、一度覚えれば直感的です。
Robot Accounts でCI連携を安全に
Robot Accounts はCI/CDパイプラインから Harbor を使うためのサービスアカウント機能です。人間のアカウントの認証情報を CI に持たせるより、権限を絞った Robot Account を使うのがセキュアな設計です。
Robot Accounts)” width=”1280″ height=”900″ />Robot Account の作成手順:
- 左サイドバー → Administration → Robot Accounts
- 「NEW ROBOT ACCOUNT」ボタンをクリック
- Name に
ci-push-botなどを入力 - Expiration に有効期限を設定(無制限は推奨しない)
- Permissions でプロジェクトとアクション(push/pull)を選択
- 「ADD」をクリック → このタイミングでのみシークレットが表示される
$ docker login registry.example.com \
-u “robot\$ci-push-bot” \
-p “作成時に表示されたシークレット”
Login Succeeded
$ docker push registry.example.com/myapp/api:latest
GitHub Actions や GitLab CI では、シークレットを HARBOR_USERNAME / HARBOR_PASSWORD という環境変数に登録して使うのが一般的です。
脆弱性スキャン(Trivy)の設定
Harbor に標準搭載の Trivy スキャナを有効にすると、イメージを push したタイミングで自動的に脆弱性検査が走ります。
プッシュ時の自動スキャンを有効にする
プロジェクトの設定(Configuration タブ)で「Automatically scan images on push」をオンにするだけです。スキャン後、各イメージの脆弱性件数がダッシュボードに表示されます。
さらに、特定の深刻度(Critical / High)の脆弱性が検出されたイメージの pull をブロックする設定もできます(「Prevent vulnerable images from running」)。本番環境の品質ゲートとして有効です。

Configuration 画面では認証モード(Database・LDAP・OIDC)の切り替えや、セルフ登録の許可/不許可なども設定できます。チーム利用では LDAP や OIDC(GitHub・Keycloak 等)と連携すると、ユーザー管理が楽になります。
よくあるエラーと解決策
①「http: server gave HTTP response to HTTPS client」エラー
Docker クライアントがデフォルトで HTTPS を使おうとするため発生します。
http: server gave HTTP response to HTTPS client
→ 解決: /etc/docker/daemon.json に insecure-registries を追加して docker を再起動
$ echo ‘{“insecure-registries”:[“registry.example.com”]}’ \
| sudo tee /etc/docker/daemon.json
$ sudo systemctl restart docker
②「No space left on device」でコンテナが起動しない
Harbor の8コンポーネントは合計で数GB のイメージを必要とします。docker system df でディスク使用量を確認し、docker system prune で不要リソースを削除してください。
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 65 22 42.25GB 25.76GB (60%)
Build Cache 104 0 2.163GB 2.163GB
$ docker builder prune -f
Total reclaimed space: 2.163GB
$ docker image prune -f
③ harbor.yml 変更後に設定が反映されない
harbor.yml を変更したら必ず sudo ./prepare を再実行してから docker compose up -d してください。prepare を省略すると古い設定ファイルのままで起動してしまいます。
$ sudo docker compose down
$ sudo ./prepare
$ sudo docker compose up -d
④ harbor-portal が Restarting を繰り返す
docker logs harbor-portal で確認すると「host not found in upstream ‘portal:8080’」と出ることがあります。これはコンポーネント間の名前解決に失敗しているサインです。sudo ./prepare で設定を再生成してから起動し直すと解決することが多いです。
Harbor をVPSで本番運用するなら
Harbor を本番環境で使う場合、最低 2vCPU・4GB RAM・40GB SSD 構成のVPSを推奨します。Vultr の $24/月プラン(4GB RAM)は Harbor の要件を満たしており、東京リージョンがあるため国内から低遅延でアクセスできます。
VPS の初期設定から Docker のインストールまでの手順は、以下の記事で詳しく解説しています:
まとめ
Harbor on Ubuntu のセットアップ手順をまとめます:
- Harbor は CNCF 卒業プロジェクトの本格プライベートレジストリ。脆弱性スキャン・RBAC・監査ログを標準搭載
- Ubuntu 24.04 の
docker.io 29.1.3(apt install docker.ioで取得)が動作要件を満たす(2026年6月実測) - インストールは「harbor.yml 設定 →
./prepare→docker compose up -d」の3ステップ - Robot Accounts を使えば CI/CD パイプラインから安全にイメージを push できる
- 本番では HTTPS(Let’s Encrypt など)を必ず設定し、管理者パスワードも初日に変更する


コメント