ドッカー・ハブOCIアーティファクト・サポートの発表

Docker Hub があらゆる種類のアプリケーション アーティファクトの配布に役立つようになったことをお知らせします。 複数のレジストリを活用することなく、すべてを 1 か所に保持できるようになりました。

これまでは、Docker Hub を使用してコンテナー イメージ (またはコンテナー ランタイムで使用できる成果物) を格納および配布することしかできませんでした。 コンテナイメージの配布はアプリケーション配信の氷山の一角にすぎないため、これはプラットフォームの制限になりました。 現在、最新のアプリケーション配信には、さまざまな種類のアーティファクトが必要です。

開発者は、各プロジェクトに計り知れない価値を追加するため、これらを必要とするクライアントと共有することがよくあります。 また、OCIワーキング・グループは最新のOCIアーティファクト仕様のリリースでビジー状態ですが、その間、アプリケーション・ アーティファクトOCIイメージ としてパッケージ化する必要があります。 

Docker Hub はイメージ レジストリとして機能し、アプリケーション アーティファクトの配布に最適です。 そのため、OCIイメージとしてパッケージ化されたソフトウェア・アーティファクトのサポートをDocker Hubに追加しました。

オープン・コンテナ・イニシアティブ(OCI)とは何ですか?

2015 年には、コンテナー イメージ形式、コンテナー ランタイム、イメージ配布を標準化するためのオープン ガバナンス構造として Open Container イニシアチブ確立を支援し ました。

OCIは、いくつかのコア仕様を維持します。 これらは以下を管理します。

  • ファイルシステムバンドルをパッケージ化する方法
  • コンテナ化されたクロスプラットフォームアプリを起動する方法
  • パッケージ化されたコンテンツをリモート クライアントがアクセスできるようにする方法

ランタイム 仕様 は、OCIイメージとランタイムの相互作用を決定します。 次に、イメージ 仕様 では、OCIイメージの作成方法の概要を説明します。 最後に、配布 仕様では 、コンテンツ配布を相互運用可能にする方法を定義します。

OCIの全体的な目的は、透明性、ランタイム予測可能性、ソフトウェアの互換性および配布を強化することです。 それ以来、独自のコンテナ・フォーマットと runC OCI準拠ランタイムをOCIに提供し、さらに OCI準拠配布プロジェクトを CNCFに提供しました。

OCIサポートを追加する理由 

コンテナー イメージは、コンテナー化されたアプリケーションのビルドをサポートするために不可欠です。 画像はプロジェクト間で蓄積されるため、リソースを効率的に管理するには一元化されたクラウドストレージが不可欠であることがわかっています。 開発者は、ローカルストレージに依存したり、これらのリソースに簡単にアクセスできるかどうか疑問に思ったりする必要はありません。 ただし、開発者がさまざまなアーティファクトをDocker Hub内に保存したいこともわかっています。 

アーティファクトを Docker Hub に保存すると、「どこからでもアクセス」できるようになると同時に、Docker Hub の標準共有機能を通じてコラボレーションを向上させることができます。 これにより、ユーザーがアプリケーション配信の主要な部分をより細かく制御できるようにすることで、OCIのコンテンツ配信ミッションとより緊密に連携します。

さまざまなOCIアーティファクトを管理するにはどうすればよいですか。

Helmチャート用の Helm CLI や任意のコンテンツ・タイプのOCIストレージ としてのレジストリ(ORAS)CLI など、コンテナ以外のOCIアーティファクトの管理に役立つ専用ツールを使用することをお薦めします。

Docker HubでのOCIサポートを紹介するために、いくつかのユースケースを見ていきましょう。

Helm チャートの操作

Helm チャートのサポートは最も要望の多かった機能でしたが、Docker Hub に正式に追加されました。では、どのように活用しますか? 単純な Helm チャートを作成し、それを Docker Hub にプッシュします。 このプロセスは、HelmチャートをOCIイメージとしてレジストリに保存するための Helmの公式ガイド に従います。

まず、Helm チャートを作成します demo

$ helm create demo

これにより、編集可能なファイルの使い慣れた Helm チャート定型文が生成されます。

demo
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│   	└── test-connection.yaml
└── values.yaml

3 directories, 10 files

編集が完了したら、HelmチャートをOCIイメージとしてパッケージ化する必要があります:

$ helm package demo

Successfully packaged chart and saved it to: /Users/martine/tmp/demo-0.1.0.tgz

Helm チャートをプッシュする前に、Docker Hub にログインすることを忘れないでください。 このために個人用 アクセス トークン (PAT) を作成することをお勧めします。 次のように、環境変数を使用して PAT をエクスポートし、ログインできます。

$ echo $REG_PAT | helm registry login registry-1.docker.io -u martine --password-stdin

Helm チャートのプッシュ

これで、最初の Helm チャートを Docker Hub にプッシュする準備ができました。 ただし、最初に、Helm チャートの宛先名前空間への書き込みアクセス権があることを確認してください。 この例では、名前空間に docker プッシュしましょう。

$ helm push demo-0.1.0.tgz oci://registry-1.docker.io/docker

Pushed: registry-1.docker.io/docker/demo:0.1.0
Digest: sha256:1e960ad1693c234b66ec1f9ddce80986cbf7159d2bb1e9a6d2c2cd6e89925e54

Helm チャートの表示とフィルターの使用

これで、Docker Hubにログインしてリポジトリの詳細に移動する demo と、リポジトリタグのリストにHelmチャートが表示されます。

ヘルム型ドッカーハブ

タグをクリックすると、Helm チャート ページに移動できます。 このページには、便利な Helm CLI コマンドが表示されます。

ヘルム CLI コマンド

リポジトリのコンテンツ管理が簡単になりました。 コンテンツ タイプ別にリポジトリ リストをすばやくフィルター処理するドロップダウン ボタンを追加することで、コンテンツの見つけやすさが向上しました。 [コンテンツ] ドロップダウンをクリックして、リストから選択 Helm するだけです。

ヘルムタイプの選択

ボリュームの操作

開発者は、Docker エコシステム全体でボリュームを使用して、データベース ファイルなどの任意のアプリケーション データを共有します。 最近リリースした Volume Backup & Share 拡張機能 を使用して、ボリュームを既にバックアップできます。 リポジトリをフィルタリングして、同じドロップダウンメニューを使用してボリュームを含むリポジトリを見つけることもできます。

ただし、ボリューム・バックアップ&共有がボリュームをイメージではなくOCIアーティファクトとしてプッシュするまで(近日公開予定)、 ORAS CLIを使用してボリュームをプッシュできます。

手記: ORAS CLIバージョン0.15以降は、 完全なOCIレジストリ・クライアント機能を提供するため、これらを推奨します。

ORAS CLI で文書化された例を反映した簡単なユースケースを見ていきましょう。まず、ボリュームとしてパッケージ化する単純なファイルを作成します。

$ echo "bar" > foo.txt

Docker Hubがこのボリュームを認識するには、作成時にOCIイメージにファイルをアタッチ config し、特定のメディア・タイプでマークする必要があります。 ファイルには任意のコンテンツを含めることができるため、作成しましょう。

$ echo "{\"name\":\"foo\",\"value\":\"bar\"}" > config.json

この手順が完了すると、ボリュームをプッシュする準備が整いました。

音量を上げる

ここで魔法が起こります。 Docker HubがOCIイメージをボリュームとして正常に認識するために必要なメディア・タイプは、 application/vnd.docker.volume.v1+tar.gzです。 メディアの種類を構成ファイルに添付し、次のコマンド (およびその結果の出力) を使用して Docker Hub にプッシュできます。

$ oras push registry-1.docker.io/docker/demo:0.0.1 --config config.json:application/vnd.docker.volume.v1+tar.gz foo.txt:text/plain

Uploading b5bb9d8014a0 foo.txt
Uploaded  b5bb9d8014a0 foo.txt
Pushed registry-1.docker.io/docker/demo:0.0.1
Digest: sha256:f36eddbab8459d0ad1436b7ca8af6bfc512ec74f45d8136b53c16db87562016e

リポジトリには、次の内訳に示すように、 demo 2 種類のコンテンツがあります。

ボリューム コンテンツ タイプの一覧

コンテンツ ページに移動すると、今後のイテレーションで拡張される基本情報が表示されます。 これにより、ボリュームの内容の可視性が向上します。

ボリュームの詳細

汎用コンテンツ タイプの処理

ORAS CLI を使用してボリュームをプッシュするときにメディアタイプを使用しない application/vnd.docker.volume.v1+tar.gz 場合、Docker Hub はアーティファクトを汎用としてマークして、認識されたコンテンツと区別します。

同じボリュームをプッシュしますが、Docker Hubで認識されているメディアタイプの代わりにメディアタイプを使用し application/vnd.random.volume.v1+tar.gz ましょう。

$ oras push registry-1.docker.io/docker/demo:0.1.1 --config config.json:application/vnd.random.volume.v1+tar.gz foo.txt:text/plain

Exists	7d865e959b24 foo.txt
Pushed registry-1.docker.io/docker/demo:0.1.1
Digest: sha256:d2fb2b176ee4e326f1f34ecdaede8db742f2c444cb2c9ceff0f5c8b743281c95

新しいコンテンツにジェネリック Other 型が割り当てられていることがわかります。 タグ付けされたコンテンツのメディアタイプは、タイプラベルにカーソルを合わせると引き続き表示できます。 この場合、それは:application/vnd.random.volume.v1+tar.gz

その他のコンテンツ タイプ リスト

Helm チャートとボリュームの両方を含むリポジトリをフィルター処理する場合は、右上隅にある同じドロップダウン メニューを使用します。

ボリュームタイプの選択

コンテナイメージの操作

最後に、通常のコンテナイメージを他のアーティファクトとまったく同じリポジトリにプッシュし続けることができます。 たとえば、Redis Docker 公式イメージにタグを付け直し、Docker Hub にプッシュするとします。

$ docker tag redis:3.2-alpine docker/demo:v1.2.2

$ docker push docker/demo:v1.2.2

The push refers to repository [docker.io/docker/demo]
a1892d5d1a6d: Mounted from library/redis
e41876edb6d0: Mounted from library/redis
7119119b7542: Mounted from library/redis
169a281fff0f: Mounted from library/redis
04c8ef03e935: Mounted from library/redis
df64d3292fd6: Mounted from library/redis
v1.2.2: digest: sha256:359cfebb00bef01cda3bc1ca453e6455c770a246a06ad8df499a28118c144eda size: 1570

コンテナイメージの表示

Docker Hub のリポジトリ ページにアクセスする demo と、すべてのアーティファクトが [ タグとスキャン] の下に一覧表示されます。

すべてのアーティファクトのコンテンツ リスト

また、アプリケーションのコンテンツをより適切に整理できるように、まもなくさらに多くの機能が導入される予定ですので、今後の発表にご期待ください。

その他の最新情報については、フォローしてください

すべての開発者は、Docker Hub を使用してアプリケーションを構築および配布しながら、より堅牢なアーティファクトのセットにアクセスして選択できるようになりました。 これにより、既存の障害が取り除かれるだけでなく、さらにエキサイティングなアプリケーションを作成して配布できるようになることを願っています。

しかし、私たちの使命はここで終わりません! OCIサポートの強化に継続的に取り組んでいます。 OCIアーティファクト仕様 はリリース候補と見なされますが、OCI参照タイプおよび付随する リファラーAPI に対するDocker Hubの完全なサポートが間近に迫っています。 今後の機能強化、リポジトリ編成の改善などにご期待ください。

手記: OCIアーティファクトがOCIイメージ仕様から削除されました。 詳細については、 この更新プログラム を参照してください。