Docker: Docker イメージ管理

最終更新:2026-08-26

イメージは Docker の中核的な構成要素です — イメージ管理をマスターすることは、コンテナ世界の「ソフトウェアリポジトリ」をマスターすることを意味します。

1. 学べること


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 イメージは、ファイルシステムへの変更を表す複数の読み取り専用レイヤーが積み重なって構成されています。

100%
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 つずつダウンロードされ、既存のレイヤーはスキップされます。

100%
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 で各イメージの実際の回収可能スペースを表示できます。

📖 まとめ


📝 練習問題

  1. 基本練習 (難易度 ⭐): Docker Hub から異なるタグで 3 つの Ubuntu イメージを取得し(latest / 22.04 / 20.04)、docker images を使用してそれらのサイズを比較してください。
  2. 応用問題 (難易度 ⭐⭐): docker history nginx:latest を使用して Nginx イメージのレイヤーを分析し、最も大きいレイヤーを特定して、それがどの操作に対応しているかを説明してください。
  3. チャレンジ (難易度: ⭐⭐⭐): docker system df -v を実行してローカルマシン上の Docker のディスク使用量分布を分析し、docker image prune -a -f を実行してクリーンアップし、回収されたスペースの量を前後で比較してください。
前のレッスン: `docker run` でコンテナを起動する 次のレッスン: コンテナのライフサイクル — start / stop / rm
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%