1 ポイント 投稿者 GN⁺ 2024-07-13 | 1件のコメント | WhatsAppで共有

S3をコンテナレジストリとして使う

  • この4か月間、Outerboundsと協力してカスタムコンテナイメージビルダーを開発してきた
  • S3をコンテナレジストリとして使えることを発見した
  • S3バケットをHTTPで公開し、特定のパスにイメージをアップロードすると、docker pullコマンドでイメージを取得できる

デモ

  • cowsayを実行するコンテナイメージを作成し、S3バケットにアップロードした
  • R2を使って無料のegressを提供している
  • R2とS3はAPI互換である
$ docker run --rm pub-40af5d7df1e0402d9a92b982a6599860.r2.dev/cowsay

なぜS3を使うのか?

  • 従来はDockerHub、GitHub Container Registry、ECRなどを使う
  • S3にはアップロード速度で大きな利点がある
  • ECRとS3のアップロード速度を比較した結果、S3は最大8倍高速だった

S3がより速い理由

  • S3では単一レイヤーのチャンクを並列にアップロードできる
  • ECRはOCI Distribution Specに準拠しているため、順番にアップロードする必要がある
  • 並列アップロードできないECRは帯域幅を十分に活用できない

S3はコンテナレジストリではない

  • S3は厳密にはコンテナレジストリではない
  • docker pullコマンドはHTTPリクエストを通じてファイルをダウンロードする
  • S3バケットを適切に構成すれば、コンテナレジストリとして使える

注意事項

  • この方法は非常に実験的である
  • 既存のコンテナレジストリの機能は提供しない(例: セキュリティスキャン、アクセス制御など)
  • さらなる調査が必要である

PS. クジラは?

  • Dockerロゴを参照しろというジョークである

GN⁺のまとめ

  • この記事はS3をコンテナレジストリとして使う方法を説明している
  • S3の高速なアップロード速度を活用できる
  • 既存のコンテナレジストリの機能は提供しないため注意が必要である
  • 実験的だが興味深いアプローチである
  • 類似の機能を提供する他のプロジェクトとしてはDockerHub、GitHub Container Registry、ECRなどがある

1件のコメント

 
GN⁺ 2024-07-13
Hacker News の意見
  • OCI Distribution 仕様が静的ファイルをサポートしてくれるとよい、という意見がある

    • シンプルな HTTP サーバーやファイルプロトコルを直接使えるようになる
    • すべてのメタデータはすでにマニフェストに含まれている
    • Content-Type: octet-stream でうまく動作する可能性がある
  • OCI Distribution 仕様は設計があまり良くない、という意見がある

    • レイヤーのプッシュは順番に行う必要がある
    • DockerHub と GHCR ではチャンクアップロードが正常に動作しない
    • Content-Range の値の形式が RFC7233 の形式と一致していない
    • タグ一覧のページネーションを標準化する機会を逃した
  • Cloudflare が R2 を使ったコンテナレジストリサーバーをオープンソース化した、という情報がある

    • 試した人がいるか気になっている
  • OCI 仕様でレイヤーのプッシュを順番に行う必要がある理由を知りたい、という意見がある

    • 単一レイヤーの内容は順番にプッシュしなければならない
    • 複数レイヤーを並列でプッシュすることは可能である
  • Nexus を使う理由と、その長所・短所についての意見がある

    • 多様なパッケージとリポジトリをサポートしている
    • 設定やリソース消費が煩雑である
    • Docker pull リクエストは単純な HEAD と GET リクエストで構成されている
    • もっとシンプルなコンテナレジストリが不足していることに驚いている
  • CNCF の Distribution が、Cloudfront の署名付き URL を通じて S3 からレジストリをバックアップする機能をサポートしている、という情報がある

  • S3 と R2 のコストへの言及がないのが残念、という意見がある

  • ECR はイメージレイヤーを複数のパートに分けてアップロードすることをサポートしている、という情報がある

    • 関連 API:
      • InitiateLayerUpload API: 各イメージレイヤーのアップロード開始時に呼び出す
      • UploadLayerPart API: 各レイヤーチャンクのアップロード時に呼び出す(最大 20MB)
      • PutImage API: レイヤーアップロード後にイメージマニフェストをプッシュする際に呼び出す
    • レイヤーチャンクを base64 エンコードでアップロードしなければならない点が奇妙である
  • Docker の Registry に対する不満がある

  • 個人用コンテナレジストリの存在意義が理解できない、という意見がある

    • 単にイメージファイルを生成して管理したほうがよいかもしれない