🧱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.

L1
L2
L3
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.