Hoe weet je of je Docker nodig hebt en geen VM? U moet bepalen wat u precies wilt isoleren. Wilt u een systeem isoleren met gegarandeerd toegewezen bronnen en virtuele hardware, dan is VM de beste keuze. Als u actieve applicaties wilt isoleren als afzonderlijke systeemprocessen, hebt u Docker nodig.
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 virtuele apparaatstuurprogramma's, geheugenbeheer en andere componenten. Dat wil zeggen dat we een abstractie van fysieke hardware krijgen waarmee we meerdere virtuele computers op één computer kunnen laten draaien.
De geïnstalleerde VM kan op verschillende manieren ruimte op de computerschijf innemen:
- vaste ruimte op de harde schijf, waardoor snellere toegang tot de virtuele harde schijf mogelijk is en fragmentatie van bestanden wordt voorkomen;
- dynamische geheugentoewijzing. Wanneer u extra toepassingen installeert, wordt er dynamisch geheugen aan de toepassingen toegewezen totdat het maximale geheugen is bereikt.
Чем больше virtuele machines Op de server geldt: hoe meer ruimte ze innemen, hoe meer constante ondersteuning ze nodig hebben voor de omgeving waarin uw applicatie moet draaien.
havenarbeider — is software voor het maken van containergebaseerde applicaties. Containers en Controleer de werking Ze hebben vergelijkbare voordelen, maar werken anders. Containers nemen minder ruimte in beslag omdat ze meer van de gedeelde resources van het hostsysteem hergebruiken dan virtuele machines. Anders dan virtuele machines bieden containers namelijk virtualisatie op besturingssysteemniveau in plaats van op hardwareniveau. Deze aanpak zorgt voor een kleinere geheugenvoetafdruk, snellere implementatie en eenvoudigere schaalbaarheid.
Een container biedt een efficiënter mechanisme voor het inkapselen van applicaties en biedt tegelijkertijd de benodigde interfaces naar het hostsysteem. Met deze functie kunnen containers de systeemkernel delen, waarbij elke container als een afzonderlijk proces van het hoofdbesturingssysteem draait, dat zijn eigen set geheugengebieden heeft (zijn eigen virtuele adresruimte). Omdat de virtuele adresruimte van elke container privé is, kunnen gegevens die tot verschillende geheugengebieden behoren, niet worden gewijzigd.
Het native besturingssysteem voor Docker is Linux (Docker kan ook gebruikt worden op Windows en MacOS). Het maakt gebruik van de belangrijkste voordelen ervan, waaronder het organiseren van de verdeling van de kernel. Het starten van Docker-containers op Windows vindt plaats in een virtuele machine met Linux OS, omdat containers het host-OS delen en het onderliggende OS Linux is.
Container - hoe werkt het?
Bak — is een abstractie op applicatieniveau die code en afhankelijkheden verenigt. Containers worden altijd gemaakt van afbeeldingen door een beschrijfbare bovenste laag toe te voegen en verschillende parameters te initialiseren. Omdat een container een eigen schrijflaag heeft en alle wijzigingen in deze laag worden opgeslagen, kunnen meerdere containers toegang tot dezelfde onderliggende image 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 de containernaam, poorten, id's, resourcelimieten en afhankelijkheden tussen andere containers. Als u geen containernaam opgeeft in de instellingen, maakt Docker elke keer een nieuwe container aan en krijgt deze een willekeurige naam.
Wanneer een container wordt gestart vanuit een image, koppelt Docker het bestandssysteem (lezen-schrijven) bovenop alle onderliggende lagen. Hier worden alle processen uitgevoerd die onze Docker-container moet uitvoeren.
Wanneer Docker voor het eerst een container start, is de initiële lees-/schrijflaag leeg. Wanneer er wijzigingen optreden, worden deze op deze laag toegepast; Als u bijvoorbeeld een bestand wilt wijzigen, wordt dat bestand gekopieerd van de alleen-lezenlaag eronder naar de lees-schrijflaag.
De alleen-lezenversie 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 de container wordt gemaakt.
Wat is de relatie tussen de afbeelding en de container?
image — het hoofdelement voor elke container. De afbeelding wordt gemaakt op basis van een Dockerfile die aan het project is toegevoegd en bestaat uit een set bestandssystemen (lagen) die op elkaar zijn gestapeld en gegroepeerd, en die alleen toegankelijk zijn om te lezen; Het maximale aantal lagen bedraagt 127.
De kern van elke image is een basisimage, die wordt gespecificeerd via de opdracht FROM. Dit is het startpunt bij het bouwen van de Dockerfile-image. Elke laag is alleen-lezen en wordt vertegenwoordigd door een enkele opdracht voor het wijzigen van het bestandssysteem, geschreven in het Dockerfile.
Om deze lagen in één afbeelding te combineren, gebruikt Docker het geavanceerde, meerlaagse Union-bestandssysteem (AuFS is gebaseerd op UnionFS). Hierdoor kunnen verschillende bestanden en mappen uit verschillende bestandslagen transparant over elkaar worden gelegd, zodat er een samenhangend bestandssysteem ontstaat.
Lagen bevatten metagegevens waarmee informatie over elke laag kan worden opgeslagen tijdens runtime en build. Elke laag bevat een koppeling naar de volgende laag. Als een laag geen koppeling heeft, dan is het de bovenste laag in de afbeelding.
Een Dockerfile kan opdrachten bevatten zoals:
- VAN — startpunt bij het vormen van een afbeelding;
- ONDERHOUDER — de naam van de eigenaar van de afbeelding;
- RUN — uitvoering van een opdracht tijdens het samenstellen van een beeld;
- TOEVOEGEN - kopieert het hostbestand naar een nieuwe afbeelding. Als u de URL van het bestand opgeeft, downloadt Docker het bestand naar de opgegeven directory.
- ENV — omgevingsvariabelen;
- CMD - start het maken van een nieuwe container op basis van de afbeelding;
- ENTRYPOINT - de opdracht wordt uitgevoerd wanneer de container start.
- WORKDIR - de werkdirectory voor het uitvoeren van de CMD-opdracht.
- GEBRUIKER - stelt de UID in voor de container die is gemaakt op basis van de image.
- VOLUME - koppelt een hostdirectory aan een container.
- EXPOSE is een set poorten waarnaar in de container wordt geluisterd.
Hoe werkt UnionFS?
UnionFS — een service stack-bestandssysteem (FS) voor Linux en FreeBSD. Dit bestandssysteem implementeert het Copy-On-Write (COW)-mechanisme. De werkeenheid van UnionFS is een laag. Elke laag moet worden beschouwd als een apart, volwaardig bestandssysteem met een directoryhiërarchie vanaf de root zelf. UnionFS creëert een union mount voor andere bestandssystemen en maakt het mogelijk om bestanden en directories van verschillende bestandssystemen (ook wel forks genoemd) te combineren in één samenhangend bestandssysteem dat transparant is voor de gebruiker.
De inhoud van mappen met dezelfde paden wordt samen weergegeven in één samengevoegde map (in één naamruimte) van het resulterende bestandssysteem.
UnionFS combineert lagen op basis van de volgende principes:
- een van de lagen wordt de bovenste laag, de tweede en volgende lagen worden de onderste lagen;
- de gebruiker heeft toegang tot objecten in de lagen van boven naar beneden, d.w.z. als het opgevraagde 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 object van de "onderste" laag geretourneerd; Als het gevraagde object in geen van beide wordt gevonden, wordt de fout 'Bestand of map bestaat niet' geretourneerd.
- de werkende laag is de “bovenste”, dat wil zeggen dat alle gebruikersacties om gegevens te wijzigen alleen op de bovenste laag worden weerspiegeld, zonder de inhoud van de lagen op een lager niveau te beïnvloeden.
Docker is de meestgebruikte technologie voor het gebruik van containers bij het gebruik van applicaties. Het is de standaard op dit gebied geworden en bouwt voort op de cgroups en namespaces die de Linux-kernel biedt.
Met Docker kunnen we snel applicaties implementeren en het bestandssysteem optimaal benutten door de OS-kernel te delen tussen alle containers, die als afzonderlijke OS-processen worden uitgevoerd.
Bron: www.habr.com
