Docker met Linux in de praktijk: de kracht van containers

Noud van Kruysbergen
0

Containertechniek Docker heeft de afgelopen jaren voor een revolutie gezorgd in de manier waarop de we omgaan met softwareinfrastructuren. Maar niet alleen bedrijven halen voordeel uit de flexibiliteit van Docker, dat geldt ook voor je eigen home- of webserver.

docker-imageSoftwarecontainers maken een stevige opmars door omdat ze flexibel zijn en je ze bijna overal kunt gebruiken en reproduceren. Vooral bij developers en in de cloudwereld is Docker daarom mateloos populair. Maar niet alleen daar loont het gebruik van de containertechniek, ook op kleinere schaal kun je er behoorlijk wat werk mee besparen. De modulariteit van Docker maakt zelfs het overstappen naar een andere server minder heikel. Een grote community van ontwikkelaars heeft veel voorwerk gedaan. Daar kun je op verder borduren om een op maat gemaakte container in elkaar te zetten.

Docker-containers zijn geen virtuele machines. Elke draaiende container is een eigen proces binnen het host-besturingssysteem. Er is geen hypervisor en geen virtuele hardware waarop een compleet besturingssysteem draait. De containers en het host-besturingssysteem gebruiken dezelfde draaiende Linux-kernel. Bij virtuele machines is er bovendien redundantie omdat er telkens een compleet gastbesturingssysteem draait. De containers besparen ook op schijfruimte omdat ze vaker gebruikte afhankelijkheden in de vorm van images hergebruiken.

Images, lagen en containers

De basis van elke Docker-container is een Docker-image. Zo’n bevat alleen de basisprogramma’s, bibliotheken en bestanden. Van een image zijn willekeurig veel containers te maken. Het is net als bij een modelhuis: niemand woont erin, dus daarom is er alleen een elementaire en onpersoonlijke inrichting. Pas als het huis op basis van het modelhuis is gebouwd en door de bewoners (processen) wordt bewoond, is het een thuis.

Een image dat de basis voor meerdere andere images vormt, hoeft niet voor elke andere container apart te worden opgeslagen. Dat is mogelijk door gebruik te maken van filesystem-overlays, die als lagen boven elkaar liggen.

Maak je bijvoorbeeld een nieuwe image op basis van een bestaande MySQL-image, dan worden de in de handleiding van de MySQL-image genoemde lagen gedownload van Docker Hub en boven op elkaar gestapeld. De eigen veranderingen aan de MySQL-image komen op weer een andere laag terecht. De combinatie van al die lagen is dan een eigen nieuwe image.

Als een container op basis van een image gestart wordt, maakt Docker nog een beschrijfbare containerspecifieke datalaag aan. Alle lagen die deel van de image uitmaken, worden dan leesbaar gekoppeld. Daardoor kunnen ze bij veel containers tegelijkertijd gebruikt worden. Die lagen zijn voor de in de container draaiende processen volkomen transparant. Van dat hele gedoe met lagen krijgen ze niets mee. Als een draaiend proces (bij een MySQL-service) een bestand leest, gaat de Linux-kernel alle lagen langs tot hij het bestand op een laag gevonden heeft. Als het proces echter in een bestand wil schrijven, belanden de weggeschreven data op de containerspecifieke datalaag. Die is is alleen voor het proces beschikbaar. Die laag is een vast deel van de container en verdwijnt als die verwijderd wordt. Hoe je zelf een eigen image kunt maken, kun je lezen op pagina 116.

Een netwerk voor zichzelf

Containers zijn normaal gesproken verbonden via een eigen netwerk. Docker bekommert zich zelf om het beheer van dat netwerk. Maar ook daarbij kun je de infrastructuur flexibel aanpassen. Vroeger was het gebruikelijk dat de containers binnen een normaal netwerk verbonden werden. Met de nieuwe User Defined Networks kun je nu complexe netwerkstructuren opzetten. In het artikel op pagina 122 in c’t 10/2017 laten we zien hoe dat moet. Je kunt bijvoorbeeld meerdere containers in een dedicated netwerk zetten om die van de overige containers af te scheiden. Daarbij kan Docker niet alleen het automatisch vergeven van ip-adressen overnemen, maar ook eigen dns-diensten bieden waarmee de containers te vinden zijn.

Een belangrijk paradigma in de Docker-wereld is dat er een dienst per container wordt aangeboden! Zet dus niet een database en een webserver in dezelfde image om een webapplicatie te starten. Zet in zo’n geval de database en de webserver elk in een eigen image en koppel ze in een eigen subnetwerk. Omdat je gebruik maakt van image-overlays, is de verspilde schijfruimte hierdoor nihil.

Control Groups

Een blik op de proceslijst van het hostbesturingssysteem laat zien dat de in de container draaiende processen daar net zo getoond worden als de processen die niet in containers draaien. Het verschil is echter dat bepaalde kernel-mechanismen de containers van de rest van het systeem en van elkaar isoleren. Met Control Groups (cgroups) beperkt de kernel resources als geheugen en rekentijd. Namespaces perken de voor de containers beschikbare resources in tot een klein deel van het hostsysteem. De processen zien dankzij mount-namespaces bijvoorbeeld alleen een beperkt deel van het bestandssysteem – alleen het deel dat ze nodig hebben. Dat lijkt op het eerste gezicht op een chroot-omgeving.

Andere technieken als ipc- en proces-namespaces limiteren de zichtbaarheid en bereikbaarheid van processen binnen de containers. Daardoor zien die processen geen andere processen van het hostsysteem of zelfs van andere containers. De communicatie met andere processen wordt eveneens ingepolderd. Voor de containers is alleen beschikbaar wat er in de containers zit. De namespaces en cgroups maken containers mogelijk. Het is Dockers verdienste dat de omgang met die technieken zo simpel mogelijk gebeurt.

Elke kopie een origineel

Docker is bij ontwikkelaars zo geliefd omdat het zo makkelijk is om er softwareomgevingen mee te reproduceren. Een door Docker gemaakte container ziet er op elke computer hetzelfde uit en heeft dezelfde inhoud. Je kunt bijvoorbeeld een veeleisende webapplicatie met een of meerdere Docker-containers op elke machine snel opzetten. Daarbij hoef je geen rekening te houden met softwareafhankelijkheden, bibliotheekversies en pakketbronnen. Docker maakt een kant-en-klare omgeving met alles wat de applicatie nodig heeft. Bestaat die applicatie uit meerdere containers, dan kun je beter Docker Compose gebruiken. In c’t 10/2017 staat op pagina 125 een voorbeeld met een webserver met database en contentmanagementsysteem.

Het centrale beheer van Dockerimages wordt meestal door Docker Hub gedaan. Daar staan talloze images van al even talloze ontwikkelaars. Je moet daarom wel even goed opletten als je de images daar vandaan haalt. Niet alle images worden regelmatig bijgewerkt of überhaupt nog beheerd. Daarom biedt Docker zogeheten Official Repository’s met images. Een door Docker gefinancierd team houdt een oogje in het zeil bij het beheer en onderhoud daarvan. Het team let er volgens Docker op dat security- updates snel in de images terechtkomen. Gebruik in geval van twijfel altijd een image uit een Official Repository. Bij alle andere images moet je zeker weten dat je de aanbieder kunt vertrouwen.

Besturingssysteemomgevingen van containers

Docker-containers bevatten de uit te voeren software en alle daarvoor benodigde bibliotheken uit Docker-images. Die worden uit vele lagen samengesteld, die zijn te hergebruiken – MySQL- en WordPress-lagen zijn bijvoorbeeld op dezelfde Debian-laag gebaseerd.

docker

Docker onder Windows

Ook in de Windows-wereld neemt het enthousiasme voor Docker razendsnel toe. Microsoft prijst de zegeningen van zogeheten Windows-containers. Het Docker-project biedt parallel daaraan Docker for Windows aan. Voor oudere Windows-versies is er de Docker-toolbox. Alle oplossingen hebben gemeen dat er bij Windows meestal een virtuele machine gebruikt wordt waarin de containers draaien.

Als je Microsofts Windows-containers gebruikt, kun je daar alleen Windows-programma’s in uitvoeren. Voor Linux-toepassingen moet je onder Windows terugvallen op Docker for Windows, maar daar draaien dan alleen weer Linux-programma’s in. In vergelijking met de op Linux gebaseerde Docker-containers is het enthousiasme voor Windows-containers en het bijbehorende aanbod nog gering.

Docker en security

Containers moeten de veiligheid vergroten, applicatie-omgevingen zo klein mogelijk houden en de communicatie daartussen aan banden kunnen leggen. Dat kan door het gebruik van bewezen mechanismen van de Linux-kernel zoals procesen netwerk-namespaces. Maar het gevoel van veiligheid kan op twee punten ook bedrieglijk zijn. De techniek ontwikkelt zich nog stevig door. Kernel- en Docker-ontwikkelaars werken met de User Namespaces al langer aan een techniek om de veiligheid te verbeteren. Maar die wordt standaard nog niet gebruikt omdat er twijfel bestaat over de volgroeidheid. Docker vindt daarnaast nog nieuwe manieren uit voor softwarepakketten en -verspreiding. Dat is te vergelijken met de pakket- en installatietechnieken van Linux-distributies – maar die staan nog in de kinderschoenen.

Voor het toevoegen van securitypatches zijn de meeste containerimages nog afhankelijk van de distributeurs. Pas als die een update uitgebracht hebben, wordt een image bijgewerkt. Volgens Docker moet dat voor ‘officiële’ images binnen 24 uur gebeuren.

Bij ‘niet officiële’ images loopt het toevoegen van security-updates nog meer achter. Vaak krijgen de images pas bij een volgende reguliere update door de image-beheerder dergelijke updates. Ze blijven dan langere tijd werken met een minder veilige basisimage. Een security-update voor de basis triggert geen rebuild van de images die erop gebaseerd zijn.

Het zou prettig zijn als software in Docker-containers in principe niet met rootrechten werkt. Helaas houden veel gangbare Docker-images zich niet aan het advies het hoofdproces met gereduceerde rechten te starten. Dan heeft een indringer die bijvoorbeeld een webapplicatie in een container hackt verder makkelijk spel. Hij kan de – al zijn het er maar weinig – toegankelijke kernelinterfaces met maximale rechten gebruiken. De weerstand die de securitylaag biedt is groter dan een chroot-omgeving, maar zeker minder dan bij een virtuele machine.

(Deze informatie is afkomstig uit een artikel in c’t magazine, dat geschreven is door Merlin Schumacher / Noud van Kruysbergen)

Lees meer over Docker in c't 04/2024

Deel dit artikel

Noud van Kruysbergen
Noud van KruysbergenNoud heeft de 'American Dream' doorlopen van jongste bediende tot hoofdredacteur van c't, waar hij zo veel mogelijk de diepgang, betrouwbaarheid en diversiteit wil bewaken.

Lees ook

Dit is hoe je maandelijks gemakkelijk flink kunt besparen op internet en tv

In dit artikel tonen we je hoe je kunt besparen op internet en tv. Dit kan variëren van het vergelijken van aanbieders tot het aanpassen van je huidig...

Chat GPT gebruiken: dit kun je allemaal doen met de chatbot van OpenAI

OpenAI heeft de ChatGPT-bot ontwikkeld als een taalmodel dat is getraind op een enorme hoeveelheid tekst op het internet. Je kunt ChatGPT gebruiken om...

0 Praat mee
avatar
  Abonneer  
Laat het mij weten wanneer er