Een Linux systeem heeft twee filesystems nodig om te functioneren:
- Een boot file system (
bootfs
) - Een root file system (
rootfs
)
Het bootfs
bevat de bootloader en kernel. Tijdens system boot wordt de kernel in het geheugen geladen en het bootfs wordt gedismount.
Het rootfs
bevat de bekende directory structuur met mappen als /dev
, /var
, /etc
en /home
. Hierin staan de diverse binaries en libraries die worden gebruikt om userland-applicaties te draaien.
In een traditionele system boot van een Linux systeem wordt het rootfs
als read-only gemount, de integriteit gewaarborgd en vervolgens als read-write gemount.
Er is nog een soort mount. Een union mount. Hier is sprake van wanneer het ene filesystem bovenop een ander wordt gemount, terwijl ze één lijken te zijn.
Docker verschilt van een traditionele Linux omgeving in het mounten van het rootfs
. In plaats van dit na de integriteitscheck als read-write te mounten, wordt er middels een union-mount een read-write laag bovenop het gewone filesystem gemount. Deze filesystems heten layers. Er kunnen verschillende layers bovenop elkaar worden gemount voordat de read-write layer gemount wordt.
Read-only layers heten images. Ze worden geidentificeerd met een unieke 64-character hexademicale string, maar hebben ook vaak een naam, zoals ubuntu
. Elk image kan naar een parent verwijzen, en het filesystem van een image verandert nooit. Images hebben geen state.
Bij het initialiseren van een container (de precieze definitie volgt nog, het verschilt van een image), is de bovenste read-write layer leeg, maar gaandeweg wordt deze gevuld wanneer processen uitgevoerd worden. Als één van deze processen een file uit een onderliggende layer aan wil passen, dan wordt eigenlijk maar wordt een nieuwe file op dezelfe locatie in het filesystem in de read-write layer aangemaakt. De file lijkt door de union-mount weg te zijn uit de onderliggende laag, maar deze is gewoon aanwezig, maar niet toegankelijk. Deze eigenschap van layers is transparant voor processen/applicaties.
Een container is net iets anders dan een image. Het is de collectie van layers van base tot aan de read-write layer plus metadata. Containers hebben net zoals images een hexadecimale string van 64 tekens die de container uniek identificeerd.
Containers kunnen processen draaien en deze wijzigingen die door processen worden uitgevoerd leiden tot state: de state van het filesystem (ookwel de state van read-write layer die bovenop een aantal images wordt bevestigd door middel van een union mount) en de state van operatie. De status van het filesystem wordt bewaard ongeacht de status van operatie.
De status van operatie kan één van twee opties zijn: running
en exited
.
Wanneer een container zich in de running
state bevindt, bevat de notie van een container niet alleen de graaf van layers, maar ook een tree van processen die (in isolatie van de processen op de host) draaien. In de exited
state hebben containers slechts de staat van het filesystem. Deze kan tot een image worden gemaakt door middel van docker commit
. De state van het werkgeheugen van containerswordt niet tussen restarts bewaard.