第66回:Harborで始めるセルフホストDocker Registry(Ubuntu単一ノード実践設計編)

公開日:2026-03-02|前提:Ubuntu / インターネット接続あり / 単一ノード / ストレージはローカルディスク / 認証はローカルユーザーのみ
この記事の立ち位置:
「最初からHA・分散ストレージ・SSO統合」ではなく、まず“動く”を最短で作り、運用の現実(容量・バックアップ・更新)を掴むための手順と設計をまとめます。
Harborは重いですが、企業運用に必要な UI / RBAC / スキャン / 監査・運用機能 を最初から持てるのが強みです。

インデックス

  1. なぜ今、自社でレジストリを持つのか
  2. 今回の構成(Harbor単一ノード+ローカルディスク)
  3. 導入の前提と準備(OS/ネットワーク/ディスク)
  4. 導入コマンド具体例(Docker/Compose/Harbor)
  5. harbor.yml 具体例(最小構成:ローカルユーザー)
  6. 初期セットアップ(Project/ユーザー/Push-Pull確認)
  7. 運用の要点(バックアップ/GC/容量/更新)
  8. Harbor vs registry:2(実務目線)
  9. AI基盤とHarbor(MCP時代の“流通インフラ”)
  10. まとめ:未来志向で強く締める

1. なぜ今、自社でレジストリを持つのか

コンテナ運用が広がるほど、イメージは増え、更新頻度も上がります。外部レジストリ依存は便利ですが、 レート制限・仕様変更・障害・ポリシー変更の影響を受けやすいのが現実です。
そしてAI基盤(LLMサーバ、RAG、MCPサーバ、各種ワーカー)が増えると、イメージ配布は「運用の配管」になります。 レジストリは単なる保管庫ではなく、社内ソフトウェア流通の中核です。

2. 今回の構成(Harbor単一ノード+ローカルディスク)

今回は初期段階の現実解として、単一ノード+ローカルディスクで始めます。 「最初からS3互換や分散ストレージ」へ飛ばず、まずは運用の論点(容量、GC、バックアップ、更新)を押さえる設計です。

ポイント: 単一ノードはSPOF(単一障害点)です。だからこそバックアップ設計とリストア検証が最重要になります。

3. 導入の前提と準備(OS/ネットワーク/ディスク)

3.1 推奨ディスク構成(例)

Harborはイメージ層が増えるとストレージを食います。初期は小さく始めても、拡張前提で考えておくのが安全です。

3.2 ドメイン/TLSの考え方

本番運用を意識するならHTTPSは必須です。証明書は大きく2つ:

注意: 自己署名証明書の場合、各クライアントDockerにCA登録が必要です(後述)。

4. 導入コマンド具体例(Docker/Compose/Harbor)

4.1 Docker Engine(Ubuntu)

Docker公式リポジトリを使う例です(必要に応じて社内標準へ合わせてください)。

# 1) 依存
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

# 2) GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 3) repo
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4) install
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 5) 動作確認
docker version
docker compose version
補足: ログインユーザーでdockerを叩きたい場合は docker グループに追加します(運用ルールに合わせてください)。
sudo usermod -aG docker $USER
# 反映には再ログインが必要

4.2 Harborのダウンロードと展開(オンラインインストーラ)

Harborはバージョンによってファイル名が変わるため、ここでは <HARBOR_VERSION> を変数として書きます。
(例:v2.x.y のような形式)

# 作業ディレクトリ例
sudo mkdir -p /opt/harbor
cd /opt/harbor

# 例:Harbor Online Installer を取得(URLはバージョンで変わります)
# curl -LO https://github.com/goharbor/harbor/releases/download/<HARBOR_VERSION>/harbor-online-installer-<HARBOR_VERSION>.tgz

# 展開
tar -xzf harbor-online-installer-*.tgz
cd harbor

4.3 データディレクトリ作成(ローカルディスク)

sudo mkdir -p /data/harbor
sudo chown -R root:root /data/harbor
sudo chmod 700 /data/harbor

5. harbor.yml 具体例(最小構成:ローカルユーザー)

多くの環境では harbor.yml.tmpl をコピーして編集します。 以下は単一ノード・ローカルディスク・ローカルユーザー認証で始めるための例です。 パスやドメインはあなたの環境に置き換えてください。

# /opt/harbor/harbor/harbor.yml (例)
hostname: harbor.example.local

http:
  port: 80

https:
  port: 443
  certificate: /etc/ssl/certs/harbor.crt
  private_key: /etc/ssl/private/harbor.key

harbor_admin_password: "CHANGE_ME_STRONG_PASSWORD"

database:
  password: "CHANGE_ME_DB_PASSWORD"
  max_idle_conns: 50
  max_open_conns: 100

data_volume: /data/harbor

# ログ(初期はINFOでOK。トラブル時はDEBUGへ)
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor

# Trivy(脆弱性スキャン)。インターネット接続ありなら有効にする価値が高い
trivy:
  ignore_unfixed: true
  severity: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL"

# 初期段階は外部認証を入れない(ローカルユーザーのみ)
TLS証明書の置き場所:
上の例では /etc/ssl/certs/harbor.crt/etc/ssl/private/harbor.key を参照しています。
公開CA(Let's Encrypt)を使う場合は、そこへのパスに合わせて指定します。

6. 初期セットアップ(Project/ユーザー/Push-Pull確認)

6.1 インストール実行

# /opt/harbor/harbor/harbor で
sudo ./install.sh

起動確認:

docker ps --format "table {.Names}	{.Status}	{.Ports}"

6.2 自己署名証明書の場合:Dockerクライアント側のCA登録

クライアント(Harborにpush/pullする側)で以下のように登録します。

sudo mkdir -p /etc/docker/certs.d/harbor.example.local
sudo cp /path/to/harbor-ca.crt /etc/docker/certs.d/harbor.example.local/ca.crt
sudo systemctl restart docker

6.3 ログインとpush/pull確認

docker login harbor.example.local

# 例:projectを "demo" とした場合
docker tag hello-world:latest harbor.example.local/demo/hello-world:latest
docker push harbor.example.local/demo/hello-world:latest
docker pull harbor.example.local/demo/hello-world:latest
初心者向け補足:
Harborは「プロジェクト(Project)」単位で権限とリポジトリを管理します。最初にProjectを作ってからpushするのが基本です。

7. 運用の要点(バックアップ/GC/容量/更新)

7.1 バックアップ(最小セット)

“単一ノード+ローカルディスク”の成否はバックアップで決まります。最低限:

# 例:harbor-db コンテナ名は環境で違う場合があるので docker ps で確認
docker ps | grep -i harbor

# DB dump(例)
docker exec -t harbor-db pg_dump -U postgres -d registry > harbor_db_$(date +%F).sql

# データ領域のバックアップ(例:rsyncやtar)
sudo tar -czf harbor_data_$(date +%F).tgz /data/harbor
注意: 「バックアップを取った」だけでは不十分です。
リストアして動くこと(復旧手順の確立)までが運用です。初期段階ほど、早めに1回リストア訓練を推奨します。

7.2 Garbage Collection(GC)

イメージを消しても、レイヤ(blob)が即座に物理削除されないケースがあります。 そのため、定期GCと、イメージ削除ポリシー(タグ運用)をセットで設計します。

7.3 容量監視(最初から入れる)

# 単純な確認
df -h
du -sh /data/harbor/*

監視は最初は軽くてOKですが、容量逼迫は突然きます。初期から「何が増えているか」を見える化しておくと事故が減ります。

7.4 更新(アップグレード)戦略

Harborはコンポーネントが多いので、更新前に必ず:

初期段階は、まず「更新できる運用プロセス」を作ることが最大の価値です。

8. Harbor vs registry:2(実務目線)

registry:2 は軽量ですが、企業運用で欲しくなる機能(RBAC、スキャン、UI、監査、レプリケーション)を自前で積み上げがちです。 初期からHarborを選ぶと、運用の“欲しい”が早く揃い、後戻りが減ります。

9. AI基盤とHarbor(MCP時代の“流通インフラ”)

第65回で扱ったMCPの流れでは、AIは既存システムを「読む」だけでなく「実行」へ進みます。
実行系のサービスが増えるほど、コンテナのビルド・配布・更新が増えます。Harborはその土台になります。

要点: AI基盤が育つと、レジストリは“脇役”から“中核”になります。
だからこそ初期段階から、運用可能な形でセルフホストしておく価値が大きいのです。

10. まとめ:未来志向で強く締める

レジストリは単なる補助的インフラではありません。

企業のコンテナ戦略、そしてAI基盤の根幹を支える中核です。
重要なのは「最新技術を導入したか」ではなく、既存資産を理解し、現実的な構成から始め、将来拡張できる運用設計を持てるかどうかです。

現場には、さまざまな技術スタックで作られた既存システムが必ず存在します。
だからこそ、最新だけでなく古い技術も活かし、土台を壊さずに“前へ進める”経験値のある開発会社を選ぶことが重要です。

ビットオンは、レガシーから最新クラウド/AI基盤まで幅広い技術領域で培った実装経験をもとに、 既存資産を活かしたまま、Harbor・CI/CD・オンプレ環境を現実的に統合し、運用まで含めた仕組みを提供します。

システムを作り直すのではなく、進化させる。
その第一歩として、レジストリを“自社の基盤”として持つことが、これからの競争力になります。