Das Layer-System - wie Docker-Images intern aufgebaut sind

Das Layer-System - wie Docker-Images intern aufgebaut sind

Docker-Images sind keine monolithischen Blöcke — sie bestehen aus übereinanderliegenden, unveränderlichen Schichten. Das Layer-System ist der Grund, warum Docker-Builds schnell sind und warum mehrere Images sich denselben Speicher teilen können.

Was ist ein Layer?

Jede Instruction im Dockerfile erzeugt einen neuen Layer — eine Art Snapshot des Dateisystems nach dieser Instruction. Aufeinandergestapelt ergeben alle Layer das vollständige Dateisystem des Images.

FROM ubuntu:22.04        # Layer 1: Ubuntu-Basis
RUN apt-get update       # Layer 2: Paketlisten aktualisiert
RUN apt-get install -y curl  # Layer 3: curl installiert
COPY app/ /app/          # Layer 4: Anwendungsdateien kopiert

Jeder Layer speichert nur die Differenz zum vorherigen — nicht das gesamte Dateisystem.

Layer inspizieren

docker history nginx:latest
IMAGE          CREATED        CREATED BY                                SIZE
a6bd71f48f68   2 weeks ago    /bin/sh -c #(nop)  CMD ["nginx" "-g" "…   0B
<missing>      2 weeks ago    /bin/sh -c #(nop)  EXPOSE 80               0B
<missing>      2 weeks ago    /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT       0B
<missing>      2 weeks ago    /bin/sh -c set -x  && groupadd ...        61.1MB
<missing>      2 weeks ago    /bin/sh -c #(nop)  ENV NGINX_VERSION=1.…   0B
<missing>      2 weeks ago    /bin/sh -c #(nop)  FROM debian:bookworm…  74.8MB

Man sieht genau, welche Instruction wie viel Speicher kostet.

Das Union Filesystem

Docker verwendet standardmäßig overlay2 als Storage Driver. Es legt alle Image-Layer als read-only Schichten übereinander und fügt beim Containerstart einen einzigen beschreibbaren Layer oben drauf. Schreibzugriffe landen nur in diesem Container-Layer — das Image selbst bleibt unangetastet.

┌─────────────────────┐
│  Container Layer    │  ← beschreibbar (pro Container)
├─────────────────────┤
│  COPY app/ /app/    │  ← read-only
├─────────────────────┤
│  RUN apt-get ...    │  ← read-only
├─────────────────────┤
│  FROM ubuntu:22.04  │  ← read-only (geteilt zwischen Images)
└─────────────────────┘

Layer-Sharing zwischen Images

Wenn zwei Images auf demselben Basis-Image aufbauen, teilen sie sich dessen Layer auf der Festplatte. Docker lädt identische Layer beim Pull nur einmal herunter.

# Beide nutzen ubuntu:22.04 als Basis — der Ubuntu-Layer wird nur einmal gespeichert
docker pull myapp:1.0
docker pull myapp:1.1

Warum die Reihenfolge der Instructions zählt

Der Build-Cache greift Layer für Layer. Sobald eine Instruction oder ihr Input sich ändert, werden alle nachfolgenden Layer neu gebaut — der Cache ist ab diesem Punkt ungültig.

# Schlecht: Quellcode-Kopie vor Dependencies → bei jeder Code-Änderung alles neu
COPY . /app/
RUN pip install -r requirements.txt

# Besser: Dependencies erst, Code danach → pip-Layer bleibt cached
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /app/

Mehr dazu im Artikel über Layer-Cache-Strategie.