Container oder VM? - Docker

Derreck

New Member
Jan 19, 2021
14
0
1
52
Die Frage, welche ich mir stelle, ist, ob ich besser eine VM verwenden soll in welcher ich Docker (rootless) laufen lasse oder doch lieber Container?
Wo sind die Vor- bzw. Nachteile von VM vs Container in Proxmox?
Mir ist bewusst, dass eine VM für sich Hardware-Ressourcen benötigt und darin ein OS läuft.

Was ich nicht ganz verstehe sind die Templates.
Diese beinhalten ja ein OS, sind diese dann mit ISO's gleichzusetzen?
Mit Docker Images sind sie wohl kaum gleichzusetzen oder etwa doch?

Jetzt habe ich gestern ein Video gesehen in dem erklärt wurde, dass man u.a. nested aktieren muss um Docker verwenden zu können.
Was nested ist, ist mir klar (von anderen VMs).

Was ich auf keinen Fall möchte ist Docker in Docker!
Deshalb auch die Frage Container od. VM und als was diese Templates genau zu sehen sind.

Laufen lassen würde ich gerne einen Webserver, eine DB und Anwendungungen welche (alle) die DB nutzen.
Bei einer VM könnte ich, falls man kompromittiert werden würde, diese herunterfahren.
Bei den Containern wird das nicht gehen?!
Ich spreche jetzt nicht von den Docker Containern!
Laufen die Container überhaupt direkt auf Proxmox oder doch auf dem OS (der Templates)?
Normal doch letzteres?!
 
Hi Derreck,
Ich habe meine Proxmox-Umgebung auf einem MinPC.
Als einzige VM verwende ich eine WIN10 Umgebung, da ich über FW leicht ran komme und auch Proxmox selbst administrieren kann (kann man eigentlich auch unter Linux, aber Windows ist mit geläufiger)

Für alles andere verwende ich Container, vor allem mit Docker in drin.
Der Vorteil ist für mich klar: Weniger Resourcen (weil sie die vorhandenen Resourcen von Proxmox mitverwenden), sauschneller Start, sauschnell erzeugt (um was zu testen und dann kann ich den Container wieder löschen)

Ich habe dafür einen Basis-Container erstellt, der Docker installiert hat und auch die Docker-Container Portainer und Portainer-Agent am laufen hat.
Sowie meine Standard-Ordnerstrucktur, die ich "liebe" => /docker/Application/... und /docker/Volumes/...

Von diesem klone ich die Container zum Erzeugen meiner Test- oder Produktiv-Container, mache am Anfang ein update/upgrade und bin sofort damit fertig.

Das ist aus der Sicht eines Users, die technischen Vor- oder Nachteile können Dir sicher Mitglieder mit profunderen Wissen erklären.

-- Wolfgang
 
  • Like
Reactions: Derreck
Hängt auch immer davon ab wie unkompliziert und sicher du es haben willst. Legst du wert auf Sicherheit und Migrierbarkeit nimm VMs. Willst du wenig Ressourcen verbrauchen nimm LXCs.

VMs sind voll virtualisiert und isoliert. Du hast also keine Abhängigkeiten zum Host-OS da jede VM ihren eigenen Kernel laufen lässt. Das macht dann das Verwalten und Migrieren einfacher, weil jede VM halt ihr eigener kleiner virtualisierter Rechner ist. Wegen Sicherheit sind VMs auch immer LXCs vorzuziehen, da wie du schon sagtest du einfach eine VM runterfahren kannst, wenn diese kompromitiert wurde und ein Angreifer vom Gast nicht ohne weiteres Zugriff auf den Host selbst oder andere Gäste erhält (wobei es da natürlich auch Angriffvektoren über Overflows im RAM gibt etc).

Bei LXCs teilt sich das Gast-OS den Kernel mit dem Host-OS. Du hast also keine keine Virtualiserung und keine echte Isolierung. Hier läuft dann quasi alles auf dem Host selbst, nur halt mehr oder weniger abgeschottet. Bei privilegierten LXCs ist es ganz übel, da es dort im Gegensatz zu unprivilegierten LXCs, kein User/Group-Remapping gibt. Dort ist dann der Root-User im LXC der gleiche wie der des Hostes. Da hast du also schnell echt ein Problem, wenn dir da mal ein Gast kompromitiert wird, weil du etwas falsch konfiguriert hast.
Außerdem bist du anfälliger für Probleme. Wenn du Proxmox aktualisierst, dann wird ja auch dein Kernel aktualsiert. Da aber der LXC den Kernel vom Proxmox-Host mitbenutzt, läuft da also auch plötzlich dein Gast mit einem neueren Kernel der vielleicht Features hizufügt oder wegnimmt. Vielleicht gibt es da aber für dein Gast-OS im LXC noch keine Updates für alle Programme und dann läuft dein Gast nicht mehr wie er sollte.
Und wenn du Nesting aktivierst, dann gibst du dem Gast-OS zugriff auf deine System-Ordner des Hosts wie /proc und /sys.
Vorteil beim LXC ist halt der fehlende Virtualisierungsoverhead und das du weniger Ressourcen verbrauchst. Willst du nur einen Webserver laufen lassen der 50MB RAM braucht, dann braucht dieser als LXC halt nur seine 50MB da der Kernel ja bereits läuft. Lässt du das gleiche in einer VM laufen sind das vielleicht 300MB RAM, da ja jede VM ihr eigenes Linux mit eigenem Kernel mit sagen wir mal 250MB laufenlassen muss, damit da oben drauf dann der Webserver mit 50MB laufen kann.

Ich persönlich lasse da alles in VMs laufen was irgendwie vom Internet aus erreichbar ist oder sonst wie angreifbar wäre. Und wenn mir ein Dienst besonders wichtig ist, weil der bzw bei mir zur kritischen Infrastruktur zählt, dass ich auf diesen nicht verzichten kann und der wirklich immer fehlerfrei laufen muss, dann nehme ich auch nur VMs. LXCs nehme ich dann für alles andere wie lokale Dienste die nur im LAN bereitgestellt werden sollen und wo es nicht wichtig ist, wenn ein Dienst mal ausfällt. Daher sind bei mir gut 90% aller Gäste VMs.

Für Docker würde ich eigentlich immer eine VM empfehlen. Zum einen willst du früher oder später bestimmt etwas in Docker laufen lassen was online verfügbar sein soll und wenn du da dann Wert auf Sicherheit legst, dann sollte das wegen der besseren Isolation schon eine VM sein. Ist dann doof wenn man sich später zu seinem Docker-LXC noch eine Docker-VM machen muss, was dann ja die Verwaltung erschwert, wenn man alles doppelt verwalten muss. Und dann ist Docker fehleranfälliger auf LXCs. Docker will halt oft Features vom Host die wegen der Sicherheit in einem LXC verboten sind. Dann kann man zwar über die Konfig-Datei des LXCs dem LXC diese Rechte einräumen, schwächt damit dann aber natürlich auch die Sicherheit. Ist übrigens noch garnicht so lange her, dass da Docker überhaupt nicht in einem LXC lief.
Und dann wollen die meisten Leute ja keine eigenen Docker-Container selbst programmieren, wo sie dann selbst Updates einspielen können und genau wissen würden was da im Detail im Docker-Container abgeht. Sondern sie wollen eine Plug-And-Play-Lösung die läuft ohne das sie sich in die Materie einarbeiten müssten oder selbst etwas administrieren müssten. Man lässt also Programme von fremden Leuten laufen denen man prinzipiell nicht vertrauen kann und guckt dann selbst nicht in den Code, ob da vielleicht Schadsoftware enthalten ist oder ob der Container-Ersteller vielleicht selbst keine Ahnung hat was er da tut sich etliche Sicherheitslücken nicht geschlossen hat. Und dann hat man noch das Problem, dass man bei Docker-Containern nichts selbst aktualisieren kann. Oft hat da ein Ersteller mal keine Zeit und dann gibt es halt über Monate keine Sicherheitsupdates oder er gibt den Container komplett auf und dann gibt es überhaupt keine Updates mehr. Manchmal hat man auch offizielle Docker-Container direkt von dem Entwickler einer Software, da ist es dann mit regelmäßigen Updates und dem Vertrauen nicht so das große Problem. Aber der Großteil der Docker-Container ist halt von einzelnen Leuten die sich irgendwie fremde Software zusammenbasteln und dies dann veröffentlichen. Ich würde denen jetzt nicht unterstellen etwas böswillig zu machen, aber oft kann ja mangelndes Fachwissen schon genug Schäden anrichten. Und kann auch mal vorkommen, dass da solcher Account gehackt und dann über diesem gezielt Schadsoftware verbreitet wird die man sich dann bedenkenlos runterläd.
Gerade wenn man fremde Sachen laufen lässt würde ich so etwas nur in einer VM wollen, wo dann ein böswilliger oder schlecht aktualisierter Docker-Container wegen der besseren Isolierung wenigstens keinen Schaden am Host, anderen VMs oder gar anderen Rechnern im Heimnetz anrichten könnte.
 
Last edited:
Hängt auch immer davon ab wie unkompliziert und sicher du es haben willst. Legst du wert auf Sicherheit und Migrierbarkeit nimm VMs. Willst du wenig Ressourcen verbrauchen nimm LXCs.
Ich dachte immer wenn es um Migrierbarkeit geht ist es besser Docker Container zu verwenden. Deshalb auch LXC anstatt VM.

VMs sind voll virtualisiert und isoliert.
Docker Container sind auch isoliert, wenn man Docker rootless betreibt.
Da man dann ja auch die Images ohne root nutzt.
Da schaut man also besser ins Dockerfile...

Du hast also keine Abhängigkeiten zum Host-OS da jede VM ihren eigenen Kernel laufen lässt. Das macht dann das Verwalten und Migrieren einfacher, weil jede VM halt ihr eigener kleiner virtualisierter Rechner ist. Wegen Sicherheit sind VMs auch immer LXCs vorzuziehen, da wie du schon sagtest du einfach eine VM runterfahren kannst, wenn diese kompromitiert wurde und ein Angreifer vom Gast nicht ohne weiteres Zugriff auf den Host selbst oder andere Gäste erhält (wobei es da natürlich auch Angriffvektoren über Overflows im RAM gibt etc).
Dafür benötigt die VM halt Ressourcen vom Host (z.B. RAM).

Bei LXCs teilt sich das Gast-OS den Kernel mit dem Host-OS. Du hast also keine keine Virtualiserung und keine echte Isolierung. Hier läuft dann quasi alles auf dem Host selbst, nur halt mehr oder weniger abgeschottet. Bei privilegierten LXCs ist es ganz übel, da es dort im Gegensatz zu unprivilegierten LXCs, kein User/Group-Remapping gibt. Dort ist dann der Root-User im LXC der gleiche wie der des Hostes. Da hast du also schnell echt ein Problem, wenn dir da mal ein Gast kompromitiert wird, weil du etwas falsch konfiguriert hast.
Also kann man kein LXC als User nutzen, nur als root?

Außerdem bist du anfälliger für Probleme. Wenn du Proxmox aktualisierst, dann wird ja auch dein Kernel aktualsiert. Da aber der LXC den Kernel vom Proxmox-Host mitbenutzt, läuft da also auch plötzlich dein Gast mit einem neueren Kernel der vielleicht Features hizufügt oder wegnimmt. Vielleicht gibt es da aber für dein Gast-OS im LXC noch keine Updates für alle Programme und dann läuft dein Gast nicht mehr wie er sollte.
Das ist natürlich ein Argument.

Und wenn du Nesting aktivierst, dann gibst du dem Gast-OS zugriff auf deine System-Ordner des Hosts wie /proc und /sys.
Vorteil beim LXC ist halt der fehlende Virtualisierungsoverhead und das du weniger Ressourcen verbrauchst.
Auch hier die Frage: Also kann man kein LXC als User nutzen, nur als root?

Willst du nur einen Webserver laufen lassen der 50MB RAM braucht, dann braucht dieser als LXC halt nur seine 50MB da der Kernel ja bereits läuft. Lässt du das gleiche in einer VM laufen sind das vielleicht 300MB RAM, da ja jede VM ihr eigenes Linux mit eigenem Kernel mit sagen wir mal 250MB laufenlassen muss, damit da oben drauf dann der Webserver mit 50MB laufen kann.
Klar, alles was in einer VM läuft bräucht mehr Ressourcen vom Host.

Ich persönlich lasse da alles in VMs laufen was irgendwie vom Internet aus erreichbar ist oder sonst wie angreifbar wäre. Und wenn mir ein Dienst besonders wichtig ist, weil der bzw bei mir zur kritischen Infrastruktur zählt, dass ich auf diesen nicht verzichten kann und der wirklich immer fehlerfrei laufen muss, dann nehme ich auch nur VMs. LXCs nehme ich dann für alles andere wie lokale Dienste die nur im LAN bereitgestellt werden sollen und wo es nicht wichtig ist, wenn ein Dienst mal ausfällt. Daher sind bei mir gut 90% aller Gäste VMs.
Ich komme unten noch drauf zu sprechen, da es mir um Root Server geht.
Da werden Dienste wie Webserver normal fest installiert, wenn man kein Docker nutzt.
Somit auch keine VMs benutzt. Kann man, muss aber nicht.

Für Docker würde ich eigentlich immer eine VM empfehlen. Zum einen willst du früher oder später bestimmt etwas in Docker laufen lassen was online verfügbar sein soll und wenn du da dann Wert auf Sicherheit legst, dann sollte das wegen der besseren Isolation schon eine VM sein. Ist dann doof wenn man sich später zu seinem Docker-LXC noch eine Docker-VM machen muss, was dann ja die Verwaltung erschwert, wenn man alles doppelt verwalten muss. Und dann ist Docker fehleranfälliger auf LXCs. Docker will halt oft Features vom Host die wegen der Sicherheit in einem LXC verboten sind. Dann kann man zwar über die Konfig-Datei des LXCs dem LXC diese Rechte einräumen, schwächt damit dann aber natürlich auch die Sicherheit. Ist übrigens noch garnicht so lange her, dass da Docker überhaupt nicht in einem LXC lief.
Docker ist ja dafür gedacht eine Anwendung laufen zu lassen die nicht direkt installiert werden muss.
Ist - für mich - jetzt kein wirkliches Argument mit der Sicherheit selbst, da Docker rootless mit entsprechenden Docker Images schon sicher und isoliert ist.
Das Argument, dass Docker auf LXC fehleranfälliger ist, ok, das zählt (wenn dem "noch" so ist).

Und dann wollen die meisten Leute ja keine eigenen Docker-Container selbst programmieren, wo sie dann selbst Updates einspielen können und genau wissen würden was da im Detail im Docker-Container abgeht. Sondern sie wollen eine Plug-And-Play-Lösung die läuft ohne das sie sich in die Materie einarbeiten müssten oder selbst etwas administrieren müssten. Man lässt also Programme von fremden Leuten laufen denen man prinzipiell nicht vertrauen kann und guckt dann selbst nicht in den Code, ob da vielleicht Schadsoftware enthalten ist oder ob der Container-Ersteller vielleicht selbst keine Ahnung hat was er da tut sich etliche Sicherheitslücken nicht geschlossen hat. Und dann hat man noch das Problem, dass man bei Docker-Containern nichts selbst aktualisieren kann. Oft hat da ein Ersteller mal keine Zeit und dann gibt es halt über Monate keine Sicherheitsupdates oder er gibt den Container komplett auf und dann gibt es überhaupt keine Updates mehr. Manchmal hat man auch offizielle Docker-Container direkt von dem Entwickler einer Software, da ist es dann mit regelmäßigen Updates und dem Vertrauen nicht so das große Problem. Aber der Großteil der Docker-Container ist halt von einzelnen Leuten die sich irgendwie fremde Software zusammenbasteln und dies dann veröffentlichen. Ich würde denen jetzt nicht unterstellen etwas böswillig zu machen, aber oft kann ja mangelndes Fachwissen schon genug Schäden anrichten. Und kann auch mal vorkommen, dass da solcher Account gehackt und dann über diesem gezielt Schadsoftware verbreitet wird die man sich dann bedenkenlos runterläd.
Da ich mich auch damit beschäftige... ich würde meine Images schon selbst bauen, bzw. nur offizielle Dockerfiles und Images nutzen und (per multi-stage build) erweitern wo es für mich sinnvoll erscheint.

So ist für mich vieles unbrauchbar wo alles zusammen in nur einem Iages läuft (z.B. Webserver, DB, Anwendung etc.).
Ebenso unbrauchbar - für meine Zwecke - Compose Dateien, da ich kein Docker Compose benötige.

Gerade wenn man fremde Sachen laufen lässt würde ich so etwas nur in einer VM wollen, wo dann ein böswilliger oder schlecht aktualisierter Docker-Container wegen der besseren Isolierung wenigstens keinen Schaden am Host, anderen VMs oder gar anderen Rechnern im Heimnetz anrichten könnte.
Das ganze soll eben nicht im Heimnetz sonder produktiv auf einem Root Server genutzt werden!

Somit muss diese Maschine mit passender hardware ausgestattet sein, wenn man doch VMs nutzen soll.
Entsprechend sind dann wiederum die Preise.
Das ist aber ein anderes Thema.
 
Last edited:
Ich dachte immer wenn es um Migrierbarkeit geht ist es besser Docker Container zu verwenden. Deshalb auch LXC anstatt VM.
Wenn du aber einen PVE Cluster betreibst, dann möchtest du vielleicht auch deinen ganzen LXC/VM von Server zu Server migrieren. Und dann haben deine Server vielleicht unterschiedliche Hardware und nicht jeder Server mag mit allen Kerneln arbeiten. Oder du betreibst keinen Cluster aber ziehst es vielleicht in Erwägung öfter mal den Server-Hoster zu wechseln, wenn du ein besseres Angebot findest. Dann müssen auch alle deine LXCs/VMs umziehen und die Hardware vom neuen Server mag dann vielleicht nicht mit dem Kernel laufen den du auf dem alten Server benutzt hattest.
Hast du VMs bist du da deutlich variabler. Dann hast du im Gast einen Kernel deiner Wahl, oder verschiedenste Kernel für verschiedenste VMs und das läuft nach der Migrierung auf jeder Hardware problemlos. Und jeder Host kann dann halt seinen eigenen Kernel benutzen der gut zur Hardware passt, ohne dass das für den Gast einen Unterschied machen würde.
Docker Container sind auch isoliert, wenn man Docker rootless betreibt.
Da man dann ja auch die Images ohne root nutzt.
Da schaut man also besser ins Dockerfile...
Ein Container ist aber technisch bedingt immer schlechter isoliert und daher leichter angreifbar als eine VM. Genau so wie eine VM immer schlechter isoliert ist als mehrere physische Server die Bare Metal laufen. Je mehr Hardware und Software man sich teilt, desto schlechter isoliert ist man. Ist wie ich als erstes schon sagte halt eine Frage wie sicher du es haben willst. Auch von einem rootless Docker-Container kann ein Angreifer ausbrechen und so auf den LXC/VM kommen. Ist er dann auf dem LXC/VM kann er auch irgendwie an root-Rechte kommen. Bis hierhin ist alles gleich. Nun kannst du es dem Angreifer aber leichter machen und einen schlechter isolierten LXC nutzen oder eine besser isolierte VM, damit er schwerer vom Gast auf den Host kommt.
Also kann man kein LXC als User nutzen, nur als root?
Docker sollte in LXCs auch rootless gehen.
Docker ist ja dafür gedacht eine Anwendung laufen zu lassen die nicht direkt installiert werden muss.
Ist - für mich - jetzt kein wirkliches Argument mit der Sicherheit selbst, da Docker rootless mit entsprechenden Docker Images schon sicher und isoliert ist.
Das ist halt Ansichtssache. Ich würde da persönlich einen rootless Docker jetzt nicht als isoliert oder sicher betrachten. Ist halt die Frage mit welchen Ansprüchen an Sicherheit man da rangeht.
 
Last edited:

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!