Wat is Docker? De vonk voor de containerrevolutie

Docker is een softwareplatform voor het bouwen van applicaties op basis van containers - kleine en lichtgewicht uitvoeringsomgevingen die gezamenlijk gebruik maken van de kernel van het besturingssysteem, maar verder los van elkaar draaien. Hoewel containers als concept al een tijdje bestaan, hielp Docker, een open source-project dat in 2013 werd gelanceerd, de technologie populairder te maken en de trend naar containerisatie en microservices  in softwareontwikkeling te stimuleren, die bekend is geworden als cloud-native ontwikkeling.

Wat zijn containers?

Een van de doelen van moderne softwareontwikkeling is om applicaties op dezelfde host of cluster geïsoleerd van elkaar te houden, zodat ze elkaars werking of onderhoud niet onnodig verstoren. Dit kan moeilijk zijn, dankzij de pakketten, bibliotheken en andere softwarecomponenten die nodig zijn om ze te laten werken. Een oplossing voor dit probleem zijn virtuele machines, die applicaties op dezelfde hardware volledig gescheiden houden en conflicten tussen softwarecomponenten en concurrentie om hardwarebronnen tot een minimum beperken. Maar virtuele machines zijn omvangrijk - ze hebben allemaal hun eigen besturingssysteem nodig, meestal dus in gigabytes - en zijn moeilijk te onderhouden en te upgraden.

Containers isoleren daarentegen de uitvoeringsomgevingen van applicaties van elkaar, maar delen de onderliggende OS-kernel. Ze worden doorgaans gemeten in megabytes, gebruiken veel minder bronnen dan VM's en starten vrijwel onmiddellijk op. Ze kunnen veel dichter op dezelfde hardware worden verpakt en massaal op en neer worden gedraaid met veel minder inspanning en overhead. Containers bieden een zeer efficiënt en zeer gedetailleerd mechanisme om softwarecomponenten te combineren tot de soorten applicatie- en servicestacks die nodig zijn in een moderne onderneming, en om die softwarecomponenten up-to-date en onderhouden te houden.

Docker

Wat is Docker?

Docker is een open source-project waarmee u eenvoudig containers en container-apps kunt maken. Oorspronkelijk gebouwd voor Linux, draait Docker nu ook op Windows en MacOS. Om te begrijpen hoe Docker werkt, laten we eens kijken naar enkele van de componenten die u zou gebruiken om Docker-container-applicaties te maken.

Dockerfile

Elke Docker-container begint met een Dockerfile . Een Dockerfile is een tekstbestand geschreven in een gemakkelijk te begrijpen syntaxis die de instructies bevat om een ​​Docker- image te bouwen (daarover later meer). Een Dockerfile specificeert het besturingssysteem dat ten grondslag ligt aan de container, samen met de talen, omgevingsvariabelen, bestandslocaties, netwerkpoorten en andere componenten die het nodig heeft - en natuurlijk wat de container daadwerkelijk zal doen als we hem draaien.

Paige Niedringhaus bij ITNext heeft een goede uitsplitsing van de syntaxis van een Dockerfile.

Docker-afbeelding

Zodra je je Dockerfile hebt geschreven, roep je het Docker- buildhulpprogramma aan om een image te maken op basis van dat Dockerfile. Terwijl de Dockerfile de set instructies is die vertelt buildhoe de image moet worden gemaakt, is een Docker-image een draagbaar bestand met de specificaties voor welke softwarecomponenten de container zal draaien en hoe. Omdat een Dockerfile waarschijnlijk instructies zal bevatten over het ophalen van sommige softwarepakketten uit online opslagplaatsen, moet u ervoor zorgen dat u expliciet de juiste versies specificeert, anders kan uw Dockerfile inconsistente afbeeldingen produceren, afhankelijk van wanneer het wordt aangeroepen. Maar zodra een afbeelding is gemaakt, is deze statisch. Codefresh biedt een kijkje in hoe u een afbeelding in meer detail kunt bouwen.

Docker uitvoeren

Het runhulpprogramma van Docker is de opdracht waarmee een container daadwerkelijk wordt gestart. Elke container is een instantie van een afbeelding. Containers zijn ontworpen om van voorbijgaande aard en tijdelijk te zijn, maar ze kunnen worden gestopt en opnieuw gestart, waardoor de container in dezelfde staat wordt gelanceerd als toen deze werd gestopt. Verder kunnen meerdere containerinstances van dezelfde image tegelijkertijd worden uitgevoerd (zolang elke container een unieke naam heeft). De codereview bevat een grote uitsplitsing van de verschillende opties voor de runopdracht, om u een idee te geven van hoe het werkt.

Docker Hub

Hoewel het bouwen van containers eenvoudig is, moet u niet het idee hebben dat u al uw afbeeldingen helemaal opnieuw moet bouwen. Docker Hub is een SaaS-repository voor het delen en beheren van containers, waar u officiële Docker-afbeeldingen van open-sourceprojecten en softwareleveranciers en niet-officiële afbeeldingen van het grote publiek vindt. U kunt containerafbeeldingen downloaden die nuttige code bevatten, of uw eigen afbeeldingen uploaden, deze openlijk delen of in plaats daarvan privé maken. U kunt desgewenst ook een lokaal Docker-register maken. (Docker Hub heeft in het verleden problemen gehad met afbeeldingen die zijn geüpload met ingebouwde achterdeurtjes.)

Docker-engine

Docker Engine is de kern van Docker, de onderliggende client-server-technologie die de containers maakt en uitvoert. Over het algemeen bedoelen ze Docker Engine als iemand in het algemeen Docker zegt en niet over het bedrijf of het totale project praat. Er zijn twee verschillende versies van Docker Engine beschikbaar: Docker Engine Enterprise en Docker Engine Community.

Docker Community-editie

Docker heeft zijn Enterprise-editie in 2017 uitgebracht, maar het oorspronkelijke aanbod, omgedoopt tot Docker Community Edition, blijft open source en gratis en heeft tijdens het proces geen functies verloren. In plaats daarvan voegde de Enterprise Edition, die $ 1.500 per knooppunt per jaar kost, geavanceerde beheerfuncties toe, waaronder controles voor cluster- en beeldbeheer en monitoring van kwetsbaarheden. De BoxBoat-blog geeft een overzicht van de verschillen tussen de edities.

Hoe Docker de containerwereld veroverde

Het idee dat een bepaald proces kan worden uitgevoerd met een zekere mate van isolatie van de rest van de besturingsomgeving, is al decennia ingebouwd in Unix-besturingssystemen zoals BSD en Solaris. De originele Linux-containertechnologie, LXC, is een virtualisatiemethode op OS-niveau om meerdere geïsoleerde Linux-systemen op één host te laten draaien. LXC werd mogelijk gemaakt door twee Linux-functies: naamruimten, die een set systeembronnen omwikkelen en deze aan een proces presenteren zodat het lijkt alsof ze aan dat proces zijn toegewijd; en cgroups, die de isolatie en het gebruik van systeembronnen, zoals CPU en geheugen, voor een groep processen regelen.

Containers ontkoppelen applicaties van besturingssystemen, wat betekent dat gebruikers een schoon en minimaal Linux-besturingssysteem kunnen hebben en al het andere in een of meer geïsoleerde containers kunnen draaien. En omdat het besturingssysteem van containers is afgeleid, kunt u een container verplaatsen over elke Linux-server die de containerruntime-omgeving ondersteunt.

Docker heeft een aantal belangrijke wijzigingen aangebracht in LXC waardoor containers draagbaarder en flexibeler in gebruik zijn. Met Docker-containers kunt u een workload nog sneller en gemakkelijker implementeren, repliceren, verplaatsen en er back-ups van maken dan met virtuele machines. Docker biedt cloudachtige flexibiliteit aan elke infrastructuur die containers kan uitvoeren. De containerimage-tools van Docker waren ook een vooruitgang ten opzichte van LXC, waardoor een ontwikkelaar bibliotheken met images kon bouwen, applicaties kon samenstellen uit meerdere images en die containers en applicaties op lokale of externe infrastructuur kon starten.

Docker Compose, Docker Swarm en Kubernetes

Docker maakt het ook gemakkelijker om gedrag tussen containers te coördineren en zo applicatiestapels op te bouwen door containers aan elkaar te koppelen. Docker Compose is gemaakt door Docker om het proces van het ontwikkelen en testen van multi-container applicaties te vereenvoudigen. Het is een opdrachtregelprogramma, dat doet denken aan de Docker-client, dat een speciaal geformatteerd descriptorbestand inneemt om applicaties uit meerdere containers samen te stellen en ze samen op een enkele host uit te voeren. (Bekijk de Docker Compose-zelfstudie voor meer informatie.)

Meer geavanceerde versies van dit gedrag, wat containerorkestratie wordt genoemd, worden aangeboden door andere producten, zoals Docker Swarm en Kubernetes. Maar Docker biedt de basis. Hoewel Swarm uit het Docker-project is voortgekomen, is Kubernetes het de facto Docker-orkestratieplatform bij uitstek geworden.

Docker voordelen

Docker-containers bieden een manier om bedrijfs- en branchetoepassingen te bouwen die gemakkelijker te monteren, te onderhouden en te verplaatsen zijn dan hun conventionele tegenhangers. 

Docker-containers maken isolatie en beperking mogelijk

Docker-containers houden apps niet alleen geïsoleerd van elkaar, maar ook van het onderliggende systeem. Dit zorgt niet alleen voor een schonere softwarestack, maar maakt het ook gemakkelijker om te dicteren hoe een bepaalde gecontaineriseerde applicatie systeembronnen gebruikt: CPU, GPU, geheugen, I / O, netwerken, enzovoort. Het maakt het ook gemakkelijker om ervoor te zorgen dat gegevens en code gescheiden worden gehouden. (Zie 'Docker-containers zijn staatloos en onveranderlijk' hieronder.)

Docker-containers maken draagbaarheid mogelijk

Een Docker-container wordt uitgevoerd op elke computer die de runtime-omgeving van de container ondersteunt. Applicaties hoeven niet te worden gekoppeld aan het hostbesturingssysteem, dus zowel de applicatieomgeving als de onderliggende besturingsomgeving kunnen schoon en minimaal worden gehouden.

Een MySQL voor Linux-container werkt bijvoorbeeld op vrijwel elk Linux-systeem dat containers ondersteunt. Alle afhankelijkheden voor de app worden doorgaans in dezelfde container geleverd.

Op containers gebaseerde apps kunnen eenvoudig worden verplaatst van on-prem systemen naar cloudomgevingen of van laptops van ontwikkelaars naar servers, zolang het doelsysteem Docker ondersteunt en alle tools van derden die ermee worden gebruikt, zoals Kubernetes (zie "Docker-containers vereenvoudigen orkestratie en schaalbaarheid" hieronder).

Normaal gesproken moeten Docker-containerinstallatiekopieën worden gebouwd voor een specifiek platform. Een Windows-container draait bijvoorbeeld niet op Linux en vice versa. Voorheen was een manier om deze beperking te omzeilen door een virtuele machine te starten die een instantie van het benodigde besturingssysteem draaide, en de container op de virtuele machine uit te voeren.

Het Docker-team heeft sindsdien echter een elegantere oplossing bedacht, manifesten genaamd  , waarmee afbeeldingen voor meerdere besturingssystemen naast elkaar in dezelfde afbeelding kunnen worden verpakt. Manifesten worden nog steeds als experimenteel beschouwd, maar ze geven aan hoe containers zowel een platformonafhankelijke applicatieoplossing als een omgevingoverschrijdende oplossing kunnen worden. 

Docker-containers maken composability mogelijk

De meeste bedrijfstoepassingen bestaan ​​uit verschillende afzonderlijke componenten die in een stapel zijn georganiseerd: een webserver, een database, een in-memory cache. Containers maken het mogelijk om deze stukken samen te stellen tot een functionele eenheid met gemakkelijk verwisselbare onderdelen. Elk stuk wordt geleverd door een andere container en kan onafhankelijk van de andere worden onderhouden, bijgewerkt, verwisseld en gewijzigd.

Dit is in wezen het microservices-model van applicatieontwerp. Door applicatiefunctionaliteit op te splitsen in afzonderlijke, op zichzelf staande services, biedt het microservices-model een tegengif voor langzame traditionele ontwikkelingsprocessen en inflexibele monolithische apps. Lichtgewicht en draagbare containers maken het eenvoudiger om op microservices gebaseerde applicaties te bouwen en te onderhouden.

Docker-containers vergemakkelijken de orkestratie en schaalvergroting

Omdat containers lichtgewicht zijn en weinig overhead opleggen, is het mogelijk om er veel meer op een bepaald systeem te lanceren. Maar containers kunnen ook worden gebruikt om een ​​applicatie over clusters van systemen te schalen en om services op of af te voeren om pieken in de vraag op te vangen of om resources te sparen.

De meest hoogwaardige versies van de tools voor implementatie, beheer en schaalvergroting van containers worden geleverd via projecten van derden. De belangrijkste daarvan is Google's Kubernetes, een systeem om te automatiseren hoe containers worden geïmplementeerd en geschaald, maar ook hoe ze met elkaar zijn verbonden, uitgebalanceerd en beheerd. Kubernetes biedt ook manieren om toepassingsdefinities voor meerdere containers of "Helm-grafieken" te maken en opnieuw te gebruiken, zodat complexe app-stacks op aanvraag kunnen worden gebouwd en beheerd.

Docker heeft ook een eigen ingebouwd orkestratiesysteem, Swarm-modus, dat nog steeds wordt gebruikt voor gevallen die minder veeleisend zijn. Dat gezegd hebbende, Kubernetes is iets van de standaardkeuze geworden; Kubernetes wordt zelfs gebundeld met Docker Enterprise Edition.

Docker-voorbehouden

Containers lossen veel problemen op, maar het zijn geen wondermiddelen. Sommige van hun tekortkomingen zijn inherent aan hun ontwerp, terwijl andere een bijproduct zijn van hun ontwerp.

Docker-containers zijn geen virtuele machines

De meest voorkomende conceptuele fout die mensen maken met containers, is om ze gelijk te stellen met virtuele machines. Omdat containers en virtuele machines echter verschillende isolatiemechanismen gebruiken, hebben ze duidelijk verschillende voor- en nadelen.

Virtuele machines bieden een hoge mate van isolatie voor processen, aangezien ze in hun eigen exemplaar van een besturingssysteem draaien. Dat besturingssysteem hoeft ook niet hetzelfde te zijn als dat op de host. Een virtuele Windows-machine kan draaien op een Linux-hypervisor en vice versa.

Containers gebruiken daarentegen gecontroleerde delen van de bronnen van het hostbesturingssysteem; veel applicaties delen dezelfde OS-kernel, op een sterk beheerde manier. Als gevolg hiervan zijn gecontaineriseerde apps niet zo grondig geïsoleerd als virtuele machines, maar bieden ze voldoende isolatie voor de overgrote meerderheid van de workloads.

Docker-containers bieden geen bare-metal snelheid