Wat is Container?

Een uitvoeringseenheid die een applicatie bundelt met de bibliotheken en instellingen die ze nodig heeft, en haar geïsoleerd van andere processen uitvoert terwijl de kernel van het besturingssysteem van de host wordt gedeeld. Op Linux is ze opgebouwd uit namespaces, die de weergave van proces-ID's, het netwerk, mounts enz. scheiden, en cgroups, die het gebruik van CPU en geheugen beperken. Ze is lichter en start sneller dan een virtuele machine die een volledig besturingssysteem opstart, maar omdat ze de kernel deelt, kan ze geen kernel van een ander soort besturingssysteem dan dat van de host draaien. Containers worden gemaakt uit containerimages en aangemaakt en beheerd met tools zoals Docker en Kubernetes.

Japanse benaming: コンテナ

“Container” komt voor in 19 oefenvragen uit 2 onderwerpen, bijv. Basis van cloud en containers, Besturingssysteem en hardware.

Vakgebied: Basis van cloud en containers

Het verschil met een virtuele machine

Virtuele machines draaien elk een besturingssysteem, inclusief kernel, op een hypervisor. Een container start geen besturingssysteem op; hij draait als geïsoleerd proces op de kernel van de host, start daardoor vaak in minder dan een seconde, en er passen er veel op één machine. Anderzijds berust zijn isolatie op functies van de kernel en is die niet zo sterk als die van een virtuele machine. Waar sterke isolatie nodig is, worden containers soms in lichte virtuele machines uitgevoerd.

Het bestandssysteem van een container

Het bestandssysteem van een container is een beschrijfbare laag voor die container, gestapeld op de alleen-lezen lagen van het image. Als een bestand uit het image wordt gewijzigd, wordt het eerst naar de beschrijfbare laag gekopieerd en daarna veranderd (copy-on-write). De beschrijfbare laag verdwijnt als de container wordt verwijderd; gegevens die bewaard moeten blijven, worden dus in externe opslag zoals een volume geplaatst.

Ontwerpen voor wegwerpbaarheid

Containers worden ontworpen in de veronderstelling dat een kapotte container niet wordt gerepareerd, maar opnieuw uit het image wordt gemaakt en vervangen. De configuratie wordt van buitenaf aangeleverd, bijvoorbeeld via omgevingsvariabelen, logs worden naar de standaarduitvoer geschreven zodat het platform ze verzamelt, en toestand wordt in databases of opslag bewaard. Zo is het eenvoudig om het aantal containers te veranderen of een nieuwe versie in te zetten.

Nu oefenen: vragen over Container

Welk verschil tussen containers en virtuele machines is juist?

  1. AContainers hebben elk een eigen besturingssysteemkernel, virtuele machines delen de kernel
  2. BContainers draaien op een hypervisor en virtuele machines alleen met functies van het besturingssysteem
  3. CContainers delen de kernel en virtuele machines draaien een eigen besturingssysteem
Antwoord en toelichting tonen

Antwoord: C. Containers delen de kernel en virtuele machines draaien een eigen besturingssysteem

Containers delen de kernel van één besturingssysteem en isoleren per groep onder meer de weergave van bestanden, processen, netwerk en bruikbare resources. Omdat niet een heel besturingssysteem wordt opgestart, zijn ze licht en starten ze snel. Virtuele machines draaien op een hypervisor elk een besturingssysteem met een eigen kernel; ze zijn zwaarder, maar de isolatie is sterker en ook andere soorten besturingssystemen kunnen draaien. Het delen van de kernel geldt voor containers; let op de keuzemogelijkheid waarin de uitleg omgekeerd is.

Welke combinatie van de Linux-kernelfuncties waarop containers berusten, namespaces en cgroups (control groups), met hun taak is juist?

  1. ANamespaces: scheiden wat een proces ziet (proces-ID's, netwerk, mounts enz.); cgroups: beperken en meten het gebruik van resources zoals CPU en geheugen
  2. BNamespaces: beperken en meten het gebruik van resources zoals CPU en geheugen; cgroups: scheiden wat een proces ziet (proces-ID's, netwerk, mounts enz.)
  3. CNamespaces: starten voor elke container een eigen kernel om de containers van elkaar te isoleren; cgroups: maken voor elke container een virtuele CPU en emuleren de hardware
Antwoord en toelichting tonen

Antwoord: A. Namespaces: scheiden wat een proces ziet (proces-ID's, netwerk, mounts enz.); cgroups: beperken en meten het gebruik van resources zoals CPU en geheugen

Een container is een gewoon proces dat op de kernel van de host draait en met twee mechanismen wordt geïsoleerd. Namespaces verdelen proces-ID's, het netwerk, mounts (de weergave van het bestandssysteem), de hostnaam enz. in groepen, zodat de processen in een container alleen hun eigen deel zien. Cgroups beperken de CPU-tijd en de hoeveelheid geheugen die een groep processen kan gebruiken, en meten het gebruik. Beide zijn kernelfuncties; een container start dus geen eigen kernel en emuleert ook geen hardware.

Veelgestelde vragen

Kan een container een andere Linux-distributie gebruiken dan de host?

Ja. Een image bevat bestanden van de gebruikersruimte zoals opdrachten en bibliotheken, en die kunnen van een andere distributie komen. De kernel wordt echter met de host gedeeld; uname -r toont dus de kernel van de host, en functies die de kernel van de host niet heeft, zijn niet beschikbaar.

Waarom kunnen Linux-containers op Windows of macOS draaien?

Tools zoals Docker Desktop draaien een kleine virtuele Linux-machine en voeren de Linux-containers daarin uit. Linux-containers hebben altijd ergens een Linux-kernel nodig.

“Container” in de toelichting

Vragen met “Container” (19)

  1. Welk verschil tussen containers en virtuele machines is juist?
  2. Welke combinatie van de Linux-kernelfuncties waarop containers berusten, namespaces en cgroups (control groups), met hun taak is juist?
  3. Op een Linux-host wordt met Docker een container gestart uit een image dat op een andere distributie dan die van de host is gebaseerd, en daarin worden uname -r (een opdracht die de release van de kernel toont) en cat /etc/os-release (een opdracht die informatie over de distributie toont) uitgevoerd. Welke beschrijving van de resultaten is juist?
  4. Welke beschrijving van de relatie tussen een containerimage en een container is juist?
  5. In een container die uit een image is gestart, wordt het configuratiebestand /etc/app.conf gewijzigd, dat deel uitmaakt van het image. Welke beschrijving van wat er gebeurt met het gangbare opslagmechanisme van Docker (zoals overlay2) is juist?
  6. Welke combinatie van de opdracht die bij het bouwen van het image met docker build wordt uitgevoerd en de opdracht die bij het starten van een container met docker run wordt uitgevoerd, is voor het bovenstaande Dockerfile juist?
  7. Een image met de naam pinger, gebouwd uit het bovenstaande Dockerfile, wordt gestart met docker run pinger example.com. Welke opdracht wordt in de container uitgevoerd?
  8. Met de bovenstaande opdracht wordt een container gestart uit het image nginx, een webserver die op poort 80 luistert. Het IP-adres van de host is 192.0.2.10, en er zijn geen beperkingen zoals een firewall. Welke URL is juist om deze webserver te bereiken vanuit een browser op een andere pc in hetzelfde netwerk?
  9. Welke beschrijving van benoemde volumes en bind mounts in Docker, die worden gebruikt om gegevens te bewaren die een container schrijft, is juist?
  10. Wat is in Kubernetes de kleinste eenheid die wordt gedeployed en beheerd, en die een of meer containers groepeert die hetzelfde IP-adres en dezelfde volumes delen?
  11. Een webapplicatie kan na het starten ongeveer 60 seconden lang, terwijl ze haar cache laadt, geen aanvragen verwerken en geeft in die tijd 503 terug op /ready. Welke beschrijving van het effect van het toevoegen van de bovenstaande instellingen aan de container van de Pod is juist?
  12. In een Deployment waarvan de containers van de Pods de bovenstaande instellingen hebben, draaien vier Pods die elk 400m (0,4 cores) CPU gebruiken. Het doel voor het CPU-gebruik van de HorizontalPodAutoscaler is 60%, en het benodigde aantal Pods wordt berekend als ⌈huidig aantal × huidig gebruik ÷ doelgebruik⌉. Hoeveel Pods zijn er nodig?
  13. Welke beschrijving van de requests en limits voor resources die in Kubernetes voor een container worden ingesteld, is juist?
  14. Een node heeft als toewijsbare resources 4 CPU-cores en 8 GiB geheugen. Voor de container van elke Pod zijn als requests 500m CPU en 1,5 GiB geheugen en als limits 1 CPU-core en 2 GiB geheugen ingesteld. Er zijn geen andere Pods en geen reserveringen voor het systeem. Hoeveel Pods kunnen er maximaal op deze node worden geplaatst?
  15. Zoals hierboven wordt het verbindingsdoel van de database niet in het image geschreven, maar bij het starten van de container als omgevingsvariabele doorgegeven. Wat is het belangrijkste voordeel van dit ontwerp?

Verwante termen

Pod Docker Kubernetes Omgevingsvariabele (environment variable) Hypervisor CPU-tijd Containerimage Copy-on-write JSON (JavaScript Object Notation) Argument

Naar de woordenlijst