🌐 Docker Hubとは

Docker Hubは、Dockerイメージの巨大な倉庫(レジストリ)です。 GitHubがコードを共有する場所なら、Docker Hubはコンテナイメージを共有する場所です。

💡 Docker Hubの役割

  • 📦 イメージの保管庫 - 世界中のイメージが集まる場所
  • 🔍 イメージの検索 - 必要なイメージを探せる
  • ⬇️ イメージのダウンロード - docker pullで取得
  • ⬆️ イメージのアップロード - 自作イメージを公開
  • 🔄 自動ビルド - GitHubと連携して自動でイメージ作成

📊 Docker Hubの規模(2024年時点)

  • 約830万のイメージリポジトリ
  • 月間約100億回のイメージpull
  • 累計3,180億回以上のpull(2014年〜)
  • 公式イメージは厳選された高品質なイメージ

💰 無料プランと有料プランの違い

無料(Personal) 有料(Pro以上)
pull(ダウンロード) 100回/時間 無制限
パブリックリポジトリ 無制限 無制限
プライベートリポジトリ 1つまで 無制限

💡 パブリック = 誰でもpullできる / プライベート = 自分だけ

※ 学習用途では無料プランで十分です

⚠️ 企業利用の注意(Docker Desktop)

Docker Desktopは以下の条件に該当する企業では有料プラン必須です:

  • • 従業員 250人以上
  • • または 年間売上 1,000万ドル(約15億円)以上

※ 個人利用・小規模企業・教育機関・非商用OSSは無料
※ コマンドラインのDocker Engineは誰でも無料で利用可能

🏢 他のコンテナレジストリ

Docker Hub以外にもコンテナレジストリはあります:

  • Amazon ECR - AWS用
  • Azure Container Registry - Azure用
  • Google Artifact Registry - GCP用
  • GitHub Container Registry - GitHubと統合

公式イメージはDocker Hubにあるため、基本はDocker Hubを使います。
企業では本番環境用に各クラウドのレジストリを使うことが多いです。

🔍 実際にDocker Hubを見てみよう

ブラウザでDocker Hubにアクセスして、実際のイメージを見てみましょう。

https://hub.docker.com

Docker Hubのトップページ
ここから世界中のイメージを探せます

👀 Nginxイメージを詳しく見てみる

公式のNginxイメージページを開いてみましょう:
https://hub.docker.com/_/nginx

https://hub.docker.com/_/nginx

nginx

Official build of Nginx.

✓ Docker Official Image 1B+ Downloads ⭐ 17.5K Stars

Available Tags

latest 1.28 1.28-alpine stable mainline 1.28.0 alpine

✨ Docker Hubで確認できること

  • 📋 イメージの説明 - 何のためのイメージか
  • 🏷️ 利用可能なタグ - バージョンや種類
  • 📊 ダウンロード数 - 人気度の指標
  • スター数 - 評価の指標
  • 📝 使い方のドキュメント - 詳細な利用方法
  • 🔐 公式イメージマーク - 信頼性の証

📛 イメージの命名規則を理解する

Docker Hubのイメージには明確な命名規則があります。これを理解すると、イメージ選びが楽になります。

🔤 イメージ名の構成

レジストリ / ユーザー名 / イメージ名 : タグ
docker.io / library / nginx : 1.28

フル表記と省略形

実は普段使っている nginx は省略形です:

フル表記 省略形 説明
docker.io/library/nginx:latest nginx 公式イメージ
docker.io/library/nginx:1.28 nginx:1.28 公式 + バージョン指定
docker.io/myuser/myapp:v1 myuser/myapp:v1 ユーザー作成イメージ

📝 省略ルール(Docker Hubの場合)

  • docker.io → 省略可能(Docker Hubがデフォルト)
  • library → 公式イメージのみ省略可能
  • :latest → 省略可能(タグなし = latest)

🔬 ハンズオン:フル表記で実行してみる

省略形だけでなく、フル表記でも動くことを確認してみましょう。

1フル表記でコンテナを起動

docker container run -d --rm --name nginx-full -p 8080:80 docker.io/library/nginx:1.28
Unable to find image 'docker.io/library/nginx:1.28' locally 1.28: Pulling from library/nginx ... abc123def456...

2ブラウザで確認

http://localhost:8080 にアクセス → Nginxの画面が表示されればOK!

3起動を確認

docker container ls
CONTAINER ID IMAGE ... PORTS NAMES abc123... nginx:1.28 ... 0.0.0.0:8080->80/tcp nginx-full

フル表記で指定しても、IMAGEは nginx:1.28 と表示されます。

4停止(--rmで自動削除)

docker container stop nginx-full

--rm を付けて起動したので、停止と同時にコンテナが自動削除されます。

💡 ポイント

nginx:1.28docker.io/library/nginx:1.28 も同じです。
Dockerfileの FROM でもフル表記が使えます。

⚠️ 他のレジストリは省略できない

ghcr.io/myuser/myapp:v1 GitHub Container Registry
123456789.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:v1 Amazon ECR

Docker Hub以外のレジストリはURLを省略できません。

⚠️ タグの重要な注意点

  • latestは「最新」だが、いつ変わるか分からない
  • ❌ タグなしは自動的にlatestになる
  • ✅ 本番環境では必ず特定のバージョンタグを使用
  • ✅ 例:nginx:1.28.0のように明確に指定

🔬 イメージのレイヤー構造を見る

Docker Hubでイメージのレイヤー構造を確認できます。これがDockerの効率性の秘密です!

🔍 レイヤー情報の確認方法

Docker Hub上でイメージの「Tags」タブをクリックし、特定のタグを選択すると詳細が見れます。

nginx:latest のレイヤー構造(実際の表示例)

0 # debian.sh --arch 'amd64' out/ 'trixie' 31.29MB
1 LABEL maintainer=NGINX Docker Maintainers 0B
2 ENV NGINX_VERSION=1.29.3 0B
7 RUN /bin/sh -c set -x && groupadd --system nginx... 28.69MB
8 COPY docker-entrypoint.sh / 628B
13 ENTRYPOINT ["/docker-entrypoint.sh"] 0B
16 CMD ["nginx" "-g" "daemon off;"] 0B

🔬 ハンズオン:レイヤーの共有を体験する

レイヤーが共有される仕組みを実際に確認してみましょう。

1nginx:1.27 をpull

docker image pull nginx:1.27
1.27: Pulling from library/nginx a2abf6c4d29d: Pull complete ← ベースOS a9edb18cadd1: Pull complete ← 設定ファイル 589b7251471a: Pull complete ← nginx本体 ...

すべてのレイヤーを新規ダウンロードします。

2nginx:1.28 をpull

docker image pull nginx:1.28
1.28: Pulling from library/nginx a2abf6c4d29d: Already exists ← ダウンロードしない! a9edb18cadd1: Already exists ← ダウンロードしない! f3d8bc1c0c04: Pull complete ← 変わった部分だけ ...

Already exists = ローカルに同じレイヤーがあるのでスキップ!

3ディスク使用量を確認

docker image ls nginx
REPOSITORY TAG IMAGE ID SIZE nginx 1.28 abc123... 188MB nginx 1.27 def456... 188MB

見た目は合計 376MB ですが...

docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 2 0 195.2MB 195.2MB (100%)

実際は約195MBしか使っていない!
共通レイヤーは1つだけ保存され、両方のイメージが参照しています。

🧹 後片付け

docker image rm nginx:1.27 nginx:1.28

🧩 なぜ共有できる? - レイヤーはハッシュで識別

各レイヤーはハッシュ値(SHA256)で識別されます。同じハッシュ = 同じ内容なので、1つだけ保存して共有できます。

nginx:1.27
a2abf6c4... 共有
a9edb18c... 共有
589b7251... 1.27専用
ディスク上は
1つだけ保存
nginx:1.28
a2abf6c4... 共有
a9edb18c... 共有
f3d8bc1c... 1.28専用

💡 レイヤー共有のまとめ

場面 何が起きる?
pullする時 ローカルにあるレイヤーは Already exists でスキップ
ローカル保存 共通レイヤーは1つだけ保存 → ディスク節約
buildする時 変更がない行はキャッシュを使う → ビルドが速い

🛠️ レイヤー情報をコマンドで確認

ローカルにあるイメージのレイヤーを確認することもできます:

# イメージの履歴(レイヤー)を表示
docker image history nginx:latest
IMAGE CREATED CREATED BY SIZE 605c77e624dd 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daem... 0B 2 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B 2 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B 2 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/ngi... 22B 2 weeks ago /bin/sh -c nginx -v 0B 2 weeks ago /bin/sh -c apt-get update && apt-get insta... 61.1MB

各レイヤーがどのコマンドで作られたか、サイズはどれくらいかが分かります。

🔄 イメージをpull/pushしてみよう

Docker Hubは「イメージの倉庫」です。実際にダウンロード(pull)アップロード(push)を体験してみましょう!

⬇️ イメージをpullする

まずは公式イメージをダウンロードしてみます。

1nginxイメージをpull

docker image pull nginx:1.28-alpine
1.28-alpine: Pulling from library/nginx ... Status: Downloaded newer image for nginx:1.28-alpine

2ダウンロードしたイメージを確認

docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.28-alpine abc123... 2 days ago 43.2MB

⬆️ 自作イメージをpushする

自分で作ったイメージをDocker Hubにアップロードしてみましょう。

📝 事前準備

Docker Hubのアカウントが必要です。まだの方はこちらから無料で作成できます。

3Docker Hubにログイン

docker login
Username: あなたのユーザー名 Password: パスワード(入力しても表示されません) Login Succeeded

4イメージに別名を付ける

pushするにはユーザー名/イメージ名:タグの形式が必要です。
docker image tagで既存イメージに別名(エイリアス)を付けます。

# myuser を自分のDocker Hubユーザー名に置き換えてください
docker image tag nginx:1.28-alpine myuser/my-nginx:v1

これはコピーではなく、同じイメージに別名を付けるだけです。

🤔 なぜ別名が必要?

nginx をそのままpushしたいところですが、できません。
nginx = library/nginx公式イメージの名前空間で、自分にはpush権限がないからです。

だから myuser/my-nginx のように自分のユーザー名を付けた名前が必要です。

5イメージをpush

docker image push myuser/my-nginx:v1
The push refers to repository [docker.io/myuser/my-nginx] ... v1: digest: sha256:abc123... size: 1234

6Docker Hubで確認

ブラウザで https://hub.docker.com/r/myuser/my-nginx にアクセス!
自分のイメージがDocker Hubに公開されています。

💡 pull/pushのまとめ

docker image pull イメージ名 Docker Hubからダウンロード
docker image push イメージ名 Docker Hubにアップロード
docker image tag 元 新 イメージに別名(タグ)を付ける

🧹 後片付け

docker image rm nginx:1.28-alpine myuser/my-nginx:v1

🏅 信頼できるイメージの見分け方

🔐 イメージの種類と信頼度

種類 マーク 信頼度
Docker Official Image ✓ Official ⭐⭐⭐⭐⭐ nginx, mysql, redis
Verified Publisher ✓ Verified ⭐⭐⭐⭐ microsoft/dotnet, amazon/aws-cli
Docker Sponsored OSS Sponsored ⭐⭐⭐ bitnami/postgresql
Community Images なし ⭐⭐ username/imagename

📋 各カテゴリの詳細

✓ Docker Official Image

  • メンテナンス:各プロジェクトのチーム(nginx→NGINX社、mysql→Oracle等)
  • Docker社の役割:審査・認定、セキュリティスキャン、ガイドライン策定
  • 特徴:Dockerのベストプラクティスに準拠

✓ Verified Publisher

  • 条件:Docker Partner Programに参加している企業
  • 特徴:身元が確認された企業(Microsoft、Amazon、Oracle等)

Docker Sponsored OSS

  • 条件:Dockerが支援する人気オープンソースプロジェクト
  • 特徴:Docker Hubの特典を無料で利用可能

Community Images

  • 条件誰でも公開できる(アカウントがあれば)
  • 特徴:審査なし → 信頼度が低い

⚠️ イメージ選びの注意点

  • 公式イメージを優先 - セキュリティとサポートが保証
  • ダウンロード数を確認 - 多いほど実績がある
  • 最終更新日を確認 - 古すぎるものは避ける
  • 知らないユーザーのイメージ - セキュリティリスクあり
  • タグがlatestのみ - バージョン管理されていない可能性

💡 安全にイメージを使うコツ

  1. 1. まず公式イメージを探す
  2. 2. なければVerified Publisherを探す
  3. 3. それでもなければスター数とダウンロード数を確認
  4. 4. Dockerfileが公開されているか確認(GitHubリンク)
  5. 5. 定期的に更新されているか確認

😱 驚き!イメージサイズの違い

同じ「Python」でも、タグによってサイズが全然違います。実際に確認してみましょう!

🔬 ハンズオン:Pythonイメージのサイズを比較

1Pythonイメージをダウンロード

# slim版(おすすめ)
docker image pull python:3.13-slim

※ 通常版(約1GB)は大きすぎるのでスキップ

2サイズを確認

docker image ls python
REPOSITORY TAG IMAGE ID CREATED SIZE python 3.13-slim def456... 2 days ago 150MB

🧹 後片付け

docker image rm python:3.13-slim

📝 Pythonイメージのサイズ比較(2025年時点)

タグ サイズ 説明
3.13 約1GB 通常版(重い)
3.13-slim 約150MB 軽量版(おすすめ)
3.13-alpine 約50MB 超軽量版(注意が必要)

※ Python 3.14が最新ですが、安定性を考慮して3.13を推奨

📝 なぜこんなに違うの?

タグ ベースOS 含まれるもの
3.13 Debian(フル版) 開発ツール、コンパイラ、多くのライブラリ
3.13-slim Debian(最小構成) Python実行に必要な最小限
3.13-alpine Alpine Linux 超軽量OS + Python

⚠️ 軽いほど良いわけではない

  • alpineはmusl libcを使用 → 一部のPythonライブラリ(numpy, pandas等)でビルドエラーが起きることがある
  • slimは多くの場合で問題なく動く(おすすめ)
  • 通常版はC拡張ライブラリのビルドが必要な時に便利

💡 迷ったらslimから始めるのがおすすめ!

🔓 公式イメージの中身が丸見え!

実は、公式イメージのDockerfileはGitHubで公開されています。 「このイメージ、どうやって作られてるんだろう?」が全部分かります!

👀 NginxのDockerfileを見てみよう

1Docker Hubでnginxのページを開く

https://hub.docker.com/_/nginx

2「Dockerfile」リンクを探す

ページの「Quick reference」や「Supported tags」セクションに
GitHubへのリンクがあります。

https://github.com/nginxinc/docker-nginx

3Dockerfileの中身を確認

nginx/mainline/debian/Dockerfile(抜粋)

FROM debian:bookworm-slim

LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"

ENV NGINX_VERSION   1.25.3

RUN set -x \
    && groupadd --system nginx \
    && useradd --system --no-create-home -g nginx nginx \
    && apt-get update \
    && apt-get install --no-install-recommends -y nginx \
    ...

COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

💡 Dockerfileを見るメリット

  • 📚 学習になる - プロの書き方が分かる
  • 🔧 カスタマイズのヒント - どこを変えればいいか分かる
  • 🔍 セキュリティ確認 - 何がインストールされているか分かる
  • 🐛 トラブルシューティング - 問題の原因を特定しやすい

🎯 他の公式イメージのDockerfile

自分でDockerfileを書くときの参考にしましょう!

📝 このセクションのまとめ

✅ 学んだこと

  • Docker Hubはイメージの巨大な倉庫
  • イメージには命名規則がある(レジストリ/ユーザー/イメージ:タグ)
  • イメージはレイヤー構造で効率的に管理される
  • 公式イメージを優先的に使うべき
  • タグでバージョンを明確に指定することが重要
  • alpine / slim / 通常版でサイズが大きく違う
  • 公式イメージのDockerfileが公開されている

🎉 Dockerfileとの繋がり

前のセクションで学んだDockerfileの命令(FROM, RUN, COPY など)が、
Docker Hubでレイヤーとして表示されていることが分かりましたね!

Dockerfile → ビルド → イメージ → Docker Hub という流れが見えてきました。

🎯 次のステップ

Dockerfileとイメージの関係が分かったので、次は複数のコンテナを連携させる方法を学びます。

まずは手動で複数コンテナを起動して、その大変さを体験してみましょう!