FAQ: Docker
Antwoorden op de meest gestelde vragen
Waarom Docker?
? Wat is Docker, waar is het voor te gebruiken?
! In de IT-wereld wordt het werken met Docker beschouwd als een manier om afzonderlijke applicaties met behulp van containers sterker van elkaar te scheiden dan besturingssystemen dat mogelijk maken voor hun processen. Dat helpt primair om applicaties met verschillende eisen in individueel op hen afgestemde omgevingen te draaien, zodat er bijvoorbeeld geen versieconflicten bij bibliotheken ontstaan.
Dat is handig voor webdevelopers die projecten maken met veel afzonderlijke delen, bijvoorbeeld een webserver, database en scripts. Die delen staan dan in eigen containers, zodat tests snel in reproduceerbare omgevingen gedaan kunnen worden. Ook systeembeheerders en serverexploitanten kunnen ervan profiteren: serversoftware is als container makkelijk te testen en ook productief te gebruiken, bijvoorbeeld ook op een x86-NAS (zie het voorgaande artikel). Achter Docker zit het gelijknamige bedrijf dat tools ontwikkelt om images te maken en te distribueren en met die images containers te starten. De techniek die nodig is voor het geïsoleerd uitvoeren, zit in de huidige Linux-kernels en in Windows. De software is onder de Apache-licentie gratis te gebruiken. Docker wil met de support geld verdienen..
Grafische interface voor Docker
? Werkt Docker alleen via de commandline?
! Er bestaan al een paar grafische tools om Docker-containers te beheren. De markt ontwikkelt zich echter relatief snel, waardoor sommige veelbelovende benaderingen alweer achterhaald en gestopt zijn. Een tot nu toe bruikbare en pragmatische oplossing komt van Portainer, dat zelf een Docker-container is en een webinterface ter beschikking stelt.
Portainer kan overigens wel meer dan alleen een simpele host met een paar containers beheren: het kan zich ook om een Docker-swarm bekommeren. Dat zijn Docker-daemons die op meerdere servers draaien en die een gemeenschappelijk logisch netwerk gebruiken en een schaling van de diensten binnen de swarm toestaan. Als je op grootschalige manier met containers in de weer bent, gebruik je Kubernetes of iets vergelijkbaars om die te managen.
Container versus virtualisatie
? Wat is het verschil tussen virtuele machines en containers?
! In principe zijn containers een lichtgewicht vorm van virtualisatie. Ze delen de werkomgevingen van elkaar, begrenzen indien gewenst de beschikbaar gestelde resources en staan zonder een al te grote wirwar aan software toe dat ook vette hardware maximaal te benutten is. Ze delen een kernel en bevatten verder alleen de hoogstnodige bibliotheken. Desondanks heeft elke container dan een eigen netwerkadres, meestal in een Dockereigen netwerk, maar indien gewenst kan dat ook in het lokale netwerk zijn.
Docker vreet schijfruimte
? Na wat geëxperimenteer met verschillende Docker-containers zijn er aardig wat gigabytes aan vrije schuifruimte verdwenen. Hoe kom ik er achter waar die gebleven zijn?
! De images en volumes nemen aardig wat plek in – oftewel de sjablonen voor containers en de bij het starten aangemaakte volumes waar Docker de data van de containers in bewaart. Bij een Linuxsysteem komen die data van de containers normaal gesproken in /var/lib/docker te staan. Daar handmatig met de bezem doorheen te gaan is echter een slecht idee. De Docker-daemon weet het beste wat weg kan en wat nog gebruikt wordt, bijvoorbeeld omdat een andere container dezelfde image gebruikt.
Met docker volume prune en docker image prune kun je een opruimactie starten. Niet meer in gebruik zijnde volumes en images worden door Docker dan verwijderd. Maar kijk uit: het is gebruikelijk dat de gebruiksgegevens van een container op een apart volume worden opgeslagen. Het prunecommando verwijdert die als geen enkele container daar meer naar verwijst (hij hoeft niet te draaien, maar hoeft alleen te bestaan). Daarom moet van /var/lib/docker een backup gemaakt worden.
Data uitwisselen
? Hoe kun je een net bewerkt bestand het makkelijkst in een draaiende container krijgen?
! Als een container draait, moet je dat alleen met behulp van Docker doen. Het commando docker cp accepteert als bron- of doelpad een containernaam vooraan in het pad. Met docker cp web:/var/www/index.html /tmp kopieer je dan het HTML-bestand uit de container web naar de tijdelijke map /tmp van de host.
Kant-en-klare container-images
? Waar kan ik kant-en-klare containerimages vinden, als je niet zelf meteen containers wilt gaan maken?
! De enige bron is eigenlijk de Docker Hub. die door het bedrijf Docker wordt onderhouden. Daar staan bijna alle gangbare software-images. Het aanbod is echter gigantisch. Iedereen kan daar images naartoe uploaden – Docker heeft het zelf over een 'wilde westen'. De hub wordt uitgebreid door de Docker Store, waar images staan die onderhouden worden. Daaronder ook officiële images die volgens de communitystandaarden onderhouden worden. Docker laat de content van de Hub en Store in het zogeheten Register zien.
De Docker-software haalt de images uit het register (dat heet een 'pull') en kan ze doorzoeken. Voor een eerste indruk zijn er de sterren waarmee andere gebruikers een image beoordeeld hebben, het aantal downloads en de indicatie dat het om een officiële image gaat. Het zoeken met een browser op de Docker-hub levert alle resultaten, bij het zoeken via de commandline (docker search <name>) krijg je er standaard maar 20 te zien en maximaal 100.
Het is verder een kwestie van gewoon uitproberen. Veel images in de Docker-hub zijn niet goed bijgewerkt en zonder verdere acties niet bruikbaar. Normaal gesproken bestaan een handleiding en andere bestanden als Github-project. Daar staat dan ook vaak al wat in de bugtrackers, zodat je al voor het downloaden en uitproberen een eerste indruk kunt krijgen.
Image versus container
? Welke term is nu eigenlijk de juiste: container of image?
! Dat ligt aan de context: container is in eerste instantie een verzamelbegrip voor een techniek. Een Docker-image is niet meer dan een bundeling van bestanden van het uitvoerende programma en de daardoor benodigde componenten. Een Docker-image is het kopieersjabloon voor een container, dus voor het starten van een geïsoleerd proces – zogezegd een container-instantie. Images maak je of download je uit een register, containers configureer je en start je.
Bestandslocatie voor containers
? Containers zijn eigenlijk wegwerpartikelen. Waar laten ze dan hun data?
! Bij het starten van containers is het gebruikelijk te zorgen voor een scheiding van de gebruiks- en configuratiedata en de overige bestanden. Normaliter staan de gebruiksen configuratiedata op een of soms ook meerdere afzonderlijke volumes, die ook door updates niet beïnvloed worden. Bij een standaardinstallatie zijn volumes niet meer dan links naar het bestandssysteem van de host. Bij het updaten wordt een container gestopt, een nieuwe image geladen en een nieuwe container gestart, die weer toegang tot de bewaard gebleven volumes krijgt. Een Watchtower-container kan dat automatisch doen (zie de link onderaan).
Beveiliging van container-images
? Hoe komen security-updates in een container?
! Daar zijn verschillende strategieën voor. Als er een nieuwe image is, moet een container sowieso vervangen worden. Vaak loopt het echter mis door de manier waarop nieuwe images ontstaan: alleen het actualiseren van een containerbouwhandleiding zorgt voor vervanging, veranderingen aan de basis-image doen dat niet. Maar daarin zitten juist eerder security-updates. Zo heeft Docker de Hub nu eenmaal opgezet. Daarom zijn er containers die security-updates installeren via de mechanismen van de gebruikte distributie.
Die manier van werken is echter in tegenspraak met het idee in een container alleen software te zetten voor een bepaalde taak en geen andere. Het probleem van de updates is echter niet bevredigend opgelost, omdat het afhankelijk is van de mensen die de images maken. Indicaties voor eventuele securitylekken in de images, die er waren voor aangemelde gebruikers bij de Docker-hub, verstopt Docker nu in de Store. (nkr)