Docker: プライベートイメージリポジトリ
最終更新:2026-08-26
かいしゃのコードをパブリックな Docker Hub へプッシュしたくないときは、5 ふんでプライベートイメージリポジトリをセットアップできます。
1. まなべること
- Registry イメージのデプロイ
- イメージのプッシュとプル
- リポジトリにんしょうのせってい
- イメージのクリーンアップとガベージコレクション
- CI/CD とリポジトリをれんけいするほうほう
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 がめやすです。
📖 まとめ
registry:2イメージなら 1 コマンドでプライベートリポジトリをかいしでき、データはボリュームでえいぞくかする- イメージめいは
registry-host/repo:tagのかたちで、プッシュまえにタグをつける - htpasswd にんしょうでまもり、プッシュやプルのまえに
docker loginする curl /v2/_catalogと/v2/repo/tags/listでリポジトリのないようをみるgarbage-collectでさくじょずみイメージのレイヤーをかいほうする- ほんばんでは HTTPS がひつようで、HTTP は localhost やテストだけにつかう
📝 練習問題
- きほん (むずかしさ: ⭐):
docker runでプライベートレジストリをかいしし、nginx:alpineをlocalhost:5000/test/nginx:v1へプッシュしてから、ローカルイメージをけしてプルしてください。 - おうよう (むずかしさ: ⭐⭐): htpasswd にんしょうをせっていし、ログインまえのプッシュがしっぱいし、ログインごはせいこうすることをたしかめてください。
- ちょうせん (むずかしさ: ⭐⭐⭐): Nginx リバースプロキシで Registry に HTTPS をせっていし、
https://registry.local/v2/_catalogへアクセスしてください。