Instapcursus Docker Desktop: geen gedoe met losse applicatiebestanden
Er bestaan heel wat interessante serverapplicaties, vaak gebaseerd op Linux, die zich niet eenvoudig in Windows laten installeren en ook lastig te configureren zijn. Docker bundelt alle benodigde componenten netjes in een container, die je moeiteloos kunt uitpakken op je eigen pc.
In dit artikel leggen we uit wat Docker is en hoe het werkt. In het kort:
- We installeren Docker Desktop
- We downloaden de gewenste images
- We voeren de image(s) uit, oftewel we zetten ze om naar een container
Ook interessant: Fouten maken mag! Zo kun je in een veilige omgeving je netwerk testen
Voor het efficiënte transport van verschillende ladingen worden vrijwel altijd containers ingezet. Ze zorgen er immers voor dat alle objecten veilig en geordend bij elkaar blijven in een afgesloten omgeving. Wat als je dit principe ook kon toepassen op applicaties? Je zou alle benodigde elementen van zo’n toepassing, zoals programmabibliotheken en configuratiebestanden, kunnen verpakken in een container, waardoor je deze gemakkelijk kunt verplaatsen, beheren en uitvoeren op het gewenste systeem.
Deze aanpak met containers bestaat al enkele decennia, maar het is vooral Docker, dat ongeveer tien jaar geleden deze methode heeft gestandaardiseerd en populair heeft gemaakt.
Containers versus virtualisatie
Docker gebruikt containertechnologie om (web)applicaties te bouwen, te testen en makkelijk uit te rollen of te verspreiden. Voor het Docker-tijdperk gebruikten ontwikkelaars hiervoor gewoonlijk virtuele machines, met behulp van zogeheten hypervisors als Microsoft Hyper-V, VMware ESXi of Oracle VM VirtualBox.
Virtualisatie heeft helaas enkele nadelen. Een virtuele machine bevat naast de eigenlijke applicatie en benodigde software, immers ook een complete kopie van het besturingssysteem, wat veel intern geheugen kan vergen. Bovendien kan het virtualiseren van hardware een flinke impact hebben op de prestaties van het gast-besturingssysteem.
Applicaties in Docker-containers daarentegen gebruiken evenveel werkgeheugen als deze zonder container nodig zouden hebben, wat maakt dat je vaak probleemloos verschillende containers tegelijk op een doorsnee computer kunt draaien. Elke container draait in een volledig afgescheiden, virtueel bestandssysteem met alleen de nodige software en afhankelijkheden. Dit maakt dat je containers moeiteloos kunt migreren en desgewenst kunt verwijderen zonder sporen na te laten. Containers zijn doorgaans dus efficiënter, draagbaarder en veiliger dan virtuele machines.
Van image tot container
Om met containers te werken, is het begrijpen van het concept van ‘images’ essentieel. Een container is namelijk een actieve uitvoeringsinstantie gebaseerd op een onveranderlijke blauwdruk of sjabloon, ook wel image genoemd. Samen met een instructiebestand (Docker-bestand) bevat dit alles wat nodig is om een applicatie te draaien, waaronder de programmacode, omgevingsvariabelen, programmabibliotheken en configuratiebestanden. Een image kan zelfs uit meerdere gestapelde lagen bestaan, zoals Ubuntu Linux, Apache en PHP voor het bouwen van een webserver.
Om een container te maken, kun je gelukkig gebruikmaken van een kant-en-klaar image met behulp van de juiste software. Het programma dat we hiervoor gaan gebruiken, is Docker Desktop. Dit kun je beschouwen als een grafische gebruikersinterface (kortweg GUI) bovenop de onderliggende Docker Engine-software (met de Docker Daemon).
Docker Engine is verantwoordelijk voor het laden van Docker-images, het maken en beheren van Docker-containers op basis van die images en het communiceren met Docker-repository’s voor het downloaden (en uploaden) van images. Docker Desktop maakt daarnaast gebruik van andere softwarecomponenten zoals Docker CLI-client en Docker Compose, maar deze komen verder in onze introductie niet expliciet aan bod.
Docker-repository’s
Repository’s (repositories in het Engels) zijn bibliotheken of opslagplaatsen waar Docker-images worden opgeslagen en gedeeld. Ze kunnen zowel openbaar als privé zijn en geven gebruikers de optie om images te uploaden (push) en te downloaden (pull). Een bekend voorbeeld is Docker Hub, de standaard openbare repository van Docker zelf (zie ook de paragraaf ‘Images zoeken’).
Natuurlijk bevatten images programmacode die binnen containers wordt uitgevoerd, wat het veiligheidsaspect belangrijk maakt. In de paragraaf ‘Veiligheidscontrole’, helemaal aan het einde van dit artikel, bespreken we kort hoe je bekende kwetsbaarheden in images kunt identificeren. Bij niet-officiële images valt niet helemaal uit te sluiten dat er bewust malware is toegevoegd. Er zijn zelfs images ontdekt waarin een cryptominer was ingebouwd of die een ‘Docker-escape’ bevatte waarmee een gecontaineriseerd proces alsnog toegang krijgt tot het hostsysteem.
Voor wie op zoek is naar een kant-en-klaar image: enige waakzaamheid is vereist. Zo’n zoektocht wordt vaak ook bemoeilijkt doordat er vaak honderden images beschikbaar zijn voor dezelfde software. De hoeveelheid downloads en gebruikersbeoordelingen kunnen je wel helpen bij het maken van een keuze.
Windows en hardware
Je hebt nu genoeg basiskennis om aan de slag te gaan met Docker (Desktop), maar je beseft waarschijnlijk wel dat dit vooral iets is voor de wat meer gevorderde gebruiker. Docker Desktop vereist een Windows-machine met Windows 10 of 11, Home of Pro (64 bit), minimaal versie 21H2, maar bij voorkeur de allernieuwste versie.
De machine moet ten minste 4 GB geheugen hebben en een 64bit-processor met SLAT-ondersteuning (Second Level Address Translation, een specifieke hardware-virtualisatietechnologie, bij AMD vaak RVI genoemd en bij Intel Core-processors EPT). In het UEFI/BIOS moet hardware-virtualisatie ook daadwerkelijk zijn ingeschakeld, vaak aangeduid als AMD-V of VT-X. Je kunt dit snel controleren door in Windows op Ctrl+Shift+Esc te drukken, het tabblad Prestaties te openen en op Processor te klikken. Bij Virtualisatie moet Ingeschakeld worden weergegeven. Neem desnoods je systeemhandleiding door voor eventuele aanpassingen aan het systeem-BIOS.
Niet de juiste specs?
Shop voor een nieuwe pc
Windows Subsystem for Linux versie 2
We gaan voornamelijk aan de slag met containers op basis van Linux en voor optimale prestaties hebben we de zogenoemde WSL2-backend nodig (Windows Subsystem for Linux versie 2). Hiermee kan Docker Desktop een echte Linux-kernel gebruiken, wat resulteert in snellere opstarttijden en efficiënter gebruik van bronnen. Een alternatieve backend is Hyper-V, maar die is alleen beschikbaar op Windows Pro en hogere versies, en is doorgaans logger.
Bij een recente Windows-versie is het installeren van WSL2 eenvoudig: open de Opdrachtprompt als administrator en voer het commando wsl --install uit. Als dat nodig is, kun je WSL ook downloaden vanuit de Microsoft Store. WSL werk je eenvoudig bij met het commando wsl --update.
Controleer daarnaast het volgende: druk op de Windows-toets+R en voer optionalfeatures uit. In het venster Windows-onderdelen in- of uitschakelen zorg je er dat zowel Platform voor virtuele machine als Windows-subsysteem voor Linux is aangevinkt. Bevestig met OK en herstart indien nodig je systeem.
Kennismaking Docker Desktop
We zijn nu eindelijk klaar om Docker Desktop te installeren. Je kunt deze gratis downloaden via deze pagina. Start de installatie met een dubbelklik op het exe-bestand (je kunt ook een installatie via de Opdrachtprompt uitvoeren, maar dit laten we hier buiten beschouwing). Indien van toepassing laat je het vinkje staan bij Install required Windows components for WSL 2. Volg de verdere setup-instructies en herstart Windows.
Na de installatie vind je Docker Desktop in het Windows-startmenu. Zorg dat je Docker Desktop opstart met een administrator-account (je kunt ook een account aan de gebruikersgroep docker-users toevoegen, maar dit terzijde).
Klik op het tandwielpictogram en open het onderdeel General. Zorg dat er vinkjes staan bij Use the WSL 2 based engine, Open Docker Dashboard at startup (alleen als je de applicatie vaak gebruikt) en Show CLI hints. Bij Software updates is het handig om Automatically check for updates ingeschakeld te laten. En hoewel we hier in deze introductie niet expliciet op ingaan: laat onder Extensions het vinkje staan bij Enable Docker Extensions.
Alle onderdelen van Docker Desktop zijn bereikbaar via een knoppenbalk aan de linkerzijde. De belangrijkste onderdelen voor dit artikel zijn Containers (actieve instanties van images) en Images (waarschijnlijk gedownload vanuit een repository). Daarnaast zijn er onder andere:
• Volumes: blijvende opslagruimtes om gegevens te behouden, ook als je bepaalde containers niet meer gebruikt;
• Docker Scout: voor analyses van gedownloade images, inclusief veiligheidsanalyse;
• Learning Center: met diverse gidsen en voorbeelden;
• Extensions: verschillende extensies om de functionaliteit van Docker Desktop uit te breiden.
Images zoeken
Je hebt inmiddels begrepen dat alles begint met images. Open daarom het onderdeel Images in Docker Desktop en klik op Local. Je zou hier het image getting-started al moeten zien staan, dat bedoeld is om je verder op weg te helpen met Docker. We laten zo zien hoe je images kunt uitvoeren en omzetten naar een actieve instantie, oftewel een container, maar we leggen eerst uit hoe je andere images kunt toevoegen.
Zoals gezegd kun je hiervoor onder meer terecht in de populaire repository Docker Hub. Maak een account aan, meld je aan, klik op Continue with Free en klik op Verify Email Address in de bevestigingsmail. Meld je met dit account tevens aan in Docker Desktop zelf via Sign in.
Terug in Docker Hub kun je op Explorer klikken en zoekfilters gebruiken. De combinatie Images en Docker Official Image bijvoorbeeld levert ongeveer 180 resultaten op. Als je ook het filter Verified Publisher toevoegt, vind je bijna aan 9000 images. Uiteraard kun je ook je eigen zoektermen in de zoekbalk invoeren.
Bij elk zoekresultaat zie je ook het aantal downloads, oftewel ‘pulls’, inclusief tijdsgrafiek en gebruikerswaardering. Klik op een resultaat voor het specifieke Docker pull command (zie volgende paragraaf), en voor uitleg over de opstart en verdere configuratie van de applicatie.
Overigens kun je ook rechtstreeks vanuit Docker Desktop naar images zoeken. Je hoeft je zoekterm maar in de zoekbalk bovenaan te tikken of je drukt op Ctrl+K voor de ingebouwde zoekmodule. Klik vervolgens op Images en Hub images voor de beschikbare exemplaren op Docker Hub. Klik op het pijlknopje bij Tag om, naast de meest recente versie (Latest) ook alternatieve versies te kunnen opvragen.
Een keur aan images We schreven al dat het lastig kan zijn om een gerichte keuze te maken uit de talrijke (zo goed als kant-en-klare) Docker-images. We weten natuurlijk niet naar welk soort (server)applicaties jouw specifieke interesses uitgaan, maar hieronder vermelden we toch al een aantal images waarvan we hopen dat je die zelf ook interessant vindt – en die op een Windows-machine zonder gebruik van containers lastig(er) te configureren zijn. In willekeurige volgorde:
- Ubuntu: populaire Linux-distributie
- Pi-hole of AdGuard Home: flexibele adblockers
- Transmission: Torrent-client met VPN
- Nextcloud of Owncoud: private cloudopslagdiensten
- Heimdall: dashboard voor applicaties en sites
- Home Assistant: centrale aansturing van slimme apparaten en domotica
- Plex of Jellyfin: mediaservers
- Airsonic-advanced: audioserver
- SABnzbd: nieuwsgroep-reader
- MeTube: krachtige downloader voor online video’s als YouTube
- MariaDB met phpMyAdmin: MySQL-database inclusief beheermodule
- Vaultwarden: wachtwoordbeheerder op basis van Bitwarden
- DDNS Updater: updatetool voor een dynamisch DNS.
Op de websites van de respectievelijke makers vind je vaak configuratie-instructies en gebruikershandleidingen. Wanneer je met een zoekmachine zoekt naar iets als applicatienaam docker container vind je ook al snel pull- en run-instructies, inclusief parameters, voor gebruik vanuit Docker.
Images downloaden
Je hebt nu één of meerdere Docker-images gevonden die je interesseren. Nu is het tijd om die op je eigen pc te krijgen. Gelukkig is dit proces niet ingewikkeld. De eenvoudigste manier is vanuit Docker Desktop, waar je in de zoekmodule op Pull klikt bij het gewenste image. Binnen korte tijd wordt dit image aan je lijst met images toegevoegd, met de status Unused. Je kunt dit image ook weer verwijderen door op het vuilnisbak-icoon te klikken en te bevestigen met Delete forever. Indien van toepassing, dien je wel eerst de bijbehorende container te verwijderen. Als je alleen de container verwijdert en deze nadien opnieuw aanmaakt, is de kans groot dat alles nog werkt zoals ervoor. Dit hangt er wel vanaf of de ontwikkelaar van het bijbehorende image de opslagvolumes correct heeft gekoppeld. Je kunt de inhoud van zo’n container bekijken door op de containernaam te klikken en Files te openen.
Een andere optie om images te downloaden, is om de Opdrachtprompt te gebruiken met het Docker-commando (voer docker in zonder extra toevoegingen voor een overzicht van beschikbare parameters). Om een image te downloaden, gebruik je docker pull <image-naam>, zoals vermeld op Docker Hub. Hierna zul je dit image ook in de lijst van Docker Desktop zien verschijnen.
Uitvoeren via Desktop
Om een image uit te voeren en om te zetten naar een (potentieel) actieve container, hoef je in principe alleen maar op het pijlknopje te klikken naast het gewenste image en nogmaals te bevestigen met Run. Je krijgt in het getoonde venster echter de kans om een of meer instellingen aan te passen onder Optional settings. Dit omvat vaak een Container name (als je geen naam invoert, zal Docker er automatisch een genereren), de Host port, eventuele volumes en omgevingsvariabelen. Nadat je hebt bevestigd, vind je het image terug als een actieve container onder de opgegeven naam.
Stel, je ziet bij Port(s) staan: 8000:8081. Dit betekent dat de interne serverapplicatie draait op poort 8081, maar dat je deze kunt bereiken via poort 8000. Wanneer je dan klikt op die 8000 voor :8081/tcp, zal je browser normaal gesproken starten met het volgende adres: http://localhost:8000.
Bij wijze van voorbeeld hebben we dit gedaan met de MeTube-applicatie. We kwamen direct op een webpagina waar we alleen een video- of playlist-url hoefden in te voeren (bijvoorbeeld https://www.youtube.com/watch?v=_DqeuX44YUg) en de gewenste Quality en Format moesten selecteren. Met een druk op de knop Add werd de bijbehorende video opgehaald en aan de lijst toegevoegd. Je kunt deze video vervolgens via de knop Download naar een fysieke opslaglocatie kopiëren.
Uitvoering via de Opdrachtprompt
Het uitvoeren van een image kun je ook regelen vanaf de Opdrachtprompt met een Docker-commando, maar meestal moet je wel de juiste parameters kennen. Vaak vind je deze informatie op de website van de makers of via een zoekopdracht.
We geven één eenvoudig voorbeeld om het standaard educatieve image docker/getting-started uit te voeren:
docker run -d -p 80:80 docker/getting-started
In dit geval is docker/getting-started de naam van het image. Met de parameter -d (detached) start je de container in de achtergrond en met -p 80:80 koppel je poort 80 van je Windows-pc (de hostmachine) aan de standaardpoort 80 van de container. Dit betekent dat je simpelweg http://localhost in je browser kunt invoeren (aangezien poort 80 de standaard http-poort is). Als je bijvoorbeeld -p 8080:80 had gebruikt, zou je http://localhost:8080 moeten invoeren als adres.
Alternatieven
Gebruik je liever niet Docker Desktop – of lukt het je hiermee niet – dan kun je een gratis opensource-alternatief overwegen, zoals Podman Desktop. Deze is trouwens ook beschikbaar voor macOS en Linux.
De interface heeft veel weg van Docker Desktop. Wanneer je het onderdeel Images opent kun je via Pull an image op basis van trefwoorden images uit repository’s ophalen. Klik op Manage registries om je bijvoorbeeld bij Docker Hub aan te melden. Vanuit het onderdeel Images kun je een image vervolgens opstarten via Run Image / Start Container. Je krijgt dan eerst nog een scherm te zien waarin je allerlei parameters kunt instellen, bijvoorbeeld voor netwerk en veiligheid. Je vindt een opgestarte container terug in het onderdeel Containers.
Heb je een NAS die Docker ondersteunt, dan kun je Docker-images ook rechtstreeks vanaf je NAS draaien. We nemen een Synology DS220+ als voorbeeld. Je installeert eerst Container Manager vanuit het Package Center (of Docker in oudere versies) waarna je ook hier de inmiddels bekende onderdelen als Image en Container aantreft. Images kun je toevoegen vanaf een url of via een lokaal bestand. Raadpleeg eventueel de online gebruikersgidsen van de NAS-fabrikant voor meer informatie.
Veiligheidscontrole
Wanneer je je beperkt tot actuele Docker Official Images en images van Verified Publishers, hoef je meestal niet te veel zorgen te maken over ernstige kwetsbaarheden. Toch is het verstandig om ook dan regelmatig een veiligheidscheck uit te voeren. Met een gratis Docker Hub-account kun je enkele veiligheidsaspecten van je images controleren. Dit kan via Docker Scout binnen Docker Desktop. Selecteer het gewenste image in het menu Sample image en klik op Analyze image. Het overzicht van kwetsbaarheden verschijnt, opgedeeld in C (Critical), H (High), M (Medium) en L (Low). Voor meer details klik je op View packages and CVEs. Bij Vulnerabilities kun je de bijbehorende Packages openen en meer technische informatie opvragen via de links.
Vergelijkbare informatie kun je ook opvragen vanaf de Opdrachtprompt met deze commando’s:
docker scout quickview <image-naam>
of:
docker scout cves <image-naam>
of:
docker scout recommendations <image-naam>
We hebben helaas niet de ruimte hier dieper op in te gaan. Zorg er in elk geval voor dat je zoveel mogelijk de recentste images en updates downloadt en gebruikt.