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.