
Docker超入門:軽量で効率的なコンテナを支えるDockerイメージのレイヤー構造
Dockerを使うと、「どうしてこんなに軽くて速いんだろう?」と思う瞬間がありますよね。その秘密のひとつが イメージのレイヤー構造 です。これは、コンテナが効率的に動作し、開発や運用をスムーズにしてくれる仕組みです。ここでは、その基本を丁寧に解説していきます。
Dockerイメージはレイヤーの積み重ね
Dockerイメージは「何枚もの透明なシートを重ねたファイルシステム」のような仕組みになっています。
各レイヤーは Dockerfileの1行の命令 に対応し、その変更部分だけを記録します。こうすることで、無駄なくイメージを管理できるんです。

ベースイメージ(Base Image)
イメージの一番下にあるのが ベースイメージ です。これはOSのルートファイルシステムを表し、基本的なディレクトリやコマンドが含まれています。
例えば次のようなものが代表例です。
| ベースイメージ例 | 特徴 |
|---|---|
| Alpine Linux | 非常に軽量(数MB程度)で効率的 |
| Ubuntu | 利用者が多く、豊富なパッケージを利用可能 |
ベースイメージは 読み取り専用 であり、全てのイメージの土台となります。
追加レイヤー(Layers)
ベースイメージの上には、変更や追加を表すレイヤー が順に積み重なります。
例として、次のようなDockerfileを考えてみましょう。
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html/この場合、レイヤー構造は次のようになります。
- FROM ubuntu:20.04 → Ubuntuベースイメージ
- RUN apt-get update && apt-get install -y nginx → nginxをインストールしたレイヤー
- COPY index.html ... → ファイルを追加したレイヤー
それぞれの命令ごとにレイヤーが作られ、変更があれば新しいレイヤーだけが追加されます。
図でイメージするとこうなる!
レイヤー構造をイメージすると、積み木のように「土台(ベース)」の上に「追加の部品(レイヤー)」を積み上げていくイメージです。

コンテナ(Container)
イメージを実行すると コンテナ になります。
このとき、イメージの全レイヤーは 読み取り専用 として使われ、その上に 書き込み可能なレイヤー が1つ追加されます。
この書き込み可能な部分にログを保存したり、アプリを実行したりすることで、コンテナの「動作中の状態」を表現できるわけです。

レイヤー構造のメリット
レイヤー方式のすごいところは、無駄を省いて効率化している点です。
| メリット | 説明 |
|---|---|
| 再利用性 | 複数のイメージで同じベースイメージを共有できる。 |
| 軽量性 | 新しい変更だけをレイヤーとして追加すればよい。 |
| 高速化 | Dockerのキャッシュが働き、同じ命令部分は再利用される。 |
| 管理性 | レイヤーごとに履歴が分かれるため、構成がわかりやすい。 |
例えば10個のイメージがすべてUbuntuをベースにしている場合、Ubuntuレイヤーは一度しかダウンロードされません。
レイヤー構造のまとめ
Dockerイメージのレイヤー構造は、軽量で効率的なコンテナの秘密 です。
同じベースを使って多くのアプリを展開でき、キャッシュによる高速ビルドも可能になります。積み木を重ねるように無駄なく構築できる仕組みこそが、Dockerが多くのエンジニアに支持される理由なのです。
レイヤー構造が活きる!Dockerのキャッシュ活用とビルド効率化
Dockerのレイヤー構造は「積み木方式」だとお話ししましたね。ここに登場するのが キャッシュ機構 です。Dockerはイメージをビルドするとき、過去に作成したレイヤーをうまく再利用してビルド時間を短縮してくれます。
キャッシュの仕組み
Dockerfileを使ってイメージをビルドすると、各命令(FROM, RUN, COPYなど)ごとにレイヤーが作成 されます。
Dockerはビルド時に「以前の同じ命令で作ったレイヤーが残っていれば、それを再利用する」という賢い仕組みを持っています。
つまり、すべての命令をゼロから実行するのではなく、過去の成果物をそのまま利用できるわけです。
図で表すとこんな感じ!
キャッシュの仕組みを図で示すと「どこまで再利用できて、どこから新しく作られるのか」が直感的に分かります。

例で見るキャッシュの動き
次のようなDockerfileを考えます。
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y python3
COPY app.py /app/app.py
CMD ["python3", "/app/app.py"]最初のビルドでは、すべての命令を実行します。
でも、2回目以降にもう一度ビルドした場合、COPY app.py の部分だけが変更されていれば、それ以降の命令だけ再実行され、FROM や RUN のレイヤーは再利用されます。
これにより、何分もかかっていたビルドが、ほんの数秒で終わることもあるんです。
キャッシュが無効になるケース
便利なキャッシュですが、場合によっては再利用できないこともあります。
| 状況 | キャッシュが無効になる理由 |
|---|---|
| Dockerfileの命令を変更した | 命令ごとにレイヤーが作られるため、新しい命令はキャッシュが効かない。 |
| ファイルの内容が変わった | COPYやADDで指定したファイルが変わると、新しいレイヤーが作られる。 |
| キャッシュを明示的に無効化した | docker build --no-cache を指定すると、すべて新しくビルドされる。 |
効率的なDockerfileの書き方
キャッシュをうまく活用するには、Dockerfileの書き方が大切です。
ポイント
- 変更頻度が低い処理は上に書く
例:OSのアップデートやライブラリのインストール - 変更頻度が高い処理は下に書く
例:アプリコードのコピーや設定ファイルの追加
こうすることで、アプリコードを変更したときに、最小限のレイヤーだけ再ビルドすれば済みます。
まとめ
Dockerのレイヤー構造は「軽量さ」と「効率性」の源であり、キャッシュ機構とセットで使うとビルド時間を劇的に短縮 できます。
効率よくDockerfileを書くことは、日常的な開発やCI/CDパイプラインの速度に直結するので、エンジニアにとって必須の知識です。
