リンドくんたなべ先生、Dockerイメージを作ったんですけど、これってどうやって他の人と共有すればいいんですか?
たなべそれにはDocker Hubやプライベートレジストリが便利なんだよ。
GitHubでコードを共有するように、Dockerイメージも専用の場所で共有できるんだ。
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を使うには、まずアカウントを作成する必要があります。手順は非常に簡単です。
- Docker Hubにアクセス
- 「Sign Up」をクリック
- ユーザー名、メールアドレス、パスワードを入力
- メールアドレスの確認を完了
アカウントを作成したら、ローカルの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: password123HTTPS通信の設定
本番環境では、必ず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-26latestタグは便利ですが、本番環境では明示的なバージョンタグを使用することを推奨します。これにより、どのバージョンが動いているかが明確になり、問題発生時のロールバックも容易になります。
まとめ
リンドくんDocker Hubもプライベートレジストリもそれぞれメリットがあるんですね!
たなべそうなんだ! 公開したいならDocker Hub、セキュアに管理したいならプライベートレジストリという使い分けが基本だね。
プロジェクトの要件に合わせて選ぶことが大切だよ。
今回は、Docker Hubとプライベートレジストリの使い方について解説してきました。
重要なポイントをおさらいしましょう。
- Docker Hubは世界中の開発者が使うパブリックレジストリで、手軽にイメージを共有できる
- イメージをpushする際は
ユーザー名/リポジトリ名:タグという命名規則に従う - プライベートレジストリを使うことで、セキュアな環境でイメージを管理できる
- 公式の
registryイメージを使えば簡単にプライベートレジストリを構築可能 - 認証やHTTPS通信の設定でセキュリティを強化することが重要
- CI/CDパイプラインと統合することで、開発プロセスを自動化できる
Dockerイメージの共有と管理は、現代のソフトウェア開発において欠かせないスキルです。
小規模なプロジェクトではDocker Hubで十分かもしれませんが、チーム開発や企業での利用を考えると、プライベートレジストリの構築方法を知っておくことは非常に価値があります。
最初は少し難しく感じるかもしれませんが、一度セットアップしてしまえば、あとは日常的に使うだけです。
ぜひ実際に手を動かして、自分の環境にレジストリを構築してみてください。チーム開発の効率が格段に上がることを実感できるはずです。





