Cloud Service
OCI Container Registry (OCIR)
Oracle Cloud のマネージドなプライベートコンテナレジストリ。OCI IAM と統合してイメージを安全に保管・配布できる。AWS の Amazon ECR に相当。
- 1.Docker / OCI イメージを保管するマネージドなプライベートレジストリ。
- 2.OCI IAM 認証と脆弱性スキャンを統合し、OKE などから安全に取得。
- 3.AWS の ECR 相当。リポジトリ単位で権限とライフサイクルを管理。
解決する課題
コンテナを本番で動かすには、ビルドしたイメージを安全に保管し、デプロイ先から確実に取得できる置き場が要ります。OCIR はその役割を担うマネージドなレジストリです。
- 自前でレジストリサーバーを構築・パッチ・スケールしたくない → フルマネージドで運用負荷ゼロ
- イメージを社外に公開せず、社内だけに閉じて配布したい → 既定でプライベート
- 取得・push の権限をOCI の利用者と一元管理したい → IAM ポリシーで制御
- デプロイ前に脆弱性を検出したい → イメージスキャンと統合
- OKE / Container Instances / Functions から遅延少なくイメージを取得したい → 同一リージョンのレジストリを利用
主要概念と用語
- レジストリ (Registry): イメージを保管するサービス本体。リージョンごとに提供され、テナンシ単位で利用する
- リポジトリ (Repository): 同じイメージのタグ違いをまとめる単位(例:
web-app)。AWS ECR のリポジトリに相当。プライベートとパブリックを選べる - イメージ / タグ (Image / Tag): 実体であるイメージと、それを指す名前(
1.0、latestなど)。同一イメージに複数タグを付けられる - 名前空間 (Namespace): テナンシに割り当てられる一意の文字列。イメージのパス(リポジトリ名)の先頭に入る
- リージョンキー / レジストリ URL:
<region-key>.ocir.io形式のエンドポイント(例: フェニックスはphx.ocir.io)。イメージは<region-key>.ocir.io/<namespace>/<repo>:<tag>で参照する - 認証トークン (Auth Token): docker login で使うパスワード代わりの資格情報。ユーザー名は
<namespace>/<user-name>形式。フェデレーションユーザーは別形式になる - イメージスキャン: プッシュされたイメージの既知脆弱性 (CVE) を検査する機能(OCI Vulnerability Scanning と連携)
- 署名 (Image Signing): イメージに署名し、デプロイ時に改ざんされていないことを検証する仕組み(OCI Vault のキーを利用)
仕様・制限・クォータ
- 規格は Docker V2 / OCI イメージフォーマットに準拠し、標準の docker / podman などのツールでそのまま push・pull できる
- レジストリはリージョンごとに存在し、リポジトリはコンパートメントに属して IAM 制御を受ける
- リポジトリは既定でプライベート。明示的にパブリックへ変更すると認証なしで pull できる
- テナンシ/リージョンごとにリポジトリ数やストレージ量に**サービス制限(リミット)**があり、コンソールから引き上げ申請が可能(具体的な上限値はリージョンやプランで変わるため、コンソールの「Limits, Quotas and Usage」で確認する)
- イメージの保管には保管容量に応じたストレージ課金が発生する一方、レジストリ機能そのものの追加料金はかからない
- リポジトリ単位でコンパートメントクォータを定義し、利用量を制御できる
内部の仕組み
OCIR は Oracle が運用するマネージドサービスで、利用者はサーバーを意識しません。イメージのレイヤーは内部的に OCI Object Storage 上に保管され、リージョン内で冗長化されます。クライアントは標準の Docker Registry V2 API を通じて、<region-key>.ocir.io のエンドポイントに対して push・pull を行います。
認証は OCI IAM に統合されています。CLI / SDK はリクエストごとに署名し、docker / podman を使う場合は認証トークンをパスワードとして docker login します。アクセス可否はリポジトリが属するコンパートメントの IAM ポリシーで判定されるため、レジストリ独自のアクセス制御を別管理する必要がありません。
OKE や Container Instances などのコンピュート側は、動的グループ + インスタンスプリンシパルを使えば認証トークンを持たずに(資格情報をワークロードに埋め込まずに)イメージを取得できます。プライベートリポジトリから pull する OKE では、imagePullSecrets か動的グループのいずれかで取得権限を付与します。
イメージパス phx.ocir.io/mytenancy/web-app:1.0 は、先頭がリージョンキー(phx=フェニックス)、次が名前空間、その後がリポジトリ名:タグという構造です。デプロイ先と同じリージョンのレジストリを使うと、pull の遅延と転送コストを抑えられます。
設計パターン / ベストプラクティス
- CI/CD パイプラインで自動 push: ビルド成功時に CI から OCIR へ push し、デプロイは固定タグまたはダイジェスト参照で行う
- 不変タグ運用:
latestだけに依存せず、1.4.2のようなバージョンタグやイメージダイジェスト(@sha256:...)で参照し、再現性を確保 - 環境ごとにリポジトリ/コンパートメントを分離し、IAM ポリシーで本番への push を絞る
- push 時スキャンを有効化し、重大な脆弱性があるイメージはデプロイ前に検出・ブロック
- イメージ署名で配布元の正当性を担保し、OKE 側で署名検証を強制する
- 古いイメージは手動または運用ルールで整理し、ストレージコストの肥大化を防ぐ
- 取得はインスタンスプリンシパルを使い、長命な認証トークンの配布を避ける
運用・監視
- OCI Audit に push・pull・リポジトリ作成などの API 操作が記録される
- リポジトリの一覧・イメージ・スキャン結果はコンソールの「Container Registry」から確認できる
- pull に失敗する → IAM ポリシー / 動的グループの取得権限、リポジトリがプライベートか、リージョン(イメージパスのリージョンキー)が一致しているかを確認
- push に失敗する → 認証トークンの有効性、
docker loginのユーザー名形式(<namespace>/<user-name>)、対象コンパートメントへのmanage repos権限を確認 - スキャンで脆弱性が出続ける → ベースイメージの更新やパッチ適用をパイプラインに組み込む
コスト
OCIR はレジストリ機能自体に追加料金がなく、課金は主に保管しているイメージのストレージ容量に対して発生します。同一リージョン内での pull はネットワーク的に近く、別リージョンや外部への大量転送はデータ転送費の観点で割高になり得ます(具体的な単価は変動するため公式の料金ページで確認)。
- コストの主因は蓄積されたイメージのストレージ量。古い・未使用イメージの整理が効く
- 不要タグの削除と**ベースイメージの共有(レイヤー再利用)**で容量を抑制
- リージョンをデプロイ先と合わせ、クロスリージョン転送を避ける
セキュリティ
- リポジトリは既定でプライベート。公開が不要なら絶対にパブリックへ変更しない
- 認可は IAM ポリシーで行い、
read(pull)・use/manage(push・管理)を最小権限で付与 - ワークロードからの取得はインスタンスプリンシパル + 動的グループを使い、認証トークンの埋め込みを避ける
- イメージスキャンで既知脆弱性を検出し、イメージ署名(OCI Vault のキー)で改ざん検知とサプライチェーン保護を行う
- 認証トークンはローテーションし、不要になったら失効させる
本来プライベートにすべきリポジトリを安易にパブリック化したり、長命な認証トークンをイメージや CI 設定にベタ書きして使い回すのは危険です。公開はパブリック配布が目的の場合に限り、ワークロードからの取得はインスタンスプリンシパルに寄せて、資格情報そのものを持たない設計にしましょう。
Well-Architected の観点
- セキュリティ: プライベート既定・IAM 連携・スキャン・署名により、保管と配布の両面で安全性を確保。最小権限ポリシーとインスタンスプリンシパルで資格情報の露出を抑える
- 運用上の優秀性: フルマネージドでサーバー運用が不要。CI/CD と統合し、Audit でイメージ操作を追跡できるため、デプロイの再現性とトレーサビリティを高められる
試験で問われるポイント
- OCIR はマネージドなプライベートコンテナレジストリで、対応する AWS サービスは Amazon ECR
- イメージパスは
<リージョンキー>.ocir.io/<名前空間>/<リポジトリ>:<タグ>の構造 - docker login のユーザー名は
<名前空間>/<ユーザー名>、パスワードは認証トークン(アカウントのログインパスワードではない) - リポジトリは既定でプライベート。アクセス制御はリポジトリが属するコンパートメントの IAM ポリシーで行う
- OKE / Container Instances からの取得はインスタンスプリンシパル + 動的グループで資格情報を持たずに実現できる
- **イメージスキャン(脆弱性検出)とイメージ署名(改ざん検知)**が統合されている点
関連サービス・比較
| 観点 | OCI Container Registry (OCIR) | AWS Amazon ECR |
|---|---|---|
| 位置づけ | マネージドなプライベートコンテナレジストリ | マネージドなプライベートコンテナレジストリ |
| 既定の公開範囲 | プライベート(パブリックにも変更可) | プライベート(Public ECR は別サービス) |
| 認可 | OCI IAM ポリシー(コンパートメント単位) | IAM ポリシー + リポジトリポリシー |
| ツール認証 | 認証トークン(docker login) | 一時トークン(get-login-password) |
| 脆弱性スキャン | あり(Vulnerability Scanning 連携) | あり(スキャン on push) |
| 主な連携先 | OKE / Container Instances / Functions | EKS / ECS / Lambda |
ハンズオン / CLI例
# 1) 認証トークンを作成(コンソール or CLI)して docker login に使う
# ユーザー名は <namespace>/<user-name> 形式、パスワードに認証トークンを入力
docker login phx.ocir.io
# Username: mynamespace/oracleidentitycloudservice/jane@example.com
# Password: <生成した認証トークン>
# 2) ローカルのイメージに OCIR 向けのタグを付ける
# 形式: <region-key>.ocir.io/<namespace>/<repo>:<tag>
docker tag my-web-app:1.0 phx.ocir.io/mynamespace/web-app:1.0
# 3) OCIR へ push(リポジトリが無ければ自動作成される)
docker push phx.ocir.io/mynamespace/web-app:1.0
# 4) リポジトリ一覧を CLI で確認
oci artifacts container repository list \
--compartment-id "ocid1.compartment.oc1..xxxx" \
--query "data.items[].{Name:\"display-name\", Public:\"is-public\"}" \
--output table
# 5) 指定リポジトリのイメージ(タグ)を一覧
oci artifacts container image list \
--compartment-id "ocid1.compartment.oc1..xxxx" \
--repository-name "web-app" \
--output table
OCI Service
OCI Container Registry (OCIR)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
コンテナ
比較で見る軸
クラウド: OCI / カテゴリ: コンテナ / 難易度: basic
導入後に効く点
OCI IAM 認証と脆弱性スキャンを統合し、OKE などから安全に取得。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- OCI
- カテゴリ
- コンテナ
- 難易度
- basic
- 関連資格
- —
- 設計柱
- security / operational
判断チェックリスト
- 自社の用途が「コンテナ / security」に近いか確認する。
- 強みである「Docker / OCI イメージを保管するマネージドなプライベートレジストリ。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。