このプロジェクトについて
Unregistryは、Dockerデーモンのストレージ(containerdイメージストア)から直接イメージを保存および提供する軽量なコンテナイメージレジストリです。マシン間でイメージを移動する際に外部レジストリを不要にすることを目的として設計されています。
このプロジェクトには、Docker CLIプラグインコマンドである`docker pussh`(余分な's'はSSHを意味します)が含まれており、SSH経由でリモートのDockerサーバーに直接イメージをプッシュします。リモート側に存在しないレイヤーのみが転送されるため、READMEではこの操作が高速かつ効率的であると説明されています。
READMEによると、その仕組みは次のとおりです。コマンドはリモートサーバーへのSSHトンネルを確立し、そこに一時的なunregistryコンテナを起動し、ランダムなローカルホストポートをトンネル経由でunregistryポートに転送し、その転送されたポートを通じて`docker push`をunregistryに対して実行し(リモートにまだ存在しないレイヤーのみを転送)、その後unregistryコンテナを停止してトンネルを閉じます。転送されたイメージはリモートのDockerデーモンで利用可能になります。READMEはこのアプローチをDockerイメージ向けのrsyncに例えています。
動機:READMEには一般的な代替手段とその欠点が列挙されています。公開レジストリ(コードの露出や有料のプライベートリポジトリ)、自己ホスト型レジストリ(維持とセキュリティ保護が必要な追加サービス)、`docker save | ssh ... docker load`(リモートにほとんどのレイヤーが既に存在する場合でもイメージ全体を転送)、およびリモートでの再ビルド(時間とリソースの無駄)。Unregistryは元々、複数のDockerホストにコンテナをデプロイするためのツールであるUncloudのために作成されました。
要件:ローカルでは、プラグインサポート付きのDocker CLI(Docker 19.3以降)とOpenSSHクライアントが必要です。リモートサーバーでは、Dockerがインストールされ実行されていること、SSHユーザーがdockerコマンドを実行できること(rootまたはdockerグループのユーザー)、sudoが必要な場合はパスワードなしの`sudo docker`が必要です。サーバーは初回使用時にunregistryイメージをプルするため、ghcr.ioへのインターネットアクセスが必要です。ただし、エアギャップ環境や制限された環境向けにイメージを手動で事前ロードする場合を除きます。unregistryコンテナは、/run/containerd/containerd.sockにあるcontainerdソケットへのアクセスが必要で、rootとして実行されます。
文書化されたインストールオプション:Homebrew(`brew install psviderski/tap/docker-pussh`、さらに~/.docker/cli-pluginsへのシンボリックリンク)、プラグインディレクトリへのdocker-pusshスクリプトの直接ダウンロード、および別のリポジトリで保守されている非公式のDebianパッケージ。Windowsは現在サポートされていませんが、Linuxの手順を使用したWSL 2が推奨されています。インストールは`docker pussh --help`で確認できます。
注目すべき設定トピックは、containerdイメージストアです。Unregistryはイメージをcontainerdのイメージストアに保存しますが、デフォルトではDockerは独自の別のストレージレイヤーを保持します。Dockerでcontainerdイメージストアを有効にすると、プッシュされたイメージは重複なしで即座にDockerで利用可能になり、pussh操作が高速化されます。有効にしない場合、pusshはリモートホストで追加の`docker pull`を実行し、イメージは2回保存され、管理されていないcontainerdイメージが蓄積される可能性があります。READMEでは、手動クリーンアップのために`ctr -n moby images ls`と`ctr -n moby images rm`を示しています。containerdイメージストアを有効にすると、クラシックなストレージドライバで作成されたイメージとコンテナが一時的に失われることが文書化されています。
使用例には、リモートホストへのプッシュ、`-i`を使用したSSHキー認証、カスタムSSHポート、`-F`を使用したカスタムSSH設定ファイル、マルチプラットフォームイメージのプラットフォーム選択(ローカルでcontainerdイメージストアが必要)、およびUNREGISTRY_IMAGE環境変数によるunregistryイメージバージョンの上書きが含まれます。文書化されたユースケースは、本番サーバーへのデプロイ、CI/CDパイプライン、ホームラボまたはエアギャップ環境です。Unregistryは、containerdソケットをマウントすることで、ポート5000のローカルレジストリとしてスタンドアロンで実行することもできます。
READMEはサードパーティプロジェクトへのリンクを提供しています:docker-pusshでイメージをプッシュするGitHub Action、プラグインをインストールするGitHub Action、および自己ホスト型レジストリ内のイメージをクリーンアップするPythonツール。containerdイメージストアをレジストリバックエンドとして使用するためのインスピレーションとしてSpegelを、unregistryが基づいているレジストリ実装としてDocker Distributionをクレジットしています。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.