Wie nutzt ihr Docker?

Dunuin

Distinguished Member
Jun 30, 2020
14,793
4,630
258
Germany
Moin,

Ich wollte mal fragen wie ihr Docker benutzt. Bisher habe ich alle Dienste in VMs laufen aber da der RAM langsam knapp wird und die Write Amplification recht hoch ist (ca 20x) würde ich gerne einige Dienste in Container auslagern.

Ich fände eine GUI eigentlich ganz nett um Docker-Container zu verwalten, aber beim Googlen bin ich da immer wieder nur auf Portainer und Rancher gestoßen und die nutzen dann wieder gleich Kubernetes und das ist ziemlich overkill, da ich ein SingleNode-Setup will und kein HA brauche. Ich habe mal testweise Rancher installiert aber das schreibt im Leerlauf schon alleine um die 200kb/s was dann mit Write Amplification schon 345 GB pro Tag wären.
Und ich habe meine Dienste in zwei Netzen (Intranet und DMZ) und manche Container müssen im einen und manche im anderen Netz sein. Bei anderen Leuten habe ich gesehen, dass die dazu zwei Rancher-Setups aufsetzen und denen dann jeweils eine IP aus der DMZ oder dem Intranet zuweisen. Dann wären das schon unnötige 690 GB die am Tag geschrieben werden und den SSDs nicht gut tun.
Weiß da jemand ob man irgendwie mit einem Docker-Setup auch Container in verschiedenen Netzen betreiben kann?

Und dann ist die Frage wie es da mit der Sicherheit ist.
Alle Dienste die ich auch im Internet bereitstelle würde ich gerne in VMs lassen, dass da im Falle eines Hacks das System wenigstens gut isoliert ist und sich nicht auf Proxmox auswirkt. LXC und Docker sollen ja schon relativ sicher sein, aber eine VM isoliert wohl doch noch einmal um einiges besser.

Was ich aber gut in Container auslagern könnte wären alle Dienste die ich nur im Heimnetz betreibe. Das wären Zabbix, Graylog, Pi-Hole, ComiXed, PS3NetServ, MySQL DB für digiKam, Guacamole und Heimdall. Da ist dann aber wieder die Frage ob ich nach Möglichkeit Docker-Container nutzen sollte (gibt es für alle) oder ob ein Turnkey-Core-LXC für jeden Service erstelle und die Sachen da dann einfach direkt installiere ohne Docker. Ich bin da immer noch etwas skeptisch was Docker angeht. Das klingt alles total kompliziert mit Docker, sobald man da irgendwie etwas individualisieren möchte. Graylog und Zabbix müsste ich z.B. mit Templates und Plugins erst anpassen, da ich mit denen in der Grundkonfiguration nichts anfangen kann. Und wenn ich da eh erst per apt etliches an Programmen nachinstallieren und etliche Dateien in allen möglichen Ordnern anlegen oder ändern muss, dann kann ich auch gleich einfach alles ohne Docker in einem LXC installieren. Oder übersehe ich da was?

Ein weiteres Problem was mich etwas abschreckt ist die Sicherheit, wenn man einen Docker-Container nutzt und dann einfach vertraut, dass da alles so läuft wie es soll.
Beim Googlen bin ich z.B. darauf gestoßen, dass da der PS3NetServ-Docker-Container Anfang des Jahres in für Synology (oder wars QNAP, kA) verboten wurde, da wohl der Account gehackt wurde und der Docker-Container dann Mining-Software hat mitinstallieren lassen.

Und wenn ich Docker im LXC laufen lasse, dann ist noch die Frage ob ich da lieber nur einen LXC-Container für alle Docker Container anlegen soll (weniger ungenutzer RAM der blockiert wird tippe ich mal) oder ob für jeden Docker-Container einen eigenen LXC-Container machen soll, dass die Dienste noch einmal extra gekapselt sind.

Wie macht ihr das bei euch?
 
Ich wollte mal fragen wie ihr Docker benutzt. Bisher habe ich alle Dienste in VMs laufen aber da der RAM langsam knapp wird und die Write Amplification recht hoch ist (ca 20x) würde ich gerne einige Dienste in Container auslagern.

Warum hast du eine so hohe Write Amplification?

Das klingt alles total kompliziert mit Docker, sobald man da irgendwie etwas individualisieren möchte.

Richtig, entweder passt es direkt (oder man macht das darauf aufbauende Projekt so, dass es mit dem Standard Container passt) oder man verwendet es selbst in einem LXC. Ich verwende hier oft direkt die Alpine-Version (im Docker als auch im LXC-Fall) und habe damit auch ähnlich kleine Footprints für die Dienste (auch wieder für LXC und Docker).

Wie macht ihr das bei euch?

Ich selbst hab alles am laufen: LXC für kleine Dinge, auch eigene LX(C) Container für Projekte, die direkten Ethernetzugriff wollen, KVM für Produktion und Test-Setups und Kubernetes für größere Dinge im Cluster mit HA. Alles hat seine Daseinsberechtigung, jedoch muss es zur gewünschten Sicherheit passen: Am sichersten ist es nur in der KVM, aber das weißt du ja bereits. Man sollte wohl auch noch die lokale Firewall entsprechend eng zuschnüren, dass man z.B. eine virtuelle DMZ hat für die meisten Dienste, d.h. nur DNS, die Container-Registry und Paketrepositories frei geben nach außen, eingehend entsprechend auch auf die Dienste einschnüren. Das funktioniert eigentlich auch immer.
 
  • Like
Reactions: Dunuin
Warum hast du eine so hohe Write Amplification?
Das weiß ich leider nicht. Hatte ich hier versucht dem auf dem Grund zu gehen, aber gab keinerlei Feedback was ich falschgemacht haben könnte.
Ohne deaktivierte Sync Writes erzeugen Schreibvergänge innerhalb der VM eine Write Amplification von 10x zum ZFS auf dem Host. Mit deaktivierten Sync Writes ist es nur noch eine Write Amplification von rund 5x. Und dann gibt es noch eine Write Amplification von rund 1,8x bis 2,2x auf der Enterprise SSD selbst, weshalb ich da mit Sync Writes insgesamt so auf eine Write Amplification von 20x komme.

Setup sieht grob so aus:
5x Intel S3710 SSDs als raidz1 pool (ashift=12, sync=standard, compression=lz4, kein dedup, kein SLOG)
-> verschlüsseltes dataset
-> zvols mit 32k volblocksize
-> KVM mit Virtio SCSI single, cache mode=none, discard an, iothread an, ssd emulation an
-> ext4 im GastOS mit noatime, nodiratime und tägliches fstrim per script.

Richtig, entweder passt es direkt (oder man macht das darauf aufbauende Projekt so, dass es mit dem Standard Container passt) oder man verwendet es selbst in einem LXC. Ich verwende hier oft direkt die Alpine-Version (im Docker als auch im LXC-Fall) und habe damit auch ähnlich kleine Footprints für die Dienste (auch wieder für LXC und Docker).
Gut, dann werde ich da wohl auch wirklich fast immer auf reine LXC ohne Docker setzen müssen. Außer ich muss da echt mal nichts ändern was nicht rein über Variablen geht. Und dann werde ich wohl auch einfach einen LXC pro Anwendung machen und da dann direkt Docker ohne Kubernetes und so nutzen, falls da etwas ausschließlich für Docker gemacht wurde.

Man sollte wohl auch noch die lokale Firewall entsprechend eng zuschnüren, dass man z.B. eine virtuelle DMZ hat für die meisten Dienste, d.h. nur DNS, die Container-Registry und Paketrepositories frei geben nach außen, eingehend entsprechend auch auf die Dienste einschnüren. Das funktioniert eigentlich auch immer.
Mit virtuelle DMZ meinst in Proxmox für den LXC die Policy für Ausgehende Verbindungen auf Drop setzen und dann nur halt die benötigten Ports einzeln freischalten oder eine extra Firewall im LXC selbst?
Das könnte ich jedenfalls auch noch machen. Bisher droppe ich per Proxmox-Firewall nur die eingehenden Verbindungen zu den VMs/Containern.
 
Mit virtuelle DMZ meinst in Proxmox für den LXC die Policy für Ausgehende Verbindungen auf Drop setzen und dann nur halt die benötigten Ports einzeln freischalten oder eine extra Firewall im LXC selbst?
Ich verwende immer Security-Gruppen, die alles benötigte Zulassen und als letzte Regel immer alles wegwerfen.
 

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!