Wat is Docker en welke soorten containers bestaan er?
Wanneer je over containertechnologieën spreekt, valt al snel de naam Docker. Docker is enorm belangrijk geweest in het hele containerverhaal, maar intussen bestaan er ook andere technologieën. We geven je graag wat inzicht in de alternatieven op de markt. Misschien bieden ze wel een meerwaarde voor jouw project?
Containers worden vaak op één hoop gegooid met virtualisatie, maar er is een fundamenteel verschil. Een container is namelijk geen virtuele machine. Zie het eerder als een proces dat wijsgemaakt wordt dat het zich in een optimale nepwereld bevindt. Wij lichten graag even de verschillende types toe.
Bij containertechnologieën kan je een onderscheid maken tussen applicatiecontainers en systeemcontainers.
Applicatiecontainers gaan één enkel proces of applicatie "containeriseren" met de nodige software dependencies en configuratiebestanden. Deze containers zijn altijd stateless van karakter. Dit wil zeggen dat bij het herstarten van de container er geen data in de container opgeslagen blijft. Om data op te slaan in applicatiecontainers moet men bij de configuratie van de container expliciet definiëren dat data van de container in persistente storage moet opgeslagen worden.
Systeemcontainers op hun beurt, simuleren een volledig besturingssysteem. Dit laat toe dat dit type containers meerdere processen en applicaties kunnen containeriseren binnen één en dezelfde container. Je gaat systeemcontainers dan ook eerder behandelen als virtuele machines. Toch blijven het containers omdat ze de kernel gebruiken van het besturingssysteem waarop ze draaien. Ze hebben dus niet hun eigen kernel zoals bij virtuele machines. Systeemcontainers zijn stateful. Dit wil zeggen dat data die gegenereerd wordt door de container blijft opgeslagen in de container en dus niet verloren gaat bij een reboot.
Applicatiecontainers
De meest bekende containertechnologie is uiteraard Docker. Docker valt onder de categorie van de applicatiecontainers. Meer zelfs: Docker heeft de basis gelegd voor het gebruik van applicatiecontainers, vandaar ook dat de naam zo bekend klinkt voor de meeste applicatieontwikkelaars.
Docker containers creëer je door middel van een Dockerfile bestand. In de dockerfile definieer je volgende configuratiestappen:
- de Dependencies
- de Applicatie
- de nodige Bestanden
Dockerfiles kunnen gemakkelijk gedeeld worden met anderen. Je kan er zeker van zijn van de omgeving die je gecreëerd hebt met jouw Dockerfile dat deze ook elders gaat werken. Dit is uiteraard erg krachtig en toont de potentiële meerwaarde aan van containertechnologie.
Met de jaren zijn er ook drop-in replacements gekomen voor Docker. Deze willen vooral de tekortkomingen van oplossen. Docker was namelijk eerst en erg robuust, maar technologie evolueert snel en er kwamen al snel enkele interessante alternatieven op de proppen.
Een bekende drop-in replacement is Podman. Podman runt niet als 1 Daemon. Even toelichen: als de Docker service crasht, zullen alle Docker containers crashen. Dit is bij Podman niet het geval. Een bijkomend voordeel is dat Podman containers ook kunnen gestart worden als non-root gebruikers. Dit is op het vlak van security een zeer groot voordeel.
SysteemContainers
Voor systeemcontainers kijkt men vooral naar LXC Containers. Zoals verteld gaan ze een volledige virtuele machine simuleren. Ook maken ze gebruik van de host kernel; ze hebben dus niet hun eigen kernel. Voor elke bekende Linux distributie ga je een LXC container template kunnen terugvinden. Zo kan je jouw favoriete package manager (yum, apt, pacman,...) gebruiken in een LXC container. Omdat ze stateful zijn en zich gedragen als virtuele machines, gebruik je voor automatisatie best een configuration manager (Ansible, Puppet,..) om te automatiseren. LXC heeft geen equivalent van een Dockerfile.
Welk type container kies je best?
Die keuze is volledig aan jou, welke stijl van systeembeheer het best bij jou past. Heb je veel ervaring met virtuele machines en Ansible, dan is de stap kleiner om LXC containers tot zijn volledig nut te gebruiken.
Bouw je liever een applicatie op aan de hand van een configuratiebestand waarbij alle stappen lekker geautomatiseerd verlopen? Daarenboven kan je deze gemakkelijk delen en er met Git source control op uitvoeren. Dat is een applicatiecontainer meer iets voor jou.