🧱Images, Layer und Registry
Ein Image ist kein Festplatten-Abbild, sondern ein Stapel schreibgeschützter Dateisystem-Schichten plus eine kleine JSON-Konfiguration. Adressiert wird alles über sha256-Digests.
🏷️Referenz: Name, Tag, Digest
Wie wird aus „nginx“ eine vollständige Adresse? Tippe eine eigene Referenz ein.
Registry · ergänzt
docker.io
Pfad · ergänzt
library/nginx
Tag · ergänzt
:latest
- Vollständig
- docker.io/library/nginx:latest
- Manifest-URL
- https://registry-1.docker.io/v2/library/nginx/manifests/latest
Blasse Teile hat Docker ergänzt. Ein Tag ist nur ein verschiebbarer Name: „latest“ kann morgen auf ein anderes Image zeigen.
🧾Manifest und Digest
Das Manifest listet Konfiguration und Schichten mit ihren Digests. Der Digest des Manifests ist die unveränderliche Identität des Images.
Schichten (Inhalt der Blobs)
Ändere den Inhalt einer Schicht – ihr Digest ändert sich, damit das Manifest und damit der Image-Digest.
L1db59a7ff3cff
L2efe56d9af6ff
L34fc6d6854215
Image-Digest = sha256(Manifest-Bytes)
sha256:6f1b4e41091ed421e294473175cfa650da7ca25c7787e674c50af7cfea084682
Echt berechnet (SHA-256 im Browser). Genau so prüft Docker beim Pull jede Schicht und das Manifest – wer ein Image mit@sha256:… referenziert, bekommt garantiert dieselben Bytes.
Manifest (application/vnd.oci.image.manifest.v1+json)
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:3033562e8498de4b185f16f79643cc22dc33fc515a9d8ceb3270871e598dc5d5",
"size": 153
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:db59a7ff3cff0d7d0c8408acf669f2338ce95125aa0bf84226874dad2d6c33aa",
"size": 17
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:efe56d9af6ffe6bb5764e48544c88bd5c431bf3185a9d7a172f3d479fce3394d",
"size": 12
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:4fc6d6854215adab49c9f52810225a4ff1c4328f2ac17621e1e2835c2f158514",
"size": 17
}
]
}🥞OverlayFS: Union-Mount mit Copy-on-Write
Alle Container desselben Images teilen sich die Image-Schichten. Jeder bekommt nur eine eigene, dünne beschreibbare Schicht (upper). Wähle eine Datei und schreibe oder lösche sie.
merged · Sicht des Containers ( / )
▲ OverlayFS legt die Schichten übereinander ▲
upper · beschreibbare Container-Schicht
leer
lower · Schicht 3 · COPY index.html (schreibgeschützt)
lower · Schicht 2 · nginx installiert (schreibgeschützt)
lower · Schicht 1 · Basis (alpine) (schreibgeschützt)
Ausgewählt
/usr/share/nginx/html/index.html
gelesen aus Schicht 3 · COPY index.html
Protokoll
- Container gestartet – upper ist leer.
💡 Lesen
Die oberste Schicht, in der der Pfad vorkommt, gewinnt. Darunterliegende Versionen sind verdeckt.
💡 Schreiben = copy-up
Beim ersten Schreiben wird die ganze Datei nach upper kopiert. Bei großen Dateien (Datenbanken!) kostet das – deshalb gehören Daten in Volumes.
⚠️ Löschen = Whiteout
Gelöschte Dateien werden nur verdeckt. Ein „RUN rm“ in einer späteren Dockerfile-Zeile macht das Image nicht kleiner.