Wat is Docker?

Tip

Deze inhoud is een fragment uit het eBook, .NET Microservices Architecture for Containerized .NET Applications, beschikbaar op .NET Docs of als een gratis downloadbare PDF die offline kan worden gelezen.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Docker is een opensource-project voor het automatiseren van de implementatie van toepassingen als draagbare, zelfvoorzienende containers die kunnen worden uitgevoerd in de cloud of on-premises. Docker is ook een bedrijf dat deze technologie bevordert en ontwikkelt, werkt samen met cloud-, Linux- en Windows-leveranciers, waaronder Microsoft.

Diagram showing the places Docker containers can run.

Afbeelding 2-2. Docker implementeert containers op alle lagen van de hybride cloud.

Docker-containers kunnen overal, on-premises worden uitgevoerd in het datacenter van de klant, in een externe serviceprovider of in de cloud, in Azure. Docker-installatiekopieëncontainers kunnen systeemeigen worden uitgevoerd op Linux en Windows. Windows-installatiekopieën kunnen echter alleen worden uitgevoerd op Windows-hosts en Linux-installatiekopieën kunnen worden uitgevoerd op Linux-hosts en Windows-hosts (met een Hyper-V Linux-VM, tot nu toe), waarbij de host een server of een VM betekent.

Ontwikkelaars kunnen ontwikkelomgevingen gebruiken in Windows, Linux of macOS. Op de ontwikkelcomputer voert de ontwikkelaar een Docker-host uit waarop Docker-installatiekopieën worden geïmplementeerd, inclusief de app en de bijbehorende afhankelijkheden. Ontwikkelaars die in Linux of in macOS werken, gebruiken een Docker-host op basis van Linux en ze kunnen alleen installatiekopieën maken voor Linux-containers. (Ontwikkelaars die aan macOS werken, kunnen code bewerken of de Docker CLI uitvoeren vanuit macOS, maar vanaf dit moment worden containers niet rechtstreeks uitgevoerd op macOS.) Ontwikkelaars die aan Windows werken, kunnen installatiekopieën maken voor Linux- of Windows-containers.

Docker verzendt Docker Desktop voor Windows of macOS om containers in ontwikkelomgevingen te hosten en extra ontwikkelhulpprogramma's te bieden. Deze producten installeren de benodigde VM (de Docker-host) om de containers te hosten.

Voor het uitvoeren van Windows-containers zijn er twee soorten runtimes:

  • Windows Server-containers bieden isolatie van toepassingen via proces- en naamruimteisolatietechnologie. Een Windows Server-container deelt een kernel met de containerhost en met alle containers die op de host worden uitgevoerd.

  • Hyper-V-containers breiden de isolatie uit van Windows Server-containers door elke container uit te voeren op een maximaal geoptimaliseerde virtuele machine. In deze configuratie wordt de kernel van de containerhost niet gedeeld met de Hyper-V-containers, wat een betere isolatie biedt.

De installatiekopieën voor deze containers worden op dezelfde manier gemaakt en werken op dezelfde manier. Het verschil is hoe de container wordt gemaakt op basis van de installatiekopieën waarop een Hyper-V-container wordt uitgevoerd, een extra parameter vereist. Zie Hyper-V-containers voor meer informatie.

Docker-containers vergelijken met virtuele machines

Afbeelding 2-3 toont een vergelijking tussen VM's en Docker-containers.

Virtual Machines Docker-containers
Diagram showing the hardware/software stack of a traditional VM. Diagram showing the hardware/software stack for Docker containers.
Virtuele machines bevatten de toepassing, de vereiste bibliotheken of binaire bestanden en een volledig gastbesturingssysteem. Voor volledige virtualisatie zijn meer resources nodig dan containerisatie. Containers bevatten de toepassing en alle bijbehorende afhankelijkheden. Ze delen de besturingssysteemkernel echter met andere containers, die worden uitgevoerd als geïsoleerde processen in de gebruikersruimte op het hostbesturingssysteem. (Behalve in Hyper-V-containers, waarbij elke container binnen een speciale virtuele machine per container wordt uitgevoerd.)

Afbeelding 2-3. Vergelijking van traditionele virtuele machines met Docker-containers

Voor VM's bevinden zich drie basislagen op de hostserver, vanaf de onderkant: infrastructuur, hostbesturingssysteem en hypervisor, en bovendien heeft elke VIRTUELE machine een eigen besturingssysteem en alle benodigde bibliotheken. Voor Docker heeft de hostserver alleen de infrastructuur en het besturingssysteem en daarboven, de containerengine, die container geïsoleerd houdt, maar de basisservice van het besturingssysteem deelt.

Omdat containers veel minder resources nodig hebben (ze hebben bijvoorbeeld geen volledig besturingssysteem nodig), kunnen ze eenvoudig worden geïmplementeerd en worden ze snel gestart. Hierdoor hebt u een hogere dichtheid, wat betekent dat u hiermee meer services op dezelfde hardware-eenheid kunt uitvoeren, waardoor de kosten worden verlaagd.

Als neveneffect van het uitvoeren op dezelfde kernel krijgt u minder isolatie dan VM's.

Het belangrijkste doel van een installatiekopieën is dat de omgeving (afhankelijkheden) hetzelfde zijn voor verschillende implementaties. Dit betekent dat u fouten kunt opsporen op uw computer en deze vervolgens kunt implementeren op een andere computer waarvoor dezelfde omgeving is gegarandeerd.

Een containerinstallatiekopieën zijn een manier om een app of service te verpakken en op een betrouwbare en reproduceerbare manier te implementeren. U kunt zeggen dat Docker niet alleen een technologie is, maar ook een filosofie en een proces.

Wanneer u Docker gebruikt, hoort u niet dat ontwikkelaars zeggen: 'Het werkt op mijn computer, waarom niet in productie?' Ze kunnen gewoon zeggen: 'Het wordt uitgevoerd op Docker', omdat de verpakte Docker-toepassing kan worden uitgevoerd op elke ondersteunde Docker-omgeving en deze wordt uitgevoerd zoals het bedoeld was voor alle implementatiedoelen (zoals Dev, QA, fasering en productie).

Een eenvoudige analogie

Misschien kan een eenvoudige analogie helpen bij het begrijpen van het kernconcept van Docker.

Laten we even teruggaan naar de jaren '50. Er waren geen tekstverwerkers en de fotocopiers werden overal gebruikt (soort).

Stel dat u verantwoordelijk bent voor het snel uitgeven van batches brieven zoals vereist, om ze naar klanten te mailen, met behulp van echt papier en enveloppen, om fysiek te worden bezorgd bij het adres van elke klant (er was toen geen e-mail).

Op een bepaald moment realiseert u zich dat de letters slechts een samenstelling zijn van een grote set alinea's, die naar behoefte worden gekozen en gerangschikt, volgens het doel van de brief, zodat u een systeem bedenken om snel brieven uit te geven, waarvan u verwacht dat ze een flinke verhoging krijgen.

Het systeem is eenvoudig:

  1. U begint met een stapel transparante bladen met elk één alinea.

  2. Als u een reeks letters wilt uitgeven, kiest u de bladen met de alinea's die u nodig hebt, stapelt u ze op en lijnt u deze uit zodat ze er goed uitzien en goed worden gelezen.

  3. Ten slotte plaatst u de set in de fotokopieer en drukt u op het begin om zoveel letters te produceren als nodig is.

Dat is dus het kernidee van Docker.

In Docker is elke laag de resulterende set wijzigingen die plaatsvinden in het bestandssysteem na het uitvoeren van een opdracht, zoals het installeren van een programma.

Dus wanneer u het bestandssysteem 'bekijkt' nadat de laag is gekopieerd, ziet u alle bestanden, opgenomen in de laag toen het programma werd geïnstalleerd.

U kunt een installatiekopieën beschouwen als een hulp-alleen-lezen harde schijf die klaar is om te worden geïnstalleerd op een computer waarop het besturingssysteem al is geïnstalleerd.

Op dezelfde manier kunt u een container beschouwen als de 'computer' waarop de harde schijf van de installatiekopieën is geïnstalleerd. De container kan net als een computer worden ingeschakeld of uitgeschakeld.