PSSLの佐々木です。 Dockerを使っていると、同じアプリケーションでも様々なイメージタグが用意されています。node:18
、node:18-slim
、node:18-alpine
など、どれを選べばいいのか迷ってしまうことはありませんか?
例えばPythonのDocker Imageはversion 3.13.5系だけでもこんなにあります。とほほ。。
この記事では、各Dockerイメージの種類とその特徴、そして「どんな時に使うべきか」を明確にします
主要なDockerイメージの種類
1. 標準イメージ(Latest/バージョン指定)
例: node:18
、python:3.11
、nginx:latest
特徴:
- 最も完全なパッケージセット
- 開発に必要なツールやライブラリが豊富
- サイズは大きめ(通常数百MB〜1GB以上)
- Debianベースが多い
こんな時に選ぶべき:
- 開発環境やテスト環境
- パッケージの互換性問題を避けたい
- 初心者や学習目的
- プロトタイピング段階
2. Slimイメージ
例: node:18-slim
、python:3.11-slim
特徴:
- 不要なパッケージを削除した軽量版
- 削除される例:
curl
、wget
、git
、vim
、nano
、man
ページ、ドキュメント類 - 残されるもの:パッケージマネージャー(
apt
)、基本的なシステムライブラリ
- 削除される例:
- 標準イメージの約50-70%のサイズ
- 基本的な開発ツールは含まれている
- Debianベースだが最小限のパッケージ
こんな時に選ぶべき:
- 本番環境でサイズを抑えたい
- 標準イメージでは大きすぎるが、Alpineは不安
- CI/CDでのビルド時間を短縮したい
- セキュリティ面でパッケージ数を減らしたい
3. Alpineイメージ
例: node:18-alpine
、python:3.11-alpine
、nginx:alpine
特徴:
- Alpine Linuxベース(軽量ディストリビューション)
- 極めて小さなサイズ(通常10-100MB)
- muslcライブラリを使用(glibcではない)
- パッケージマネージャーは
apk
- 最小限のパッケージ構成
- 基本的なシェル(
ash
)のみ bash
、curl
、git
、vim
などは含まれない- セキュリティを重視した最小構成
- 基本的なシェル(
こんな時に選ぶべき:
- 最小限のサイズが必要
- マイクロサービス環境
- コンテナの起動速度を重視
- リソース使用量を最小限に抑えたい
注意点:
- ネイティブ拡張でコンパイルエラーが発生する可能性
- 一部のパッケージが利用できない場合がある
- デバッグツールが限定的
4. Scratchイメージ
例: FROM scratch
特徴:
- 完全に空のイメージ
- 極小サイズ(数KB〜数MB)
- シェルやパッケージマネージャーなし
- 静的バイナリのみ実行可能
こんな時に選ぶべき:
- Go言語の静的バイナリ
- セキュリティを最優先
- 極限までサイズを削減したい
- 攻撃面を最小限に抑えたい
実際のタグ選択:Python 3.13.5を例に
実際にDockerイメージを選ぶ際、以下のような大量のタグが存在します:
3.13.5-bookworm, 3.13-bookworm, 3-bookworm, bookworm
3.13.5-slim-bookworm, 3.13-slim-bookworm, 3-slim-bookworm, slim-bookworm, 3.13.5-slim, 3.13-slim, 3-slim, slim
3.13.5-alpine3.22, 3.13-alpine3.22, 3-alpine3.22, alpine3.22, 3.13.5-alpine, 3.13-alpine, 3-alpine, alpine
3.13.5-windowsservercore-ltsc2025, 3.13-windowsservercore-ltsc2025, 3-windowsservercore-ltsc2025, windowsservercore-ltsc2025
推奨される選択方法
1. バージョン指定の基本ルール
- ❌
python:latest
やpython:3
– 予期しないバージョンアップで動作不良の可能性 - ✅
python:3.13.5
– 具体的なバージョンを指定 - ✅
python:3.13
– マイナーバージョンを固定(パッチ更新は自動)
2. 実際の選択例
# 開発環境:最新の安定版を使用
FROM python:3.13.5-bookworm
# または単純に
FROM python:3.13.5
# 本番環境:Slimで軽量化
FROM python:3.13.5-slim
# マイクロサービス:Alpineで最小化
FROM python:3.13.5-alpine
3. Debianコードネーム(bookworm等)は通常省略可能
python:3.13.5-bookworm
とpython:3.13.5
は同じ- 特定のDebianバージョンに依存する場合のみ明示的に指定
4. Alpineのバージョン指定
python:3.13.5-alpine
で十分(最新のAlpineを使用)python:3.13.5-alpine3.22
は特定のAlpineバージョンが必要な場合のみ
実用的な選択フローチャート
ステップ1: 用途を確認
- 開発・テスト環境 → 標準イメージ
- 本番環境 → Slim または Alpine
- 極限の軽量化が必要 → Scratch
ステップ2: 互換性を確認
- ネイティブ拡張を使用 → 標準 または Slim
- Pure JavaScript/Python → Alpine も選択可能
- 静的バイナリ → Scratch
ステップ3: リソース制約を確認
- ストレージ容量に制限 → Alpine または Scratch
- ネットワーク帯域に制限 → Alpine または Scratch
- 制約なし → 標準 または Slim
まとめ
初心者の方は標準イメージから始めて、慣れてきたらSlimやAlpineに移行するのが現実的なアプローチです。
各イメージの選択基準:
- 標準イメージ: 確実に動かしたい時
- Slimイメージ: バランスを重視する時
- Alpineイメージ: サイズを最優先する時
- Scratchイメージ: 静的バイナリで極限の軽量化が必要な時
プロジェクトの要件と制約を考慮して、最適なイメージを選択しましょう。不明な点があれば、まず標準イメージで動作確認してから、段階的に軽量化を進めることをお勧めします。
またこのほかにもいくつかイメージが存在していますが、基本この4つのどれかを採用しておけばよいと思います
ではまた