Vraag Waarom gebruiken we een OS Base Image met Docker als containers geen gast-OS hebben?


Ik ben net begonnen met het bestuderen van Docker en er is iets dat nogal verwarrend voor me is. Zoals ik op de website van Docker heb gelezen, verschilt een container van een virtuele machine. Zoals ik begreep, is een container slechts een sandbox waarin een volledig geïsoleerd bestandssysteem wordt uitgevoerd.

Ik heb ook gelezen dat in een container geen gast-besturingssysteem is geïnstalleerd. In plaats daarvan vertrouwt het op de onderliggende OS-kernel.

Dat is allemaal goed. Wat ik in de war ben, is dat er Docker-afbeeldingen zijn met namen die vernoemd zijn naar besturingssystemen. We zien afbeeldingen zoals Ubuntu, Debian, Fedora, CentOS enzovoort.

Mijn punt is: wat zijn die beelden eigenlijk? Hoe is het anders om een ​​container te maken op basis van de Debian-image dan om een ​​virtuele machine te maken en Debian te installeren?

Ik dacht dat containers geen gast-OS hadden geïnstalleerd, maar als we afbeeldingen maken baseren we ze op een afbeelding die genoemd is naar een besturingssysteem.

Ook in voorbeelden zag ik wanneer we dat deden docker run ubuntu echo "hello world", het lijkt erop dat we een VM draaien met Ubuntu en het de opdracht laten uitvoeren echo "hello world".

Op dezelfde manier als we doen docker run -it ubuntu /bin/bash, het lijkt erop dat we een VM draaien met Ubuntu en deze openen via de opdrachtregel.

Hoe dan ook, wat zijn de afbeeldingen genoemd naar besturingssystemen? Hoe verschillend is het om een ​​container met een van die afbeeldingen uit te voeren en een VM op te draaien met het bijbehorende gast-OS?

Is het idee dat wij net deel de kernel met het host-besturingssysteem (en dus hebben we toegang tot de onderliggende hardwarebronnen van de machine, zonder de noodzaak om hardware te virtualiseren), maar gebruiken we nog steeds de bestanden en binaire bestanden van elk ander systeem op de containers om welke toepassing we dan ook te ondersteunen rennen?


60
2018-02-11 16:39


oorsprong


Naar mijn mening zijn je doelstellingen in virtualisatie de sleutels. Als u bibliotheken, talen, enz. Op het besturingssysteem nodig hebt, zijn OS-containers geschikt voor uw behoefte. Maar als uw behoefte alleen toepassing als componenten is, hoeft u OS niet als uw basisbeeld te gebruiken. Ik denk dat dit artikel het duidelijk kan uitleggen blog.risingstack.com/... - metamorph


antwoorden:


Omdat alle Linux-distributies hetzelfde draaien (yup, het is een beetje vereenvoudigd) Linux-kernel en alleen in userland-software verschillen, is het vrij eenvoudig om een ​​andere distributieomgeving te simuleren - door alleen die userland-software te installeren en te doen alsof het een andere distributie is. Specifiek, het installeren van CentOS-containers in Ubuntu OS betekent dat je het gebruikersland van CentOS krijgt, terwijl je nog steeds dezelfde kernel draait, zelfs geen andere kernelinstantie.

Zo lichtgewicht virtualisatie lijkt op geïsoleerde compartimenten binnen hetzelfde besturingssysteem. Au contraire echte virtualisatie is het hebben van een ander volwaardig OS in host OS. Dat is de reden waarom docker FreeBSD of Windows in Linux niet kan uitvoeren.

Als dat gemakkelijker zou zijn, kun je denken dat docker een soort van zeer geavanceerde en geavanceerde chroot-omgeving is.


53
2018-02-11 17:15



Dus daarom kan ik mijn gecompileerde golang-code hosten in de lege Scratch-container - omdat de gecompileerde code alleen de kernel nodig heeft? - Francis Norton
Dus hoe weet het gast-OS de host-OS-kernel te gebruiken (en hoe dit te doen)? AFAIK, de docker-beeldbasissen gebruiken standaard OS-afbeeldingen. In uw voorbeeld is het niet dat er een aangepaste CentOS-build bestaat die de kernel van de ouder weet te gebruiken? Of is het zo simpel als een truc met bestandssysteem (aufs) waar Docker omleidt waar gasten (CentOS ') lezen van / boot naar de host (Ubuntu)? In dat geval zou de gast (CentOS) zijn eigen exemplaar van / boot installeren, maar zou het nooit worden gelezen? - James S


Containers worden op één kernel uitgevoerd. Met andere woorden alle containers hebben een enkele kernel (host OS). Terwijl aan de andere kant hypervisors meerdere kernalen hebben. Elke virtuele machine draait op een andere kernel.

En "docker run ubuntu" is net als het creëren van een chroot-omgeving.


1
2018-06-16 01:33