Docker: Docker イメージ管理
最終更新:2026-08-26
イメージは Docker の中核的な構成要素です — イメージ管理をマスターすることは、コンテナ世界の「ソフトウェアリポジトリ」をマスターすることを意味します。
1. 学べること
- Docker Hub イメージリポジトリの使用
- イメージタグの名前付け規約
- リポジトリの取得とプッシュ
- イメージレイヤーとキャッシュメカニズム
- イメージクリーンアップポリシー
2. 運用エンジニアの実話
(1) 問題点:CI サーバーのディスクアラート
Bob は CI サーバーからディスクアラートを受信しました — Docker イメージが 40 GB の領域を占有していました。調査の結果、大量の <none> 孤立イメージ(古いビルドの残り)と 5 つのバージョンの Node.js イメージ(各 1.2 GB)が見つかりましたが、チームが実際に必要としていたのは最新の 2 バージョンだけでした。ディスク使用率は 80% で、ビルドが失敗し始めました。
(2) イメージクリーンアップのソリューション
Bob はたった 3 つのコマンドで 20 GB の未使用イメージを削除しました。
BASH
# ダングリングイメージ(タグなしの残り)を削除
docker image prune -f
# どのコンテナでも使用されていないイメージを削除
docker image prune -a -f
# クリーンアップ後にディスク使用量を確認
docker system df
(3) メリット:ディスク容量の回復
20 GB の領域が解放され、ディスク使用率は 80% から 35% に低下し、CI ビルドは通常の動作を再開しました。
3. イメージと Docker Hub
(1) イメージの構成要素
Docker イメージは、ファイルシステムへの変更を表す複数の読み取り専用レイヤーが積み重なって構成されています。
graph TB
L4["CMD ['nginx', '-g', 'daemon off;']<br/>起動コマンド"]
L3["COPY html /usr/share/nginx/html<br/>アプリケーションコード"]
L2["RUN apt-get install nginx<br/>ソフトウェアをインストール"]
L1["FROM debian:bookworm-slim<br/>基本システム"]
L4 --> L3 --> L2 --> L1
(2) イメージ命名規約
TEXT
📖 参照専用
registry/repository:tag
| コンポーネント | 説明 | 例 |
|---|---|---|
| registry | リポジトリ URL(デフォルトは Docker Hub) | docker.io / localhost:5000 |
| リポジトリ | リポジトリ名(ユーザー/イメージ名) | library/nginx / myorg/myapp |
| tag | バージョンタグ(デフォルト:latest) | 1.25-alpine / latest / v2.0 |
(3) 一般的なタグ命名規約
| タグサフィックス | 意味 | サイズ参考 | ユースケース |
|---|---|---|---|
latest |
デフォルトの最新バージョン | 最大 | クイックトライアル |
alpine |
Alpine Linux ベース | 最小(5〜50 MB) | 本番/リソース制約 |
slim |
最小 Debian | 小さい(80〜150 MB) | 本番(glibc が必要) |
bookworm / jammy |
Debian/Ubuntu バージョン指定 | 中(100〜300 MB) | 特定のシステムライブラリが必要 |
v1.25.3 |
正確なバージョン番号 | ベースイメージに依存 | 本番バージョン固定 |
4. イメージの基本操作
▶ サンプル:異なるタグで Nginx イメージを取得 (難易度: ⭐)
BASH
# 異なるタグで nginx を取得
docker pull nginx:latest
docker pull nginx:1.25-alpine
docker pull nginx:1.25
# 取得したイメージを表示
docker images
💻 出力:
TEXT
📖 参照専用
REPOSITORY TAG SIZE
nginx latest 187MB
nginx 1.25-alpine 42.5MB
nginx 1.25 187MB
💡 ヒント: 同じベースイメージの異なるタグは同じ基盤データを共有するため、実際のストレージ使用量は 3 つのイメージのサイズの合計よりはるかに少なくなります(重複排除ストレージ)。
▶ サンプル:ローカルイメージ一覧の表示 (難易度: ⭐)
BASH
# すべてのローカルイメージを一覧表示
docker images
# リポジトリ名でフィルタ
docker images nginx
# イメージ ID のみ表示
docker images -q
▶ サンプル:イメージにタグを付ける(docker tag) (難易度: ⭐⭐)
BASH
# プライベートレジストリ用に既存イメージにタグを付ける
docker tag nginx:1.25-alpine localhost:5000/myapp/nginx:v1
# 新しいタグを検証
docker images | grep myapp
💻 出力:
TEXT
📖 参照専用
localhost:5000/myapp/nginx v1 42.5MB
📌 重要なポイント:
docker tag はイメージのコピーを作成しません。同じイメージを指すエイリアスを作成するだけです。2 つのタグはストレージを共有し、追加のスペースを占有しません。
▶ サンプル:イメージの削除 (難易度: ⭐⭐)
BASH
# 名前:タグでイメージを削除
docker rmi nginx:1.25
# イメージ ID で削除
docker rmi a1b2c3d4e5f6
# 強制削除(停止したコンテナで使用されていても)
docker rmi -f nginx:latest
⚠️ 注意: 実行中のコンテナが使用しているイメージは削除できません。イメージを削除する前に、まずコンテナを
docker stop + docker rm する必要があります。
▶ サンプル:ディスク使用量の確認 (難易度: ⭐)
BASH
# Docker ディスク使用量の内訳を表示
docker system df
# イメージごとの詳細サイズを表示
docker system df -v
💻 出力:
TEXT
📖 参照専用
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 5 2 1.2GB 800MB (66%)
Containers 3 1 150MB 120MB (80%)
Local Volumes 2 1 500MB 250MB (50%)
Build Cache 10 0 300MB 300MB (100%)
5. イメージレイヤーとキャッシュ
(1) レイヤー化の原則
各 Dockerfile 命令はイメージレイヤーを生成します。docker pull 中、レイヤーは 1 つずつダウンロードされ、既存のレイヤーはスキップされます。
graph TB
subgraph "イメージレイヤー(共有、読み取り専用)"
L1["レイヤー 1: 基本 OS<br/>debian:bookworm-slim"]
L2["レイヤー 2: apt install<br/>nginx + 依存関係"]
L3["レイヤー 3: COPY html<br/>カスタムコンテンツ"]
end
subgraph "コンテナレイヤー(書き込み可能)"
C["コンテナレイヤー<br/>ランタイム変更<br/>ログ、一時ファイル"]
end
C --> L3 --> L2 --> L1
(2) レイヤー化の利点
| 利点 | 説明 |
|---|---|
| ストレージ重複排除 | レイヤーごとに 1 つのコピーのみ保存され、複数のイメージが共有する |
| 転送高速化 | pull 中に既存のレイヤーをスキップし、新しいレイヤーのみをダウンロード |
| ビルド高速化 | 変更されていないレイヤーはキャッシュを使用するため、再ビルドされない |
(3) イメージビルド履歴の表示
BASH
# イメージビルド履歴(各レイヤー)を表示
docker history nginx:1.25-alpine
💻 出力(抜粋):
TEXT
📖 参照専用
IMAGE CREATED CREATED BY SIZE
e1ade32 2 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B
<missing> 2 weeks ago STOPSIGNAL SIGQUIT 0B
<missing> 2 weeks ago ENTRYPOINT ["/docker-entrypoint.sh"] 0B
<missing> 2 weeks ago COPY 15-local-resolvers.envsh /etc... 389B
<missing> 2 weeks ago COPY 30-tune-worker-processes.sh /etc... 4.61kB
<missing> 2 weeks ago RUN /bin/sh -c set -x ... && apk add... 30.4MB
<missing> 2 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
6. イメージクリーンアップポリシー
(1) 3 つのクリーンアップコマンドの比較
| コマンド | クリーンアップ範囲 | リスク | 適用シナリオ |
|---|---|---|---|
docker rmi <image> |
指定したイメージを削除 | 低(精密制御) | 既知の不要なイメージを削除 |
docker image prune |
孤立イメージ(<none> タグ)を削除 |
非常に低い(参照なし) | 定期クリーンアップ |
docker image prune -a |
コンテナが使用していないすべてのイメージを削除 | 中(まだ必要なものを削除する可能性) | ディスク容量が少ない場合 |
docker system prune |
すべてをクリーンアップ(イメージ + コンテナ + ボリューム + キャッシュ) | 高(広範囲な削除) | 包括的なクリーンアップ |
▶ サンプル:孤立イメージのクリーンアップ (難易度: ⭐)
BASH
# ダングリング(タグなし)イメージを削除
docker image prune -f
💻 出力:
TEXT
📖 参照専用
Deleted Images:
untagged: <none>
deleted: sha256:a1b2c3d4...
Total reclaimed space: 150MB
(2) 一般的なベースイメージのサイズの比較
| イメージ | サイズ | パッケージマネージャー | 特徴 |
|---|---|---|---|
alpine:3.19 |
7 MB | apk | 超小型、musl libc |
debian:bookworm-slim |
74 MB | apt | 標準 glibc、互換性良好 |
ubuntu:22.04 |
77 MB | apt | 豊富なエコシステム |
node:20-alpine |
135 MB | apk + npm | Node.js ランタイム |
python:3.12-slim |
155 MB | apt + pip | Python ランタイム |
golang:1.22 |
780 MB | apt + go | コンパイル環境 |
7. 完全な例:取得 → タグ → プッシュ → クリーンアップ
BASH
# ============================================
# 完全なチュートリアル:イメージライフサイクル管理
# 範囲:pull、tag、push(ローカルレジストリ)、クリーン
# ============================================
# 1. nginx alpine イメージを取得
docker pull nginx:1.25-alpine
# 2. イメージの詳細を表示
docker images nginx
docker history nginx:1.25-alpine
# 3. ローカルレジストリ用にタグを付ける
docker tag nginx:1.25-alpine localhost:5000/web/nginx:v1.0
# 4. ローカルレジストリを開始(push 先)
docker run -d -p 5000:5000 --name registry registry:2
# 5. タグ付きイメージをローカルレジストリにプッシュ
docker push localhost:5000/web/nginx:v1.0
# 6. プッシュを検証
curl -s http://localhost:5000/v2/web/nginx/tags/list | python3 -m json.tool
# 7. ローカルコピーを削除
docker rmi localhost:5000/web/nginx:v1.0
# 8. ローカルレジストリからプルして検証
docker pull localhost:5000/web/nginx:v1.0
# 9. クリーンアップ:レジストリを停止し、未使用イメージをすべて削除
docker stop registry && docker rm registry
docker image prune -a -f
# 10. 最終ディスク使用量を確認
docker system df
💻 出力(抜粋):
TEXT
📖 参照専用
# docker push localhost:5000/web/nginx:v1.0
The push refers to repository [localhost:5000/web/nginx]
5f0e3b...: Pushed
latest: digest: sha256:7be1... size: 1361
# curl http://localhost:5000/v2/web/nginx/tags/list
{"name":"web/nginx","tags":["v1.0"]}
# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 0 42.5MB 42.5MB (100%)
❓ よくある質問
Q
:latest タグは自動的に更新されますか?A いいえ。既存のローカルの
:latest タグは自動的に更新されません。最新バージョンを取得するには、明示的に docker pull nginx:latest を使用する必要があります。本番環境では :latest の使用を避け、正確なバージョン番号(例: nginx:1.25.4)を使用して再現性を確保してください。Q Alpine イメージと Slim イメージの違いは何ですか?
A Alpine は musl libc と BusyBox に基づいています。極めて小さい(7 MB)ですが、互換性の問題がある可能性があります(例: Python C 拡張)。Slim は Debian に基づいており、glibc を使用します。互換性は良好ですが、サイズは大きいです(80〜150 MB)。可能な限り Slim を使用し、ディスク容量が極めて限られている場合にのみ Alpine を使用してください。
Q ダングリングイメージとは何ですか?
A ラベルなしイメージ(
<none>:<none> として表示)は通常、新しいビルドが古いイメージを上書きするときに作成されます — 古いイメージはラベルを失いますが、そのレイヤーは残ります。docker image prune を使用して安全にクリーンアップできます。現在使用中のイメージには影響しません。Q イメージのビルド履歴を表示するには?
A
docker history <image> は各レイヤーのサイズ、作成時刻、対応する Dockerfile 命令を表示します。--no-trunc を追加して完全なコマンドを表示します。これはイメージサイズを分析し、Dockerfile を最適化するための重要なツールです。Q プライベートリポジトリをセットアップするには?
A 最も簡単な方法は
docker run -d -p 5000:5000 registry:2 を使用することです。5 秒以内にローカルレジストリをセットアップできます。本番環境では、Harbor(Web UI、認証、イメージスキャンを含む)またはクラウドプロバイダーのコンテナレジストリ(例: AWS ECR、Alibaba Cloud ACR)の使用を推奨します。Q イメージを削除してもスペースが解放されないのはなぜですか?
A Docker は OverlayFS をレイヤーストレージに使用し、複数のイメージが同じベースレイヤーを共有する可能性があります。イメージを削除しても、イメージが排他的に使用するレイヤーのみが解放されます。
docker system df -v で各イメージの実際の回収可能スペースを表示できます。📖 まとめ
- イメージは読み取り専用レイヤーが積み重なって構成される。レイヤー化されたストレージにより重複排除とキャッシュによるパフォーマンス最適化が可能
- イメージ命名規約:
registry/repository:tag。本番環境では:latestの使用を避ける docker pull/images/tag/rmiはイメージ管理の 4 つの基本操作docker tagエイリアスを作成し、イメージをコピーしない。docker rmiイメージを削除する前にコンテナをクリーンアップするdocker image pruneを使用して孤立イメージをクリーンアップする。docker system pruneで包括的なクリーンアップ- Alpine は最小(7 MB)だが互換性が低い場合がある。Slim は互換性が良好(80〜150 MB)。ニーズに最適なものを選択する
📝 練習問題
- 基本練習 (難易度 ⭐): Docker Hub から異なるタグで 3 つの Ubuntu イメージを取得し(
latest/22.04/20.04)、docker imagesを使用してそれらのサイズを比較してください。 - 応用問題 (難易度 ⭐⭐):
docker history nginx:latestを使用して Nginx イメージのレイヤーを分析し、最も大きいレイヤーを特定して、それがどの操作に対応しているかを説明してください。 - チャレンジ (難易度: ⭐⭐⭐):
docker system df -vを実行してローカルマシン上の Docker のディスク使用量分布を分析し、docker image prune -a -fを実行してクリーンアップし、回収されたスペースの量を前後で比較してください。
前のレッスン: `docker run` でコンテナを起動する
次のレッスン: コンテナのライフサイクル — start / stop / rm