フリーキーズ | 独学プログラミング

Docker Hubとプライベートレジストリの使い方!初心者でもわかるイメージの共有と管理

リンドくん

リンドくん

たなべ先生、Dockerイメージを作ったんですけど、これってどうやって他の人と共有すればいいんですか?

たなべ

たなべ

それにはDocker Hubプライベートレジストリが便利なんだよ。
GitHubでコードを共有するように、Dockerイメージも専用の場所で共有できるんだ。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

Dockerイメージを共有する仕組み

Dockerを使った開発を進めていくと、必ず直面するのが「作成したイメージをどうやって共有するか」という課題です。
ローカルで作ったDockerイメージを、チームメンバーや本番環境で使いたい。そんなとき活躍するのがDockerレジストリなのです。

Dockerレジストリとは、簡単に言えば「Dockerイメージを保存・配布するための倉庫」のようなものです。GitHubがソースコードの共有場所であるように、Dockerレジストリはコンテナイメージの共有場所として機能します。

レジストリには大きく分けて2種類あります。

  • パブリックレジストリ → Docker Hubなど、誰でもアクセス可能な公開レジストリ
  • プライベートレジストリ → 組織内や特定のユーザーのみがアクセスできる非公開レジストリ

今回の記事では、これらのレジストリの使い方を基礎から丁寧に解説していきます。Dockerイメージの共有方法を理解することで、チーム開発やCI/CD環境の構築がよりスムーズになりますよ。

Docker Hubとは何か?

リンドくん

リンドくん

Docker Hubって、よく聞くんですけど、具体的にどんなサービスなんですか?

たなべ

たなべ

Docker HubはDockerイメージの公式レジストリサービスなんだ。
世界中の開発者が作成したイメージが公開されていて、誰でも自由に使えるんだよ。

Docker Hubの基本概念

Docker Hubは、Docker社が提供するパブリックなコンテナレジストリサービスです。無料プランでも基本的な機能を使うことができ、世界中の開発者に利用されています。

Docker Hubの主な特徴は以下の通りです。

  • 公式イメージの提供 → nginx、MySQL、Pythonなど、メジャーなソフトウェアの公式イメージが利用可能
  • 無料で使える → パブリックリポジトリは無料で無制限に作成できる
  • 自動ビルド機能 → GitHubと連携して、コードの変更時に自動でイメージをビルド
  • Webhooks連携 → イメージのpush時に他のサービスに通知を送れる

実際、これまでdocker pull nginxのようなコマンドでイメージを取得していたとき、実はDocker Hubからダウンロードしていたのです。

Docker Hubのアカウント作成

Docker Hubを使うには、まずアカウントを作成する必要があります。手順は非常に簡単です。

  1. Docker Hubにアクセス
  2. 「Sign Up」をクリック
  3. ユーザー名、メールアドレス、パスワードを入力
  4. メールアドレスの確認を完了

アカウントを作成したら、ローカルのDockerからログインしておきましょう。

docker login

ユーザー名とパスワードを入力すると、「Login Succeeded」と表示され、ログイン完了です。これで、Docker Hubにイメージをpushしたり、プライベートイメージをpullしたりできるようになります。

Docker Hubへイメージをpushする

リンドくん

リンドくん

実際に自分で作ったイメージをDocker Hubに公開するにはどうすればいいんですか?

たなべ

たなべ

イメージに適切な名前をつけてタグ付けしてから、docker pushコマンドで公開するんだ。手順を見ていこうか。

イメージの命名規則

Docker Hubにイメージをpushする際は、特定の命名規則に従う必要があります。基本的な形式は以下の通りです。

ユーザー名/リポジトリ名:タグ

例えば、ユーザー名がtanabeで、Webアプリケーションのイメージを公開する場合は次のようになります。

tanabe/my-web-app:latest

イメージのタグ付けとpush

実際の手順を見ていきましょう。まず、ローカルでDockerイメージを作成します。

# Dockerfile
FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

このDockerfileからイメージをビルドし、適切な名前でタグ付けします。

# イメージをビルド
docker build -t my-web-app .

# Docker Hub用にタグ付け
docker tag my-web-app tanabe/my-web-app:v1.0

# Docker Hubにpush
docker push tanabe/my-web-app:v1.0

複数のタグを付けることもできます。例えば、latestタグも同時に付与する場合は以下のようにします。

docker tag my-web-app tanabe/my-web-app:latest
docker push tanabe/my-web-app:latest

イメージの公開設定

Docker Hubでは、リポジトリごとに公開設定を変更できます。

  • Public(パブリック) → 誰でもイメージをpullできる
  • Private(プライベート) → 自分や招待したユーザーのみがアクセス可能

無料プランでは、プライベートリポジトリは1つまで作成できます。組織やチームで使う場合は、有料プランを検討するのも良いでしょう。

Docker Hubからイメージをpullする

基本的なpullコマンド

公開されているイメージをダウンロードするのは非常に簡単です。

# 最新版をpull
docker pull tanabe/my-web-app:latest

# 特定のバージョンをpull
docker pull tanabe/my-web-app:v1.0

タグを省略すると、自動的にlatestタグが使用されます。

docker pull tanabe/my-web-app

プライベートイメージのpull

プライベートリポジトリのイメージをpullする場合は、事前にログインが必要です。

# ログイン
docker login

# プライベートイメージをpull
docker pull tanabe/private-app:latest

ログインしていない状態でプライベートイメージをpullしようとすると、エラーが発生します。チームメンバーには、必ずDocker Hubのアカウントとリポジトリへのアクセス権限を付与しておきましょう。

プライベートレジストリとは?

リンドくん

リンドくん

Docker Hubは便利ですけど、会社のプロジェクトだと外部サービスに置くのは不安があります...

たなべ

たなべ

その気持ち、よくわかるよ。そんなときに役立つのがプライベートレジストリなんだ。
自分たちで管理できるレジストリを構築できるんだよ。

プライベートレジストリのメリット

プライベートレジストリを構築することで、以下のようなメリットがあります。

  • セキュリティの向上 → 機密情報を含むイメージを社内ネットワーク内で管理できる
  • 通信速度の向上 → ローカルネットワーク内でイメージを配布するため高速
  • コスト削減 → Docker Hubの有料プランが不要になる
  • 完全なコントロール → アクセス管理やストレージを自由に設定できる

特に、企業での利用や、セキュリティ要件の厳しいプロジェクトでは、プライベートレジストリの構築が推奨されます。

Dockerの公式レジストリイメージ

Dockerは公式にregistryというイメージを提供しており、これを使うことで簡単にプライベートレジストリを構築できます。最小限の設定で、すぐに使い始めることができるのが特徴です。

プライベートレジストリの構築方法

基本的なレジストリの起動

最もシンプルなプライベートレジストリの起動方法は以下の通りです。

docker run -d \
  -p 5000:5000 \
  --name registry \
  registry:2

これだけで、ローカルの5000番ポートでレジストリが起動します。ただし、この設定ではデータの永続化やセキュリティ設定がされていないため、本番環境での使用は推奨できません。

永続化とボリューム設定

レジストリのデータを永続化するために、ボリュームをマウントしましょう。

docker run -d \
  -p 5000:5000 \
  --name registry \
  -v /data/registry:/var/lib/registry \
  registry:2

これで、ホストマシンの/data/registryディレクトリにイメージデータが保存されるようになります。コンテナを削除しても、イメージデータは残り続けます。

docker-composeを使った構築

より実践的な設定として、docker-composeを使った構築方法を紹介します。

# docker-compose.yml
version: '3.8'

services:
  registry:
    image: registry:2
    container_name: my-registry
    ports:
      - "5000:5000"
    environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - registry-data:/data
    restart: always

volumes:
  registry-data:

起動は以下のコマンドで行います。

docker-compose up -d

これで、バックグラウンドでレジストリが起動し、自動的に再起動する設定も有効になります。

プライベートレジストリの使い方

イメージのpush

プライベートレジストリにイメージをpushする際は、レジストリのアドレスを含めたタグ付けが必要です。

# イメージをビルド
docker build -t my-app .

# プライベートレジストリ用にタグ付け
docker tag my-app localhost:5000/my-app:v1.0

# プライベートレジストリにpush
docker push localhost:5000/my-app:v1.0

リモートのレジストリを使用する場合は、localhostの部分をレジストリのホスト名やIPアドレスに置き換えます。

docker tag my-app registry.example.com:5000/my-app:v1.0
docker push registry.example.com:5000/my-app:v1.0

イメージのpull

プライベートレジストリからイメージをpullするのも簡単です。

# プライベートレジストリからpull
docker pull localhost:5000/my-app:v1.0

# イメージを実行
docker run -d localhost:5000/my-app:v1.0

レジストリ内のイメージ一覧を確認

プライベートレジストリに保存されているイメージの一覧は、REST APIを使って確認できます。

# リポジトリ一覧の取得
curl http://localhost:5000/v2/_catalog

# 特定リポジトリのタグ一覧
curl http://localhost:5000/v2/my-app/tags/list

これらのAPIを活用することで、レジストリの管理を自動化することもできます。

セキュリティ設定とベストプラクティス

リンドくん

リンドくん

プライベートレジストリって、誰でもアクセスできちゃうんですか? セキュリティが心配です...

たなべ

たなべ

鋭い指摘だね! 基本設定のままだと確かに問題があるんだ。
認証やHTTPS通信の設定をして、セキュアにしていく必要があるよ。

Basic認証の設定

プライベートレジストリに基本的な認証を設定しましょう。まず、認証ファイルを作成します。

# 認証用のディレクトリを作成
mkdir -p auth

# htpasswdで認証ファイルを生成(ユーザー名: admin)
docker run --rm \
  --entrypoint htpasswd \
  httpd:2 -Bbn admin password123 > auth/htpasswd

次に、認証を有効にしてレジストリを起動します。

# docker-compose.yml(認証付き)
version: '3.8'

services:
  registry:
    image: registry:2
    container_name: my-registry
    ports:
      - "5000:5000"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - registry-data:/data
      - ./auth:/auth
    restart: always

volumes:
  registry-data:

認証が有効になったレジストリを使う際は、事前にログインが必要です。

docker login localhost:5000
# Username: admin
# Password: password123

HTTPS通信の設定

本番環境では、必ずHTTPS通信を設定しましょう。SSL証明書が必要になります。

# docker-compose.yml(HTTPS対応)
version: '3.8'

services:
  registry:
    image: registry:2
    container_name: my-registry
    ports:
      - "443:443"
    environment:
      REGISTRY_HTTP_ADDR: 0.0.0.0:443
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    volumes:
      - registry-data:/var/lib/registry
      - ./certs:/certs
      - ./auth:/auth
    restart: always

volumes:
  registry-data:

Let's Encryptなどの無料SSL証明書サービスを使うと、コストをかけずにHTTPS化できます。

イメージの脆弱性スキャン

セキュリティを高めるためには、イメージに脆弱性がないか定期的にスキャンすることが重要です。Docker Hubには自動スキャン機能がありますが、プライベートレジストリでも以下のようなツールを活用できます。

  • Trivy → オープンソースの脆弱性スキャナ
  • Clair → CoreOS製の脆弱性スキャナ
  • Anchore → コンテナイメージの詳細な分析ツール

Trivyを使った基本的なスキャン方法は以下の通りです。

# Trivyのインストール(Mac)
brew install aquasecurity/trivy/trivy

# イメージのスキャン
trivy image localhost:5000/my-app:v1.0

チーム開発での活用方法

CI/CDパイプラインとの統合

プライベートレジストリは、CI/CDパイプラインとの相性が抜群です。例えば、GitHub Actionsと組み合わせる場合は以下のようになります。

# .github/workflows/docker.yml
name: Build and Push Docker Image

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Build Docker image
      run: docker build -t my-app .
    
    - name: Tag image
      run: docker tag my-app registry.example.com:5000/my-app:${{ github.sha }}
    
    - name: Login to private registry
      run: echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login registry.example.com:5000 -u admin --password-stdin
    
    - name: Push to private registry
      run: docker push registry.example.com:5000/my-app:${{ github.sha }}

この設定により、mainブランチにpushされるたびに自動的にイメージがビルドされ、プライベートレジストリに保存されます。

タグ戦略のベストプラクティス

イメージのタグ付けには、一定のルールを設けることをおすすめします。

# セマンティックバージョニング
my-app:1.0.0
my-app:1.0.1

# 環境別タグ
my-app:dev
my-app:staging
my-app:production

# Gitコミットハッシュ
my-app:a1b2c3d

# 日付ベース
my-app:2025-03-26

latestタグは便利ですが、本番環境では明示的なバージョンタグを使用することを推奨します。これにより、どのバージョンが動いているかが明確になり、問題発生時のロールバックも容易になります。

まとめ

リンドくん

リンドくん

Docker Hubもプライベートレジストリもそれぞれメリットがあるんですね!

たなべ

たなべ

そうなんだ! 公開したいならDocker Hubセキュアに管理したいならプライベートレジストリという使い分けが基本だね。
プロジェクトの要件に合わせて選ぶことが大切だよ。

今回は、Docker Hubとプライベートレジストリの使い方について解説してきました。

重要なポイントをおさらいしましょう。

  • Docker Hubは世界中の開発者が使うパブリックレジストリで、手軽にイメージを共有できる
  • イメージをpushする際はユーザー名/リポジトリ名:タグという命名規則に従う
  • プライベートレジストリを使うことで、セキュアな環境でイメージを管理できる
  • 公式のregistryイメージを使えば簡単にプライベートレジストリを構築可能
  • 認証やHTTPS通信の設定でセキュリティを強化することが重要
  • CI/CDパイプラインと統合することで、開発プロセスを自動化できる

Dockerイメージの共有と管理は、現代のソフトウェア開発において欠かせないスキルです。
小規模なプロジェクトではDocker Hubで十分かもしれませんが、チーム開発や企業での利用を考えると、プライベートレジストリの構築方法を知っておくことは非常に価値があります。

最初は少し難しく感じるかもしれませんが、一度セットアップしてしまえば、あとは日常的に使うだけです。
ぜひ実際に手を動かして、自分の環境にレジストリを構築してみてください。チーム開発の効率が格段に上がることを実感できるはずです。

この記事をシェア

関連するコンテンツ