Hoe te bepalen of je Docker nodig hebt in plaats van een VM? Het moet duidelijk zijn wat je precies wilt isoleren. Als je een systeem wilt isoleren met gegarandeerde toegewezen middelen en virtuele hardware, dan moet je kiezen voor een VM. Als je werkende toepassingen als aparte processen in het systeem wilt isoleren, heb je Docker nodig.
Wat is het verschil tussen Docker-containers en VM?
Een virtuele machine (VM) is een virtuele computer met alle virtuele apparaten en een virtuele harde schijf, waarop een nieuw onafhankelijk besturingssysteem samen met virtuele apparaatdrivers, geheugenthema's en andere componenten wordt geïnstalleerd. Dat wil zeggen, we krijgen een abstractie van fysieke hardware die het mogelijk maakt om meerdere virtuele computers op één computer uit te voeren.
Een geïnstalleerde VM kan op verschillende manieren ruimte op de computerhardeschijf innemen:
- vaste schijfruimte, wat snellere toegang tot de virtuele harde schijf mogelijk maakt en filefragmentatie voorkomt;
- dynamische geheugenallocatie. Bij de installatie van extra toepassingen zal het geheugen dynamisch voor hen worden toegewezen, tot het maximale volume dat aan hen is toegewezen.
Hoe meer virtuele machines op de server, hoe meer ruimte ze innemen en ze vereisen ook constante ondersteuning van de omgeving die nodig is voor de werking van jouw toepassing.
Docker is software voor het maken van toepassingen op basis van containers. Container- en virtuele machines hebben vergelijkbare voordelen, maar werken anders. Containers nemen minder ruimte in omdat ze een groter aantal gedeelde resources van het host-systeem hergebruikten dan VM, omdat ze, in tegenstelling tot VM, virtualisatie op het niveau van het OS bieden en niet van de hardware. Deze benadering zorgt voor een kleinere geheugenvraag, snelle implementatie en eenvoudigere schaalbaarheid.
Een container biedt een effectievere mechanism voor de encapsulatie van applicaties en biedt de noodzakelijke interfaces van het host-systeem. Deze mogelijkheid stelt de containers in staat om de systeemkernel te delen, waarbij elke container als een afzonderlijk proces van het hoofdbesturingssysteem draait, met een eigen set geheugenruimtes (een eigen virtuele adresruimte). Aangezien de virtuele adresruimte van elke container uniek is, kunnen gegevens die aan verschillende geheugenruimtes toebehoren niet worden veranderd.
De native OS voor Docker is Linux (Docker kan ook op Windows en MacOS worden gebruikt), en het maakt gebruik van zijn belangrijkste voordelen die het mogelijk maken om de kernel te scheiden. Het uitvoeren van Docker-containers op Windows gebeurt binnen een virtuele machine met een Linux-OS, omdat de containers de OS van het host-systeem delen en Linux hun primaire besturingssysteem is.
Hoe werkt een container?
Container — is een abstractie op applicatieniveau die code en afhankelijkheden combineert. Containers worden altijd gemaakt uit images, waarbij een schrijfbare bovenlaag wordt toegevoegd en verschillende parameters worden geïnitialiseerd. Omdat een container zijn eigen schrijflaag heeft en alle veranderingen in deze laag worden opgeslagen, kunnen meerdere containers gezamenlijk toegang hebben tot dezelfde basisimage.
Elke container kan worden geconfigureerd via een bestand in het project docker-compose, opgenomen in de hoofdoplossing — docker-compose.yml. Daar kunnen verschillende parameters worden ingesteld zoals de naam van de container, poorten, identificaties, limieten voor resources en afhankelijkheden tussen andere containers. Als er in de instellingen geen naam voor de container wordt opgegeven, zal Docker elke keer een nieuwe container aanmaken, waarbij het een willekeurige naam toekent.
Wanneer een container uit een image wordt gestart, mont Docker het bestandssysteem voor lezen en schrijven bovenop de onderliggende lagen. Hier zullen alle processen worden uitgevoerd die we willen dat onze Docker-container uitvoert.
Wanneer Docker een container voor de eerste keer start, is de initiële laag voor lezen en schrijven leeg. Wanneer er wijzigingen plaatsvinden, worden deze toegepast op deze laag; als je bijvoorbeeld een bestand wilt wijzigen, wordt dat bestand gekopieerd van de alleen-lezen laag eronder naar de laag voor lezen en schrijven.
De alleen-lezen versie van het bestand blijft bestaan, maar is nu verborgen onder een kopie. Volumes worden gebruikt voor gegevensopslag, ongeacht de levenscyclus van de container. Volumes worden geïnitialiseerd bij het aanmaken van de container.
Hoe is een afbeelding verbonden met een container?
Afbeelding is het belangrijkste element voor elke container. Een afbeelding wordt gemaakt uit de Dockerfile die aan het project is toegevoegd en bestaat uit een set van bestandsystemen (lagen) die op elkaar zijn gestapeld en samen zijn gegroepeerd en alleen-lezen zijn; het maximale aantal lagen is 127.
Elke afbeelding is gebaseerd op een basisafbeelding, die wordt opgegeven met de FROM-opdracht – het startpunt bij het vormen van de Dockerfile-afbeelding. Elke laag is een readonly-laag en wordt vertegenwoordigd door één opdracht die het bestandssysteem in de Dockerfile wijzigt.
Om deze lagen in één afbeelding te combineren, gebruikt Docker het geavanceerde multi-laagse Union file system (AuFS is gebaseerd op UnionFS), waarmee verschillende bestanden en mappen uit verschillende bestandslagen transparant kunnen worden gestapeld, wat een samenhangend bestandssysteem creëert.
De lagen bevatten metadata die aanvullende informatie over elke laag mogelijk maken tijdens uitvoering en bouw. Iedere laag bevat een verwijzing naar de volgende laag; als een laag geen verwijzing heeft, dan is dit de bovenste laag in de afbeelding.
Een Dockerfile kan de volgende opdrachten bevatten:
- FROM – het startpunt bij het vormen van de afbeelding;
- MAINTAINER – de naam van de eigenaar van de afbeelding;
- RUN – een opdracht uitvoeren tijdens de bouw van de afbeelding;
- ADD – een bestand van de host naar de nieuwe afbeelding kopiëren; als een URL-bestand is opgegeven, zal Docker het in de opgegeven directory downloaden;
- ENV – omgevingsvariabelen;
- CMD – start de creatie van een nieuwe container op basis van de afbeelding;
- ENTRYPOINT – de opdracht die wordt uitgevoerd bij het starten van de container.
- WORKDIR – de werkdirectory voor het uitvoeren van de CMD-opdracht.
- USER – stelt de UID in voor de container die is gemaakt op basis van de afbeelding.
- VOLUME – monteert een directory van de host in de container.
- EXPOSE – een set van poorten die in de container luisterend zijn.
Hoe werkt UnionFS?
UnionFS — een dienst stapel bestandssysteem (FS) voor Linux en FreeBSD. Dit bestandssysteem implementeert een copy-on-write mechanisme (COW). De werk eenheid van UnionFS is een laag, waarbij elke laag beschouwd moet worden als een afzonderlijk volledig bestandssysteem met een hiërarchie van mappen vanaf de root. UnionFS creëert een gecombineerde montage voor andere bestandssystemen en stelt gebruikers in staat om bestanden en mappen van verschillende bestandssystemen (de zogenaamde takken) transparant samen te voegen in één enkele verbonden bestandssysteem.
De inhoud van mappen met dezelfde paden wordt samen weergegeven in één gecombineerde map (in één naamruimte) van het verkregen bestandssysteem.
UnionFS voegt lagen samen volgens de volgende principes:
- één van de lagen wordt de bovenslaag, de tweede en volgende laag worden de onderliggende lagen;
- voor de gebruiker zijn de objecten van de lagen toegankelijk «van boven naar beneden», dat wil zeggen als het opgevraagde object zich in de «bovenste» laag bevindt, wordt dit object teruggegeven, ongeacht of er een object met dezelfde naam in de «onderliggende» laag is; anders wordt het object van de «onderliggende» laag teruggegeven; als het opgevraagde object zich in geen van beide lagen bevindt, wordt de fout «Bestand of map bestaat niet» teruggegeven;
- de werklaag is de «bovenste», dat wil zeggen dat alle gebruikersacties met betrekking tot gegevens alleen op de bovenste laag worden weerspiegeld, zonder invloed op de inhoud van de onderliggende lagen.
Docker is de meest gebruikte technologie voor containergebruik bij applicatiewerk. Het is de standaard geworden in dit gebied, gebouwd op basis van cgroups en naamruimten, die door de Linux-kernel worden gegarandeerd.
Docker stelt ons in staat om snel applicaties te implementeren en de bestandssysteem optimaal te benutten door de kernel van het besturingssysteem te delen tussen alle containers, werkend als afzonderlijke OS-processen.
Bron: habr.com
