Docker: プライベートイメージリポジトリ

最終更新:2026-08-26

かいしゃのコードをパブリックな Docker Hub へプッシュしたくないときは、5 ふんでプライベートイメージリポジトリをセットアップできます。

1. まなべること



2. チームリーダーのじつわ

(1) こまりごと: コードをパブリックリポジトリへプッシュできない

Alice は、せっていファイルやデフォルトのかんきょうへんすうなどのセンシティブなじょうほうがイメージにふくまれるかもしれないため、かいしゃのコードをパブリックな Docker Hub へプッシュしたくありません。しかし、チームにはビルドせいかぶつをきょうゆうするイメージリポジトリがひつようです。docker save/load をつかったてさぎょうでは、5 にんへイメージをわたすたびに 30 ぷんもかかります。

(2) プライベートレジストリによるかいけつ

にんしょうつきのプライベートリポジトリは、わずかなせっていでたちあげられます。

BASH
# にんしょうにたいおうできるプライベートレジストリをかいし
docker run -d -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  --restart=always \
  --name registry registry:2

(3) メリット: 5 ふんでイメージをきょうゆう

チームは 5 ふんでプライベートリポジトリをつかいはじめられます。だれかが docker push すれば、ほかのメンバーは docker pull するだけです。イメージをわたすじかんは 30 ぷんから 30 びょうへみじかくなりました。



3. イメージリポジトリのくらべかた

(1) 3 つのせんたくし

ひかくこうもく Docker Hub (パブリック) プライベート Registry Harbor
コスト せいげんつきでむりょう、ゆうりょうプランは $5/つき かんぜんにむりょう むりょうのオープンソース
にんしょう Docker アカウント htpasswd/TLS LDAP/OIDC/DB
Web UI
イメージスキャン ✅ (ゆうりょう) ✅ (Trivy れんけい)
デプロイのむずかしさ なし ひくい (1 コマンド) ふつう (Docker Compose)
むいているきぼ こじんやちいさなチーム ちいさなチームからちゅうきぼ エンタープライズ

(2) イメージのなまえかた

TEXT 📖 参照専用
# Docker Hub のオフィシャルイメージ
docker.io/library/nginx:1.25

# Docker Hub のユーザーイメージ
docker.io/myorg/myapp:v2.0

# プライベートレジストリのイメージ
localhost:5000/myapp:v2.0
registry.example.com/team/app:v1.0


4. プライベートレジストリのデプロイ

▶ サンプル: Registry コンテナをかいしする (むずかしさ: ⭐)

BASH
# きほんのプライベートレジストリをかいし
docker run -d \
  -p 5000:5000 \
  --name registry \
  --restart=always \
  -v registry-data:/var/lib/registry \
  registry:2

# うごいていることをかくにん
curl http://localhost:5000/v2/_catalog
💻 しゅつりょく:

TEXT 📖 参照専用
{"repositories":[]}

(1) データをのこす

ほうほう コマンド せつめい
なまえつきボリューム -v registry-data:/var/lib/registry Docker がかんりするえいぞくストレージ
バインドマウント -v /data/registry:/var/lib/registry ホストのディレクトリをしてい
デフォルト (-v なし) えいぞくかなし コンテナをさくじょするとイメージデータもうしなわれる
⚠️ ちゅうい: ほんばんかんきょうでは、ボリュームかバインドマウントでデータをかならずのこしてください。そうしないと Registry コンテナのさくじょとともに、プッシュしたイメージもうしなわれます。



5. イメージのプッシュとプル

▶ サンプル: プライベートリポジトリへプッシュする (むずかしさ: ⭐⭐)

BASH
# 1. プライベートレジストリむけのタグをつける
docker tag nginx:1.25-alpine localhost:5000/web/nginx:v1

# 2. イメージをプッシュ
docker push localhost:5000/web/nginx:v1

# 3. レジストリにあることをかくにん
curl http://localhost:5000/v2/web/nginx/tags/list
💻 しゅつりょく:

TEXT 📖 参照専用
{"name":"web/nginx","tags":["v1"]}

▶ サンプル: プライベートリポジトリからプルする (むずかしさ: ⭐⭐)

BASH
# 1. ローカルのコピーをさくじょ
docker rmi localhost:5000/web/nginx:v1

# 2. プライベートレジストリからプル
docker pull localhost:5000/web/nginx:v1

# 3. プルしたイメージをじっこう
docker run --rm localhost:5000/web/nginx:v1 nginx -v
💻 しゅつりょく:

TEXT 📖 参照専用
nginx version: nginx/1.25.3


6. リポジトリにんしょうのせってい

デフォルトの Registry にはにんしょうがなく、だれでもプッシュやプルができます。ほんばんかんきょうではにんしょうがひつようです。

▶ サンプル: htpasswd パスワードファイルをつくる (むずかしさ: ⭐⭐⭐)

BASH
# にんしょうデータようディレクトリをさくせい
mkdir -p auth

# htpasswd ファイルをさくせい (httpd-tools / apache2-utils がひつよう)
htpasswd -Bbn admin secret123 > auth/htpasswd

# にんしょうつきレジストリをかいし
docker run -d \
  -p 5000:5000 \
  --name registry-auth \
  --restart=always \
  -v registry-data:/var/lib/registry \
  -v $(pwd)/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
  registry:2

(1) にんしょうせっていごのそうさ

BASH
# プライベートレジストリへログイン
docker login localhost:5000
# ユーザーめい: admin
# パスワード: secret123

# プッシュにはログインがひつよう
docker push localhost:5000/myapp:v1

# プルにもログインがひつよう
docker pull localhost:5000/myapp:v1

# ログアウト
docker logout localhost:5000


7. リポジトリのカタログをみる

▶ サンプル: curl でカタログとタグをみる (むずかしさ: ⭐⭐)

BASH
# すべてのリポジトリをいちらん
curl -s http://localhost:5000/v2/_catalog | python3 -m json.tool

# とくていのリポジトリのタグをいちらん
curl -s http://localhost:5000/v2/web/nginx/tags/list | python3 -m json.tool

# イメージマニフェストをみる
curl -s -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
  http://localhost:5000/v2/web/nginx/manifests/v1 | python3 -m json.tool
💻 しゅつりょく:

TEXT 📖 参照専用
# catalog
{
  "repositories": [
    "web/nginx",
    "team/api"
  ]
}

# tags/list
{
  "name": "web/nginx",
  "tags": ["v1", "v2"]
}


8. ガベージコレクション

Registry でイメージのタグをはずしても、レイヤーデータはじどうでクリーンアップされません。ガベージコレクションをてさぎょうでじっこうします。

▶ サンプル: ガベージコレクション (むずかしさ: ⭐⭐⭐)

BASH
# タグをさくじょたいしょうとしてマーク
curl -X DELETE -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
  http://localhost:5000/v2/web/nginx/manifests/<digest>

# Registry コンテナないでガベージコレクションをじっこう
docker exec registry bin/registry garbage-collect \
  /etc/docker/registry/config.yml

# さきに dry-run でプレビュー
docker exec registry bin/registry garbage-collect --dry-run \
  /etc/docker/registry/config.yml


9. HTTP と HTTPS のちがい

(1) Docker のセキュリティポリシー

Docker はデフォルトで、localhost をのぞき Registry への HTTPS せつぞくだけをゆるします。リモートレジストリには HTTPS をせっていするか、クライアントがわへ insecure-registries をついかします。

シナリオ セキュリティ せってい
localhost:5000 HTTP をデフォルトできょか ついかせっていなし
リモート HTTP リポジトリ あんぜんではなく、めいじてきなきょかがひつよう insecure-registries
リモート HTTPS リポジトリ ✅ おすすめ TLS しょうめいしょ

(2) insecure-registries のせっていはテストだけ

JSON
{
  "insecure-registries": ["registry.example.com:5000"]
}
🔒 セキュリティ: ほんばんかんきょうでは HTTPS としんらいできる TLS しょうめいしょをつかってください。insecure-registries はないぶテストむけで、つうしんは man-in-the-middle こうげきのリスクがあります。



10. かんぜんなサンプル: にんしょうつきプライベートリポジトリ

BASH
# ============================================
# にんしょうつきプライベートレジストリのながれ
# デプロイ、にんしょう、プッシュ、プル、カタログ、GC
# ============================================

# 1. えいぞくデータようディレクトリをさくせい
mkdir -p auth registry-data

# 2. htpasswd にんしょうファイルをさくせい
htpasswd -Bbn admin secret123 > auth/htpasswd

# 3. にんしょうとえいぞくかをつけてレジストリをかいし
docker run -d \
  -p 5000:5000 \
  --name my-registry \
  --restart=always \
  -v $(pwd)/registry-data:/var/lib/registry \
  -v $(pwd)/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
  registry:2

# 4. レジストリへログイン
docker login localhost:5000 -u admin -p secret123

# 5. イメージへタグをつけてプッシュ
docker tag nginx:1.25-alpine localhost:5000/web/nginx:v1.0
docker push localhost:5000/web/nginx:v1.0

# 6. プッシュをかくにん
curl -s -u admin:secret123 http://localhost:5000/v2/_catalog
curl -s -u admin:secret123 http://localhost:5000/v2/web/nginx/tags/list

# 7. べつのマシンからプル (ログインご)
docker pull localhost:5000/web/nginx:v1.0

# 8. クリーンアップ
docker logout localhost:5000
💻 しゅつりょくのばっすい:

TEXT 📖 参照専用
# curl catalog
{"repositories":["web/nginx"]}

# curl tags
{"name":"web/nginx","tags":["v1.0"]}

❓ よくある質問

Q プライベートリポジトリにはどれくらいのストレージがひつようですか?
A イメージのかずとサイズによります。ひとつのイメージは 50〜500 MB ほどで、10 こならやく 1〜5 GB です。はじめは 50 GB をよういし、ふるいバージョンをていきてきにクリーンアップすることをおすすめします。エンタープライズでは S3/OSS などのオブジェクトストレージをバックエンドにできます。
Q リポジトリに HTTPS をせっていするにはどうしますか?
A Nginx や Caddy をリバースプロキシにして TLS しょうめいしょをせっていするほうほうがおすすめです。Registry へちょくせつ TLS をせっていすることもできます。Let's Encrypt ならむりょうのしょうめいしょをつかえます。
Q イメージがふえすぎたらどうしますか?
A DELETE API でいらないタグやマニフェストをさくじょし、registry garbage-collect でさんしょうされていないレイヤーをかいほうします。N にちよりふるいバージョンをていきてきにけすスクリプトもべんりです。Harbor にはクリーンアップポリシーがあります。
Q ほかのひとはリポジトリのイメージをみられますか?
A にんしょうがなければだれでもプルできます。htpasswd にんしょうをせっていすると、プッシュとプルのまえにログインがひつようです。ほんばんではプルをよみとりせんよう、プッシュをかきこみきょかにするのがおすすめです。
Q Harbor と Registry のどちらがよいですか?
A Registry はちいさなチームや CI にむくミニマルなリポジトリです。Harbor は Web UI、イメージスキャン、RBAC、かんさログをそなえます。10 にんみまんのチームなら Registry、それよりおおきいかコンプライアンスがひつようなら Harbor がめやすです。

📖 まとめ


📝 練習問題

  1. きほん (むずかしさ: ⭐): docker run でプライベートレジストリをかいしし、nginx:alpinelocalhost:5000/test/nginx:v1 へプッシュしてから、ローカルイメージをけしてプルしてください。
  2. おうよう (むずかしさ: ⭐⭐): htpasswd にんしょうをせっていし、ログインまえのプッシュがしっぱいし、ログインごはせいこうすることをたしかめてください。
  3. ちょうせん (むずかしさ: ⭐⭐⭐): Nginx リバースプロキシで Registry に HTTPS をせっていし、https://registry.local/v2/_catalog へアクセスしてください。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%