Container nutzen ein paar Kernel-Features, um Prozesse voneinander zu isolieren. Jeder Container ist sein eigenes kleines Ökosystem, mit eigenen Libs, eigenen Usern, eigenen Netzwerkinterfaces (die über eine Bridge des Hosts nach draußen funken). Aus dem Container rausfunken (ins Netzwerk) darf alles. Will man allerdings rein, geht das nur über geforwardete Ports.
Die Container werden aus Images gebaut, die wiederum aus einer Art "Rezept", einer Beschreibung in Docker-Syntax erstellt werden. Da steht sowas wie:
- basiert auf Ubuntu
- apt-get install dies und das
- starte als Prozess mit ID 1 jenes
Das heißt du kannst zum Beispiel einen Debian-Container mit einem Apache machen, daneben stellst du einen CentOS-Container mit MySQL, daneben ein Ubuntu mit Postfix. Die Container kannst du auch miteinander verbinden (linken), um Interaktion zu erlauben. So hast du also deine kleine Systemlandschaft definiert und kannst sie mit verschiedenen Tools (wie compose oder swarm) bequem managen.
Alle diese Container laufen dann z.B. auf einem RHEL-Host. Die einzige Limitierung ist der Kernel des Hosts. Der muss frisch genug sein. Du kannst also nicht einen nagelneuen Ubuntu-Container auf einem uralten RHEL 5 nutzen, denn obwohl da scheinbar eigene OS in den Containern laufen, ist es doch nichts weiter als ein Durchreichen der Kernelbefehle an den Host. Es sind eben keine virtuellen Maschinen. Dadurch kannst du viele von ihnen nebeneinander betreiben, wobei dir bei echten VMs schnell der RAM ausgehen würde, weil soviel OS-Ballast mit hochfährt.
Das Filesystem von Containern sind zahlreiche übereinander liegende read-only Schichten. Das Filesystem eines Ubuntu-Baseimage ist quasi ein Snapshot eines Filesystems, nachdem eine minimale Installation durchgeführt wurde. Möchtest du daran etwas ändern, änderst du nicht diese Schicht, sondern es wird nach dem "copy on write"-Prinzip im Moment des Schreibens eine weitere Schicht draufgelegt, auf der du dich dann auslassen kannst.
Für GUI-Anwendungen ist es z.B. ziemlich ungeeignet. Man kann zwar mit VNC rumfummeln oder den X-Server-Socket mounten, allerdings finde ich das alles zu frickelig. Man merkt einfach, es ist dafür nicht gemacht. Vielleicht ändert sich das später mal, aber der hauptsächliche Anwendungsfall sind Konsolenanwendungen auf Servern.
Weiß nicht, ob das jetzt wirklich "DAU"-gerecht war, aber für den unbedarften Enduser ist der ganze Kram auch nicht so interessant, daher mach dir nichts daraus, wenn du es nicht komplett verstehst. Du verpasst da nichts.