Harbor on Ubuntu — エンタープライズ向けプライベートDockerレジストリ構築

コンテナ

プライベート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 時に自動スキャンできる

目次

  1. Harbor とは何か
  2. 動作確認済み環境
  3. 前提:Docker のインストール
  4. Harbor インストーラのダウンロードと設定
  5. Harbor の起動と初期設定
  6. プロジェクト作成とイメージの Push
  7. Robot Accounts でCI連携を安全に
  8. 脆弱性スキャン(Trivy)の設定
  9. よくあるエラーと解決策
  10. まとめ

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 での運用を想定している方は、まず開発環境でお試しください。

Ubuntu 22.04 vs 24.04 の docker.io バージョン比較(実測)
Ubuntu 22.04 vs 24.04 の docker.io バージョン比較(実測)

前提:Docker のインストール

Harbor は Docker と Docker Compose の上で動きます。まず Ubuntu 24.04 に Docker をインストールします。

手順1:パッケージを更新してDockerをインストールする




ubuntu@vps: ~
$ sudo apt update && sudo apt upgrade -y
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 が収録されています。上記の実測データでも確認できました。

apt install docker.io の依存パッケージ(ubuntu:24.04 実測)
apt install docker.io の依存パッケージ(ubuntu:24.04 実測)

手順2:dockerグループに追加してsudoなしで使えるようにする




ubuntu@vps: ~
$ sudo usermod -aG docker $USER
$ 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 インストーラをダウンロード・展開する




ubuntu@vps: ~
$ HARBOR_VERSION=”v2.10.2″
$ 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カ所を編集します。




ubuntu@vps: ~/harbor
$ cp harbor.yml.tmpl harbor.yml
$ nano harbor.yml

編集する主な箇所は以下のとおりです:

harbor.yml の重要な設定箇所

hostname:Harbor にアクセスするときのドメイン名またはIPアドレス(例:registry.example.com192.168.1.10)。localhost は自分のマシンのみ有効です。

http.port:HTTP アクセスに使うポート。デフォルトは 80。VPS で使う場合は 80 のままで構いません。

harbor_admin_password:初期管理者パスワード。必ずデフォルトから変更してください

HTTPS を使わない場合は https: ブロック全体をコメントアウトします(本番では HTTPS を強く推奨)。

設定例(HTTP のみ、開発・検証用):




harbor.yml(抜粋)
# 必ず変更する1: ドメインまたはIPアドレス
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 スクリプトで設定ファイルを生成する




ubuntu@vps: ~/harbor
$ sudo ./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 …

./prepareharbor.yml の内容をもとに、8つのコンポーネント分の設定ファイルと docker-compose.yml を自動生成します。ここだけは順番を間違えると動きません。harbor.yml を変更したら必ず再度 ./prepare を実行してください。

手順6:Harbor を起動する




ubuntu@vps: ~/harbor
$ sudo docker compose up -d
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 v2.10.2 コンポーネント Dockerイメージサイズ(実測)
Harbor v2.10.2 コンポーネント Dockerイメージサイズ(実測)

Harbor の起動と初期設定

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

Harbor ログイン画面(v2.10.2 起動直後)
Harbor ログイン画面(v2.10.2 起動直後)

ログイン画面が表示されました。デフォルトの認証情報は以下のとおりです:

  • ユーザー名:admin
  • パスワード:harbor.yml に設定した harbor_admin_password の値

初回ログイン後、すぐに管理者パスワードを変更することを強く推奨します(右上のユーザーアイコン → 「Change Password」)。

Harbor プロジェクト一覧画面(admin でログイン後)
Harbor プロジェクト一覧画面(admin でログイン後)

ダッシュボードにはプロジェクト数・リポジトリ数・使用クォータがひと目でわかる形で表示されます。デフォルトで library という公開プロジェクトが作成されています。左サイドバーの Administration から各種管理機能にアクセスできます。

プロジェクト作成とイメージの Push

手順7:新しいプロジェクトを作成する

Harbor ではプロジェクトがイメージのグループ単位です。Docker Hub で言えば「ユーザー名」や「Organization名」に相当します。

  1. ダッシュボードの「NEW PROJECT」ボタンをクリック
  2. Project Name に myapp などを入力
  3. Access Level は「Private」を選択(チーム内だけに公開する場合)
  4. 「OK」をクリック

手順8:Docker クライアントから Harbor にログインする




developer@local: ~
# HTTP(non-TLS)の場合は insecure-registries に追加が必要
$ 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.ymlhttps: ブロックに証明書のパスを指定します。

手順9:イメージをタグ付けしてプッシュする




developer@local: ~
# ローカルにあるイメージを Harbor 向けにタグ付け
$ 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 を使うのがセキュアな設計です。

Harbor Robot Accounts 管理画面(Administration   data-src= Robot Accounts)” width=”1280″ height=”900″ />
Harbor Robot Accounts 管理画面(Administration > Robot Accounts)

Robot Account の作成手順:

  1. 左サイドバー → Administration → Robot Accounts
  2. 「NEW ROBOT ACCOUNT」ボタンをクリック
  3. Name に ci-push-bot などを入力
  4. Expiration に有効期限を設定(無制限は推奨しない)
  5. Permissions でプロジェクトとアクション(push/pull)を選択
  6. 「ADD」をクリック → このタイミングでのみシークレットが表示される



CI/CD パイプラインからの利用例
# Robot Account のユーザー名は「robot$名前」形式になる
$ 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」)。本番環境の品質ゲートとして有効です。

Harbor Configuration 画面(認証設定とセキュリティ設定)
Harbor Configuration 画面(認証設定とセキュリティ設定)

Configuration 画面では認証モード(Database・LDAP・OIDC)の切り替えや、セルフ登録の許可/不許可なども設定できます。チーム利用では LDAP や OIDC(GitHub・Keycloak 等)と連携すると、ユーザー管理が楽になります。

よくあるエラーと解決策

①「http: server gave HTTP response to HTTPS client」エラー

Docker クライアントがデフォルトで HTTPS を使おうとするため発生します。




ubuntu@local: ~
Error response from daemon: Get “https://registry.example.com/v2/”:
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 で不要リソースを削除してください。




ubuntu@vps: ~
$ docker system df
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 を省略すると古い設定ファイルのままで起動してしまいます。




ubuntu@vps: ~/harbor
# harbor.yml を変更したら必ずこの順番で
$ 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.3apt install docker.io で取得)が動作要件を満たす(2026年6月実測)
  • インストールは「harbor.yml 設定 → ./preparedocker compose up -d」の3ステップ
  • Robot Accounts を使えば CI/CD パイプラインから安全にイメージを push できる
  • 本番では HTTPS(Let’s Encrypt など)を必ず設定し、管理者パスワードも初日に変更する
著者アイコン
著者アイコン

Harbor は最初の設定が少し複雑ですが、一度動き出すと日常の運用は GUI でできてしまいます。特に Trivy の自動スキャンは「push したら即座に脆弱性レポートが出る」という体験が新鮮で、チーム内の意識も変わります。VPSに一台建てておくだけで、Docker Hub の無料プランの制限(プライベートリポジトリ数・pull rate limit)も気にならなくなりますよ。

コメント

タイトルとURLをコピーしました