第17章:レジストリ入門:置き場を決める 🏪📦
ここから先(CI/CD → 本番デプロイ)でずっと出てくるのが「レジストリ」だよ〜!😆 レジストリ=コンテナイメージの“置き場”。置き場が決まると、イメージを 運べる・配れる・自動化できる ようになる 🚚💨
この章でできるようになること 🎯
- レジストリが「何をしてくれる場所か」を説明できる 🧠✨
- 自分の用途に合う置き場(公開/非公開、権限、料金感)を選べる 🧭
docker build → tag → push → pullの流れを手で1回通せる 🐳✅- “事故りにくい”タグの第一歩ルールを決められる 🏷️😇
1) レジストリって何?超ざっくり図解 🗺️🐳
- ローカルPC:
docker buildでイメージを作る 🧱 - レジストリ:イメージを置く(アップロード=push)📦
- 本番環境:置き場から取ってくる(ダウンロード=pull)🚀
ポイントはこれ👇
- イメージ名 + タグ で「どれを使うか」指定する
- タグは“ラベル”で、同じタグを上書きできる(=やや危険)😵
- “同じものを必ず使う”なら digest(sha256…) 指定が最強(ただし本格運用は後の章で!)🧬✨
2) 置き場はどれがいい?迷子にならない選び方 🧭✨
まず結論からいくね👇
-
GitHubで開発してるなら GitHub Container Registry(ghcr.io) が相性よし 🧡
- Docker/OCIイメージを置ける、公開/非公開、権限設定も柔軟 (GitHub Docs)
-
みんなが使ってる定番の公開置き場なら Docker Hub
- ただし無料/個人だと pull 回数制限がある(CIでハマりやすい)⚠️ (Docker Documentation)
-
クラウド(Cloud Runなど)寄りなら Google Cloud Artifact Registry が自然
- 置き場の名前ルールがちょい独特(後で例を出すね) (Google Cloud Documentation)
-
AWSなら Amazon Elastic Container Registry が王道
aws_account_id.dkr.ecr.region.amazonaws.com/...形式 (AWS ドキュメント)
3) “名前の読み方”が分かると一気にラク 😆📛
Dockerが扱う「イメージ参照」はだいたいこの形👇
<レジストリ>/<名前空間>/<イメージ名>:<タグ>
例:ghcr の場合(雰囲気)
ghcr.io/komiyamma/myapp:dev
digest 指定(同じもの固定)も一応知っておく 🧬
ghcr.io/komiyamma/myapp@sha256:xxxxxxxx...
「タグは動く」「digestは固定」って感覚だけ持っておけばOKだよ〜!🫶 (digest の使い分けは、後の章の“タグ戦略”で本気出す🔥)
4) 公開/非公開 と 権限の超基本 🔒🧑🤝🧑
ざっくりルール ✅
- 公開(Public):誰でも pull できる(世界に配る系)🌍
- 非公開(Private):ログインした人だけ(個人開発/チーム)🔐
GHCRの特徴(初心者が助かるポイント)✨
-
リポジトリに紐づけて権限を継承できたり、個別に細かく権限を切れたりする (GitHub Docs)
-
コマンドラインで push すると、自動ではリポジトリにリンクされないことがある(地味にハマる)😵
- 対策として
org.opencontainers.image.sourceラベルをDockerfileに入れるのが推奨されてる (GitHub Docs)
- 対策として
Docker Hubの注意(pull制限)⚠️
- Personal(認証あり):6時間あたり 200 pulls
- 未認証:6時間あたり 100 pulls(IP単位)
- Pro/Team/Business は pull 制限が実質無制限 (Docker Documentation) CI/CDが増えるとここで詰まりやすいので、教材的にも“知っておくと勝ち”だよ〜😇
5) ハンズオン:GHCRに手で push して「置き場」を体験する ✋📤🎉
ここでは “手で1回通す” のが目的! (次章以降で GitHub Actions による自動化に繋がるよ🤖✨)
手順A:GHCRへ push / pull(Windows・PowerShell版)🪟⚡
0. 用意するもの 🧰
-
GitHub の Personal Access Token(classic)
write:packages(pushに必要)などのスコープが出てくる (GitHub Docs)- GitHub Packages のCLI認証は(少なくとも公式説明では)classic PAT を使う案内になってる (GitHub Docs)
1. トークンを環境変数に入れる(PowerShell)🔑
$env:CR_PAT = "ここにトークン"
$env:GITHUB_USER = "GitHubユーザー名"
$env:IMAGE_NAME = "myapp"
$env:TAG = "dev"
2. ghcr にログインする(パスワードは標準入力)🔐
$env:CR_PAT | docker login ghcr.io -u $env:GITHUB_USER --password-stdin
3. ローカルでイメージを作る 🧱🐳
(Dockerfileがある前提)
docker build -t "$env:IMAGE_NAME:local" .
4. “置き場用の名前”を付ける(tag付け替え)🏷️
docker tag "$env:IMAGE_NAME:local" "ghcr.io/$env:GITHUB_USER/$env:IMAGE_NAME:$env:TAG"
5. push(アップロード)📤📦
docker push "ghcr.io/$env:GITHUB_USER/$env:IMAGE_NAME:$env:TAG"
6. pull して起動できるか確認(同じPCでもOK)✅
docker pull "ghcr.io/$env:GITHUB_USER/$env:IMAGE_NAME:$env:TAG"
docker run --rm -p 3000:3000 "ghcr.io/$env:GITHUB_USER/$env:IMAGE_NAME:$env:TAG"
ついでに:リポジトリと“ちゃんと紐づく”ようにする小技 🧷✨
Dockerfileにこのラベルを入れると、GHCR側でソース元が分かりやすくなる(推奨されてる)よ! (GitHub Docs)
LABEL org.opencontainers.image.source="https://github.com/<owner>/<repo>"
6) ここでよく詰まるやつ Top5 😵💫🔧
-
login は通るのに push が denied → トークンのスコープ不足(
write:packagesなど)になりがち (GitHub Docs) -
GHCRにpushしたのに、GitHubのリポジトリ側から見えない → コマンドラインpushは自動リンクされない場合がある →
org.opencontainers.image.sourceラベルでリンクしやすくする (GitHub Docs) -
latestしか使ってなくて、どれが本番か分からなくなる → 次章以降でガッツリ直すけど、今は「dev と main でタグ分け」だけでも効果大 😇🏷️ -
Docker Hub で 429(Too Many Requests) → pull 制限に引っかかった可能性大(未認証100/6h、Personal200/6h) (Docker Documentation)
-
マルチアーキ/Windows系の話が不安 → GHCRは Docker/OCI を扱えて、Windows系のレイヤー(foreign layers)もサポートされる説明があるよ (GitHub Docs) (ただし自分のアプリのイメージをWindowsコンテナで作るかどうかは、別の話になるので今は深追いしなくてOK!🙆♂️)
7) ミニ課題 🎒📝
課題1:置き場を1つ選ぶ 🧭
- GHCR / Docker Hub / Artifact Registry / ECR のどれを使うか決めて、理由を1行で書く✍️
課題2:タグ命名ルールを“3つだけ”決める 🏷️
例:
dev:手元検証用main:メインブランチの最新版v1.0.0:リリース固定(※この発想が後で効く!)🔥
8) AIに投げると強いプロンプト集 🤖💬✨
- 「このリポジトリに合うコンテナイメージ名と、破綻しにくいタグ案を3パターン出して」
- 「GHCR運用で初心者がやりがちな事故(権限/公開設定/タグ)をチェックリスト化して」
- 「Docker Hubのpull制限に引っかからないCI設計の基本方針を、個人開発向けに提案して」
次の第18章は「手でpushして理解」だから、この章で作った置き場の感覚がそのまま効いてくるよ〜!🚀🐳💪