コンテナイメージ こんてないめーじ
DockerコンテナDockerfileレイヤーレジストリKubernetes
コンテナイメージについて教えて
簡単に言うとこんな感じ!
アプリを動かすために必要なもの全部(プログラム・設定・ライブラリなど)をひとまとめにした「お弁当箱の中身レシピ」みたいなものだよ!このレシピさえあれば、どのサーバーでも同じ状態のアプリをすぐ起動できるんだ。
コンテナイメージとは
コンテナイメージとは、アプリケーションを動かすために必要なコード・ランタイム(実行環境)・ライブラリ・設定ファイルなどをひとつにまとめた「テンプレートファイル」のことです。このイメージをもとに、コンテナ(実際に動くプロセス)が起動されます。
料理で例えると、コンテナイメージは「レシピ+食材セット」で、コンテナはそれを使って実際に作った「料理(完成品)」に相当します。同じイメージから何個でも同じコンテナを起動でき、開発環境・テスト環境・本番環境で「まったく同じ状態」を再現できるのが最大の強みです。
Docker の普及とともに広まったこの仕組みは、今やクラウドやマイクロサービス開発の基盤技術となっています。「自分のPCでは動いたのに本番で動かない」という悩みを根本から解消してくれる存在として、現代のシステム開発に欠かせません。
コンテナイメージの構造と仕組み
コンテナイメージは「レイヤー(層)」と呼ばれる複数の薄いファイル差分を積み重ねた構造になっています。玉ねぎの皮のように層を重ねることで、変更があった部分だけを更新できる効率的な仕組みです。
| 構成要素 | 説明 | 例 |
|---|---|---|
| ベースレイヤー | OSの最小構成 | Ubuntu, Alpine Linux |
| ミドルウェア層 | 言語ランタイムなど | Python 3.11, Node.js 20 |
| アプリ層 | 自分のコードや設定 | app.py, config.yaml |
| メタデータ | 起動コマンドや環境変数 | CMD, ENV, EXPOSE |
コンテナイメージの層構造(イメージ)
┌─────────────────────────┐
│ 自分のアプリコード │ ← 毎回変わる層(薄い)
├─────────────────────────┤
│ ライブラリ・フレームワーク│ ← たまに変わる層
├─────────────────────────┤
│ 言語ランタイム (Python等) │ ← めったに変わらない層
├─────────────────────────┤
│ ベースOS (Ubuntu等) │ ← ほぼ変わらない層
└─────────────────────────┘
↓ docker run
┌─────────────────────────┐
│ コンテナ(書き込み可) │ ← 実行時だけ追加される層
└─────────────────────────┘
覚え方:「レシピ→料理」で考える
- イメージ = レシピカード(それ自体は動かない・読み取り専用)
- コンテナ = そのレシピで作った料理(実際に動いている状態)
- レジストリ = レシピを保管・共有する料理本棚(Docker Hub など)
「イメージからコンテナを作る」=「レシピを見て料理を作る」と覚えると迷いません!
イメージのサイズと最適化の目安
| ベースイメージ | サイズ目安 | 特徴 |
|---|---|---|
| Ubuntu 22.04 | 約70MB | 汎用的・ツールが豊富 |
| Alpine Linux | 約5MB | 超軽量・セキュリティ重視 |
| Distroless | 約2〜10MB | Google製・必要最小限 |
| scratch | 0MB | 完全に空(Goなど向け) |
歴史と背景
- 2000年代初頭: LinuxのnamespaceやcgroupsといったOS機能が整備され、プロセス分離の基盤が確立
- 2008年: LXC(Linux Containers)が登場し、コンテナ技術が実用化に近づく
- 2013年: Dockerがコンテナイメージとレイヤー構造を組み合わせた画期的な仕組みを公開。「Dockerfile」でイメージをコードとして管理できるようになり爆発的に普及
- 2015年: OCI(Open Container Initiative) が設立され、イメージフォーマットの標準化が始まる
- 2016年以降: Kubernetes の普及でコンテナイメージが本番大規模運用でも標準に
- 2020年代: セキュリティスキャン・署名・SBOMなど、イメージの「信頼性管理」が重要課題に
イメージの作成・配布・実行フロー
コンテナイメージがどのように作られ、どこに置かれ、どう使われるかを図解します。
Dockerfileの基本例
# ベースイメージを指定(Pythonの公式イメージを使う)
FROM python:3.11-slim
# 作業ディレクトリを設定
WORKDIR /app
# 依存関係ファイルをコピーしてインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# アプリのコードをコピー
COPY . .
# コンテナ起動時に実行するコマンド
CMD ["python", "app.py"]
このファイルを docker build -t myapp:1.0 . で実行すると、コンテナイメージが完成します。
イメージとVMイメージの違い
| 比較項目 | コンテナイメージ | VMイメージ(OVAなど) |
|---|---|---|
| サイズ | 数MB〜数百MB | 数GB〜数十GB |
| 起動時間 | 秒〜ミリ秒 | 数十秒〜数分 |
| OS共有 | ホストのカーネルを共有 | 独自のOSカーネルを持つ |
| 移植性 | 非常に高い(OCI標準) | 中程度(ハイパーバイザー依存) |
| セキュリティ境界 | プロセスレベル | ハードウェアレベル |
関連する規格・RFC
| 規格・番号 | 内容 |
|---|---|
| OCI Image Format Specification | Open Container Initiativeによるコンテナイメージフォーマットの標準仕様(v1.1) |
| OCI Distribution Specification | レジストリへのイメージのpush/pullAPIの標準仕様 |
| OCI Runtime Specification | コンテナの実行(run)に関する標準仕様。イメージと組み合わせて使用 |
関連用語
- Docker — コンテナイメージのビルド・実行を担う最も普及したコンテナプラットフォーム
- コンテナ — コンテナイメージをもとに実際に起動・動作するプロセス単位
- Dockerfile — コンテナイメージの作り方を記述した設計書ファイル
- コンテナレジストリ — コンテナイメージを保管・配布するためのリポジトリサービス
- Kubernetes — コンテナイメージをもとに多数のコンテナを自動管理するオーケストレーションツール
- マイクロサービス — コンテナイメージ単位でサービスを分割・デプロイするアーキテクチャ手法
- CI/CD — コードのビルドからコンテナイメージの作成・デプロイまでを自動化する仕組み
- レイヤー(コンテナ) — コンテナイメージを構成する差分ファイルの積み重ね構造