Harbor でプロキシ機能付きプライベート Docker レジストリを自前構築する
はじめに
ある時期(||正確には覚えていない||)から、中国本土のサーバーは Docker Hub(docker.io)に直接接続できなくなった。これはすべての本土サーバーにとって痛手だが、幸いプロキシサービスも増えてきており、完全に使えなくなるというほどではない
しかし、Docker Hub と同じ境遇にある、GitHub が提供する Docker イメージサービス ghcr.io には、プロキシサービスを提供しているところがほとんどない。たとえあっても、プライベートリポジトリにはアクセスできない(これはほぼログインできないことが原因だ)
2つのプロジェクトで ghcr を使い、しかもプライベートにしていたため、本土サーバーではまったくプルできないか、プルが非常に遅く、本土サーバーで分流ができない状態だった。ずっと ghcr のプロキシ方法を探し求めていたところ、ちょうど先日 Harbor というエンタープライズ向け Docker プライベートレジストリを見つけたので、試しに構築してみた
EP0:事前準備
サーバーの準備
まず必要なもの:
- サーバー1台。できれば Linux が良く、Windows は避けたほうが良い
- SSH リモートツール。Termius、Tabby、XShell など(ローカルデプロイなら不要)
- ドメイン(推奨)。中国本土でデプロイする際にドメインを使う場合は、事前に备案(ICP届出)が必要
Harbor は Docker 上で動作するプログラムなので、サーバーには事前に Docker をインストールしておく必要がある。サーバーが中国本土にある場合は、事前にプロキシも設定しておかないと後続の手順が失敗する。そのための選択肢は以下の通り:
インストールパッケージのダウンロード
Harbor Releases を開くと、Release に次のような内容が見える

harbor-offline-installer-v<バージョン番号>tgz はオフラインインストールパッケージ、harbor-online-installer-v<バージョン番号>tgz はオンラインインストールパッケージだ。実際の最新バージョンに合わせてデプロイしてほしい
本チュートリアルではオンラインバージョンを使う。サーバーがどうしても Docker Hub に接続できない場合はオフラインバージョンを使ってほしい。両者の使い方に違いはなく、違いはオンラインインストールパッケージが Docker Hub からイメージをプルしてからデプロイする点で、比較的軽量で、ローカルファイルもきれいになる
ファイルをサーバーにダウンロードして解凍すると、harbor というフォルダが増えている
harbor フォルダに入り、ディレクトリに以下の内容が(一つも欠けずに)あれば、これで第一歩は完了だ

すべてのファイル
EP1:設定
harbor.yml.tmpl を harbor.yml にリネーム
harbor.yml.tmpl をコピーして名前を harbor.yml に変更する。ファイル名を直接変更しないこと。誤って内容を削除してしまうと重大な結果になる
cp harbor.yml.tmpl harbor.yml
パスワードの変更
harbor.yml に入る:
vim harbor.yml
harbor_admin_password を見つける

Harbor12345 を別の文字列に変更する。この文字列はよく覚えておくこと。後で Web コンソールにログインする Admin アカウントの初期パスワードになる
また、database.password も別の文字列に変更することを推奨する(下図の位置)。この文字列は Harbor がデプロイするデータベースのアクセスパスワードになるが、覚えておく必要はない

アクセスアドレスの変更
harbor.yml の上部で hostname を見つける

hostname を実際のアクセスアドレスに変更する。必ずしもドメインである必要はなく、サーバーの IP でもよい
ポートの設定
いろいろな事情により、おおむね3つのケースがある:
harbor.yml を保存
以上の設定が終わったら、esc を押して :qw と入力する。これで harbor.yml の変更は完了だ
EP2:インストールスクリプトの実行
コマンドラインで以下のコマンドを実行する
bash install.sh
これでインストール手順に入る
Harbor has been installed and started successfully. と表示されたら、インストールは完了だ

同時にサービス全体が稼働し始めている
EP4:Web ページへのアクセス
2と4の間の数字が数えられない
設定した hostname と prot に従って、ブラウザで Harbor にアクセスする
すると次のような画面が見える

ログインする。初期アカウント(Admin アカウント)のユーザー名は admin、パスワードは先ほど設定した harbor_admin_password だ
ログインすると、次のような画面が見える

これで Harbor サービス全体が正常に稼働していることが確認できた
EP5:セキュリティ操作
Admin アカウントのパスワード変更
harbor.yml でデフォルトのパスワードを変更済みだが、安全のため Web 側でも一度パスワードを変更しておく
右上のユーザーアイコンをクリックし、修改密码(パスワード変更)をクリックする。表示されたフォームの必須項目をすべて入力すればよい

新規ユーザーの作成
必ずしも新規ユーザーを作る必要はないが、安全のため、Docker でアカウントにログインする専用の新規ユーザーを作成することを推奨する
左側の 用户管理(ユーザー管理)をクリックし、创建用户(ユーザー作成)をクリックする。表示されたフォームの必須項目をすべて入力すればよい

EP6:Docker でログイン
コマンドラインで入力する:
docker login <hostname>:<port>
すると対話式の入力画面が表示される

まず Username(ユーザー作成時に設定したユーザー名)を入力して Enter、次に Passport(ユーザー作成時に設定したパスワード。入力内容は表示されない)を入力して Enter を押す
アカウントとパスワードが正しければ、以下の内容が表示される

これでサーバーと Harbor が接続され、プッシュもプルも(プライベートリポジトリ含む)問題なく行える
EP-S-1:プロキシの設定
他のサービスとの連携
Harbor の Web ページにログインしたら、左側の 仓库管理(レジストリ管理)をクリックし、新建目标(新規ターゲット)をクリックする

すると 新建目标(新規ターゲット)ウィンドウが表示される
提供者(プロバイダー)のオプションを調整すると、12個の選択肢がある

harbor か Docker Registry を選ぶ場合は、対応するサービスのアドレス(つまり 目标URL(ターゲットURL))を入力する必要がある。これら以外の選択肢を選ぶ場合は、対応するサービスのアドレスを入力する必要はない
ここでは GitHub GHCR を例にする(Google GCR ではない。よく見てほしい。この2つのアドレスは1文字しか違わない)

(GitHub のアクセストークンの取得方法については、https://github.com/settings/tokens を参照)
設定が終わったら OK をクリックする
プロジェクトの設定
「プロジェクト」とは何か?Harbor では、プロジェクトは独立した保存場所のようなもので、イメージの保存先を指す。アクセス管理(つまりイメージが公開かプライベートか)は各イメージごとではなく、各プロジェクトごとに決まる。これは多くの Docker クラウドサービスとは異なる点だ
左側の 项目(プロジェクト)をクリックし、新建项目(新規プロジェクト)をクリックする


そして OK をクリックすれば、プロジェクトの設定は完了だ

END:イメージのプル
ghcr.io と、上の図で設定したプロジェクト名 ghcr を例にする。元のアドレスが
ghcr.io/NiuBoss123/114514:latest
だとすると、Harbor のプロキシを経由した後、アドレスは次のようになる
<hostname>:<port>/ghcr/NiuBoss123/114514:latest
つまり ghcr.io を <hostname>:<port>/ghcr に置き換えるだけだ
以降の操作は元のアドレスと同じでよい
あとがき
プロキシのためだけに Harbor を構築するのは大げさすぎるだろうか?個人的には確かに大げさだと思う 。しかし、エンタープライズ向け Docker レジストリとしての地位を考えれば、不思議ではないだろうつまりは何か弄りたかっただけ
なぜ Docker Registry を使わないのかと言う人もいるだろう。あれは本質的にただのストレージで、Web コンソールもプロキシ機能もなく、自分でイメージをアップロードする必要がある。やはり面倒だと思う(Harbor も同じくらい面倒だが、Harbor のほうがちょっと賢いやり方ではある )本当に賢いのか
関連リンク
- Harbor 公式サイト:goharbor.io
- Harbor GitHub リポジトリ:goharbor/harbor
(このチュートリアルの作成中、いかなるドメインも傷つけられなかった)