Docker-images bestaan uit meerdere lagen die stap voor stap bovenop elkaar worden gebouwd. Elke laag komt overeen met een instructie in het Dockerfile. Deze lagen zijn read-only en kunnen niet worden gewijzigd; wijzigingen kunnen alleen worden aangebracht in nieuwe lagen die naar boven worden toegevoegd en die de bestaande bestanden van de onderliggende lagen overschrijven.
Lagen worden georganiseerd in een stamboom-achtig formaat. De basislaag, ook wel de ouderraadlaag genoemd, is de eerste laag van een Docker-image en deze bevat het besturingssysteem. Elke volgende laag voegt extra functionaliteit toe, zoals systeemdependencies, bibliotheken of applicatiecode.
Elke laag heeft een unieke ID en houdt een hash bij van de inhoud van dat moment. Dit maakt het gebruik van image caching mogelijk, wat betekent dat als een laag al bestaat, Docker deze niet opnieuw hoeft te bouwen, wat tijd bespaart bij het bouwen en verspreiden van images.
Aan de oppervlakte van dit stacksysteem, is er een dunne, schrijfbare laag (bekend als de containerlaag) voor elke actieve container, waarin de Runtime-gegevens worden opgeslagen. Als de container wordt verwijderd, wordt deze bovenste laag ook verwijderd, maar de onderliggende image-lagen blijven ongewijzigd.