VM of Docker?

Hoe begrijp je dat je Docker nodig hebt en geen VM? U moet bepalen wat u precies wilt isoleren. Als je een systeem wilt isoleren met gegarandeerde resources en virtuele hardware, dan moet de keuze op de VM vallen. Als u actieve applicaties wilt isoleren als afzonderlijke systeemprocessen, hebt u Docker nodig.

Dus wat is het verschil tussen Docker-containers en VM's?

Virtuele machine (VM) is een virtuele computer met alle virtuele apparaten en een virtuele harde schijf, waarop een nieuw onafhankelijk besturingssysteem is geïnstalleerd, samen met stuurprogramma's voor virtuele apparaten, geheugenbeheer en andere componenten. Dat wil zeggen, we krijgen een abstractie van fysieke hardware waarmee u veel virtuele computers op één computer kunt uitvoeren.
Een geïnstalleerde VM kan op verschillende manieren schijfruimte innemen:

  • vaste schijfruimte, waardoor snellere toegang tot de virtuele harde schijf mogelijk is en bestandsfragmentatie wordt voorkomen;
  • dynamische geheugentoewijzing. Wanneer extra applicaties worden geïnstalleerd, wordt er dynamisch geheugen voor toegewezen totdat het maximale toegewezen bedrag is bereikt.

Hoe meer virtuele machines op de server, hoe meer ruimte ze innemen, en vereisen ook de constante ondersteuning van de omgeving die nodig is om uw toepassing te laten werken.

havenarbeider is software voor het bouwen van applicaties op basis van containers. Containers en virtuele machines hebben vergelijkbare voordelen, maar werken anders. Containers nemen namelijk minder ruimte in beslag overmatig meer gedeelde bronnen van het hostsysteem gebruiken dan de VM, omdat in tegenstelling tot VM, biedt virtualisatie op OS-niveau, geen hardware. Deze aanpak zorgt voor minder geheugengebruik, snellere implementatie en gemakkelijker schalen.

De container biedt een efficiënter mechanisme voor het inkapselen van applicaties door de noodzakelijke interfaces met het hostsysteem te bieden. Met deze functie kunnen containers de kern van het systeem delen, waarbij elk van de containers wordt uitgevoerd als een afzonderlijk proces van het hoofdbesturingssysteem, dat zijn eigen set geheugengebieden heeft (zijn eigen virtuele adresruimte). Aangezien de virtuele adresruimte van elke container zijn eigen virtuele adresruimte is, kunnen gegevens die tot verschillende geheugengebieden behoren niet worden gewijzigd.
Het native besturingssysteem voor Docker is Linux (Docker kan ook worden gebruikt op Windows en MacOS), het gebruikt zijn belangrijkste voordelen, waardoor het een gesplitste kernel kan organiseren. De lancering van Docker-containers op Windows vindt plaats in een virtuele Linux-machine. containers delen het besturingssysteem van het hostsysteem en het belangrijkste besturingssysteem voor hen is Linux.

Containersysteem - hoe werkt het?

Bak is een abstractie op applicatieniveau die code en afhankelijkheden combineert. Containers worden altijd gemaakt op basis van afbeeldingen, waarbij een beschrijfbare toplaag wordt toegevoegd en verschillende parameters worden geïnitialiseerd. Omdat een container zijn eigen schrijflaag heeft en alle wijzigingen in die laag worden opgeslagen, kunnen meerdere containers toegang tot dezelfde hoofdafbeelding delen.

Elke container kan worden geconfigureerd via een bestand in het docker-compose-project dat is opgenomen in de hoofdoplossing, docker-compose.yml. Daar kunt u verschillende parameters instellen, zoals containernaam, poorten, identifiers, resourcelimieten, afhankelijkheden tussen andere containers. Als u geen containernaam opgeeft in de instellingen, maakt Docker elke keer een nieuwe container en wijst er willekeurig een naam aan toe.

Wanneer een container wordt gestart vanuit een afbeelding, koppelt Docker het lees-/schrijfbestandssysteem bovenop alle onderliggende lagen. Dit is waar alle processen die we willen dat onze Docker-container wordt uitgevoerd, worden uitgevoerd.

Wanneer Docker voor het eerst een container start, is de initiële lees-/schrijflaag leeg. Wanneer er wijzigingen optreden, worden ze toegepast op die laag; als u bijvoorbeeld een bestand wilt wijzigen, wordt dat bestand gekopieerd van de alleen-lezenlaag eronder naar de lezen-schrijvenlaag.
De alleen-lezen versie van het bestand blijft bestaan, maar is nu verborgen onder de kopie. Volumes worden gebruikt om gegevens op te slaan, ongeacht de levenscyclus van de container. Volumes worden geïnitialiseerd wanneer een container wordt gemaakt.

Hoe is de afbeelding gekoppeld aan de container?

image - het belangrijkste element voor elke container. De afbeelding is gemaakt op basis van een Dockerfile die aan het project is toegevoegd en is een set bestandssystemen (lagen) die op elkaar zijn gestapeld en gegroepeerd, alleen beschikbaar om te lezen; het maximale aantal lagen is 127.

De kern van elke afbeelding is een basisafbeelding, die wordt gespecificeerd door de opdracht VAN - het beginpunt bij het genereren van een Dockerfile-afbeelding. Elke laag is een alleen-lezen laag en wordt vertegenwoordigd door een enkele opdracht die het bestandssysteem wijzigt, geschreven in een Dockerfile.
Om deze lagen in één afbeelding te combineren, gebruikt Docker het geavanceerde meerlagige Union-bestandssysteem (AuFS is bovenop UnionFS gebouwd), waardoor verschillende bestanden en mappen van verschillende bestandslagen transparant kunnen overlappen, waardoor een bijbehorend bestandssysteem ontstaat.

Lagen bevatten metadata waarmee u gerelateerde informatie over elke laag kunt opslaan tijdens runtime en tijdens het bouwen. Elke laag bevat een link naar de volgende laag, als de laag geen link heeft, dan is dit de bovenste laag in de afbeelding.

Dockerfile kan opdrachten bevatten zoals:

  • VAN - startpunt in de vorming van het beeld;
  • ONDERHOUDER - de naam van de eigenaar van de afbeelding;
  • RUN - opdrachtuitvoering tijdens het samenstellen van afbeeldingen;
  • TOEVOEGEN - het hostbestand naar een nieuwe afbeelding kopiëren, als u een URL-bestand opgeeft, zal Docker het downloaden naar de opgegeven map;
  • ENV - omgevingsvariabelen;
  • CMD - start het maken van een nieuwe container op basis van de afbeelding;
  • ENTRYPOINT - De opdracht wordt uitgevoerd wanneer de container wordt gestart.
  • WORKDIR is de werkmap voor het uitvoeren van de CMD-opdracht.
  • GEBRUIKER - Stelt de UID in voor de container die op basis van de afbeelding is gemaakt.
  • VOLUME - Koppelt de hostdirectory aan de container.
  • EXPOSE is een set poorten waarnaar wordt geluisterd in de container.

Hoe werkt UnionFS?

VakbondFS — service stack file system (FS) voor Linux en FreeBSD. Deze FS implementeert het copy-on-write (Copy-On-Write, COW) mechanisme. De werkeenheid van UnionFS is een laag, elke laag moet worden beschouwd als een afzonderlijk volwaardig bestandssysteem met een directoryhiërarchie vanaf de root zelf. UnionFS maakt een unie-mount voor andere bestandssystemen en stelt u in staat om op transparante wijze bestanden en mappen van verschillende bestandssystemen (vertakkingen genoemd) samen te voegen tot een enkel gekoppeld bestandssysteem, transparant voor de gebruiker.

De inhoud van mappen met dezelfde paden wordt samen weergegeven in één gecombineerde map (in dezelfde naamruimte) van het resulterende bestandssysteem.

UnionFS combineert lagen op basis van de volgende principes:

  • een van de lagen wordt een laag van het hoogste niveau, de tweede en volgende lagen worden lagen van een lager niveau;
  • laagobjecten zijn toegankelijk voor de gebruiker "van boven naar beneden", d.w.z. als het gevraagde object zich in de "bovenste" laag bevindt, wordt het geretourneerd, ongeacht de aanwezigheid van een object met dezelfde naam in de "onderste" laag; anders wordt het "onderste" laagobject geretourneerd; als het gevraagde object noch daar, noch daar is, wordt de fout "No such file or directory" geretourneerd;
  • de werklaag is de "bovenste", dat wil zeggen dat alle acties van gebruikers om gegevens te wijzigen alleen worden weergegeven op de bovenste laag, zonder de inhoud van lagen op een lager niveau te beïnvloeden.

Docker is de meest gebruikte technologie voor het gebruik van containers bij applicatiewerk. Het is de standaard op dit gebied geworden, voortbouwend op de cgroups en namespaces van de Linux-kernel.

Docker stelt ons in staat om snel applicaties te implementeren en het bestandssysteem optimaal te benutten door de OS-kernel te delen tussen alle containers, die als afzonderlijke OS-processen worden uitgevoerd.

Bron: www.habr.com

Voeg een reactie