{"id":2174,"date":"2023-09-10T07:50:31","date_gmt":"2023-09-10T05:50:31","guid":{"rendered":"https:\/\/linux-bibel.at\/?p=2174"},"modified":"2023-09-10T07:50:34","modified_gmt":"2023-09-10T05:50:34","slug":"docker-anwendungen-und-systeme-unter-linux-virtualisieren-isolieren","status":"publish","type":"post","link":"https:\/\/linux-bibel.at\/index.php\/2023\/09\/10\/docker-anwendungen-und-systeme-unter-linux-virtualisieren-isolieren\/","title":{"rendered":"Docker &#8211; Anwendungen und Systeme unter Linux virtualisieren \/ isolieren"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">VMWare, VirtualBox und Qemu haben dieselbe Eigenschaft: Sie ben\u00f6tigen Leistung von den Prozessoren. Einerseits ben\u00f6tigt schon die Software, die Hardware virtualisiert, Kraft, andererseits das darauf laufende Betriebssystem &#8211; im Grunde laufen hier dann zwei Betriebssysteme und die Software zur Virtualisierung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In gewissen F\u00e4llen kann hier die Software Docker helfen &#8211; hier l\u00e4uft im Grunde genommen kein zweites Betriebssystem. Der Gast, also das virtualisierte System, nutzt n\u00e4mlich den Kernel des real installierten Systems. Das hat nat\u00fcrlich auch Nachteile: Da der Kernel des real installierten Systems genutzt wird, l\u00e4sst sich nur ein verwandtes System virtualisieren. Unter Linux kann man nur Linux-Systeme in Docker laufen lassen, unter Windows nur Windows.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Was kann man mit Docker anstellen?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Man kann Anwendungen vom restlichen System isolieren, so etwa einen Webserver mit Docker betreiben, der vom restlichen System abgeschottet ist. Man kann andere Linux-Distributionen versuchen &#8211; so ist es beispielsweise m\u00f6glich, unter Debian openSUSE laufen zu lassen &#8230;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Docker installieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Unter den meisten Linux-Distributionen nennt sich das Paket ganz einfach &#8222;<strong>docker<\/strong>&#8222;, unter auf Debian basierenden Linux-Distributionen existiert schon ein gleichnamiges Paket &#8211; hier installieren Sie \u00fcber die Paket-Verwaltung das Paket &#8222;<strong>docker.io<\/strong>&#8222;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Damit Docker dauerhaft l\u00e4uft, m\u00fcssen Sie den automatischen Start aktivieren. Dies gelingt am Terminal als Administrator mit dem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl enable docker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nach einem Neustart startet Docker automatisch mit dem System. M\u00f6chten Sie Docker nur hin und wieder nutzen, starten Sie den Dienst manuell auf dem Terminal mit dem administrativen Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl start docker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl stop docker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">l\u00e4sst er sich anschlie\u00dfend wieder beenden. Mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl status docker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">l\u00e4sst sich der aktuelle Status anzeigen &#8211; hier l\u00e4uft Docker &#8211; &#8222;Active: active (running)&#8220;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker-1024x576.jpg\" alt=\"\" class=\"wp-image-2175\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Nach Images suchen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Man muss nicht lange selbst an Images basteln, es finden sich bereits f\u00fcr viele Aufgaben vorgefertigte Images auf dem Docker-Server im Internet. Gleich einmal zu Beginn &#8211; Docker wird vom Administrator genutzt. Nun wollen wir zu Beginn auf dem Terminal suchen &#8211; hier etwa nach einer bestimmten Distribution:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker search debian<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker1-1024x576.jpg\" alt=\"\" class=\"wp-image-2176\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker1-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker1-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker1-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker1-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker1.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Als Ausgabe sehen Sie zu Beginn den Namen des Images, anschlie\u00dfend eine kurze Beschreibung und zuletzt eine Statusmeldung. Sie m\u00fcssen jedoch nicht unbedingt eine Distribution w\u00e4hlen, es kann sich auch um eine Anwendung handeln, etwa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker search apache2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">M\u00f6chten Sie mehrere Begriffe der Suche \u00fcbergeben, setzen Sie alle Begriffe in Anf\u00fchrungszeichen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker2-1024x576.jpg\" alt=\"\" class=\"wp-image-2177\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker2-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker2-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker2-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker2-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker2.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sie m\u00fcssen passende Images jedoch nicht unbedingt am Terminal suchen, Sie k\u00f6nnen es auch auf der Webseite von Docker grafisch im Webbrowser tun:\u00a0<a rel=\"noreferrer noopener\" href=\"https:\/\/hub.docker.com\/search?q=&amp;type=image\" target=\"_blank\">https:\/\/hub.docker.com\/search?q=&amp;type=image<\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker3-1024x576.jpg\" alt=\"\" class=\"wp-image-2178\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker3-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker3-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker3-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker3-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker3.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Docker-Images herunterladen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Haben Sie ein passendes Image gefunden, brauchen Sie f\u00fcr den Download nur dessen Namen. Im Beispiel einfach &#8222;<strong>debian<\/strong>&#8220; &#8211; der Download gelingt am Terminal mit dem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker pull debian<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Fall wird nur das Standard-System heruntergeladen, ohne jegliche Anwendungen (<em>rund 60 MB<\/em>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Alle installierten Images anzeigen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker images<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">lassen sich anschlie\u00dfend alle installierten Images anzeigen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker4-1024x576.jpg\" alt=\"\" class=\"wp-image-2179\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker4-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker4-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker4-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker4-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker4.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Docker-Images starten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein installiertes Image starten Sie anschlie\u00dfend, indem Sie dessen Namen angeben, am besten steigen Sie gleich darin ein. Hierzu nutzen Sie die Optionen &#8222;<strong><code>-t -i<\/code><\/strong>&#8220; und geben an, dass Sie das Terminal starten wollen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -t -i  debian \/bin\/bash<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker5-1024x576.jpg\" alt=\"\" class=\"wp-image-2180\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker5-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker5-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker5-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker5-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker5.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sie landen also direkt im laufenden System auf dem Terminal. Alternativ starten Sie den Container mit der Option &#8222;<strong><code>-d<\/code><\/strong>&#8220; &#8211; in diesem Fall wartet das System im Hintergrund auf Eingaben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -t -i -d debian<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun k\u00f6nnen Sie sich auf einem anderen Terminal alle laufenden Container anzeigen lassen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker6-1024x576.jpg\" alt=\"\" class=\"wp-image-2181\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker6-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker6-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker6-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker6-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker6.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>exit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">innerhalb des laufenden Containers steigen Sie aus diesem aus und beenden ihn. Wie oben schon beschrieben, starten Sie ein Docker-Image im Hintergrund mit dem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -i -t -d debian<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dies bedeutet: Sie m\u00fcssen keine Eingaben machen &#8211; das System l\u00e4uft, und Sie k\u00f6nnen auf dem Terminal andere Aufgaben erledigen oder nat\u00fcrlich auch weitere Docker-Images starten. Nun k\u00f6nnen Sie sich mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">die laufenden Docker-Images anzeigen lassen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker7-1024x576.jpg\" alt=\"\" class=\"wp-image-2182\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker7-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker7-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker7-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker7-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker7.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wichtig ist hier nun die &#8222;<strong>CONTAINER ID<\/strong>&#8222;, mit dieser ID k\u00f6nnen Sie das Image steuern und Befehle in das im Hintergrund laufende System abgeben, hierzu dient der Befehl &#8222;<strong><code>exec<\/code><\/strong>&#8222;. Um etwa den Befehl &#8222;<strong><code>ls<\/code><\/strong>&#8220; in das Image mit der ID &#8222;<strong>40ae1d009763<\/strong>&#8220; abzugeben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker exec 40ae1d009763 ls<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Ausgabe des Befehls wird in diesem Fall am Terminal ausgegeben, ohne direkt in den laufenden Container zu wechseln. M\u00f6chten Sie den im Hintergrund laufenden Container stoppen, gen\u00fcgt ein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker stop 40ae1d009763<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Arbeiten mit Docker-Images<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nun wissen wir, wie wir Docker-Images installieren, starten und stoppen. Wir m\u00f6chten darin nat\u00fcrlich auch arbeiten, in meinem Fall starte ich wieder mein Debian mit dem Terminal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -i -t debian \/bin\/bash<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ich befinde mich nun auf dem Terminal im laufenden Docker-Container und kann darauf arbeiten &#8211; etwa das System aktualisieren, Software installieren, Dateien anlegen und solche bearbeiten &#8211; was auch immer. Wird der laufende Container beendet, sind jedoch alle \u00c4nderungen verloren. Bei den heruntergeladenen Images handelt es sich um schreibgesch\u00fctzte Images. Also muss man etwas anders arbeiten: Wir beginnen von vorne. Wir starten einen Container wie oben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -i -t debian \/bin\/bash<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wir beenden den Container einfach mittels:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>exit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun starten wir den Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps --all<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker8-1024x576.jpg\" alt=\"\" class=\"wp-image-2183\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker8-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker8-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker8-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker8-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker8.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Befehl zeigt uns nun nicht nur laufende Docker-Container, sondern auch solche, die wir bereits wieder beendet haben &#8211; ganz hinten finden Sie in der Tabelle auch die Spalte &#8222;<strong>NAME<\/strong>&#8220; &#8211; dies ist eine freundliche Bezeichnung, mit der wir genau diesen Container wieder starten k\u00f6nnen &#8211; und in diesem Container k\u00f6nnen wir auch \u00c4nderungen vornehmen, die erhalten bleiben. Im Bild oben sehen wir die Bezeichnung &#8222;<strong><code>friendly_mclaren<\/code><\/strong>&#8220; &#8211; wir k\u00f6nnen diesen Container also mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker start friendly_mclaren<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">starten:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nun k\u00f6nnen wir mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker attach friendly_mclaren<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">in den laufenden Container wechseln. Nun k\u00f6nnte man etwa das System aktualisieren, weitere Software installieren und sonstige \u00c4nderungen im System vornehmen &#8211; diese bleiben erhalten. Mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>exit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">kann man aus dem System aussteigen (<em>dadurch wird dieser Container nat\u00fcrlich beendet)<\/em>, den Container wieder starten, und die \u00c4nderungen bleiben erhalten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Laufende Container lassen sich nun mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">anzeigen, alle gestarteten Container (<em>auch wenn diese nicht laufen<\/em>) mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps --all<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Container die nicht laufen, lassen sich mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker rm CONTAINER-ID<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">l\u00f6schen, ganze Images, die Sie sich mit<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker images<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">anzeigen lassen, lassen sich mit<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker rmi Image-Name<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">l\u00f6schen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Man sieht also schon: Um mit Docker zu arbeiten, sollte man zu Beginn ein wenig planen. Nehmen wir einmal an, Sie m\u00f6chten mit dem vorgefertigten Docker-Image &#8222;<strong>nginx<\/strong>&#8220; (<em>der Webserver nginx<\/em>) einen Webserver betreiben &#8211; hier ist das System bereit, der Webserver ist installiert. Das System muss jedoch freie Ports haben &#8211; der Webserver ben\u00f6tigt ohne HTTPS den Port &#8222;<strong>80<\/strong>&#8220; &#8211; ganz klar: Wir m\u00fcssen den Port aus dem Container auf das real installierte System aufschalten. Gelingt ganz einfach:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-p Container-Port:Host-Port<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beispiel ganz einfach:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -p 80:80 nginx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Schon l\u00e4uft der Container, und Sie k\u00f6nnen mit &#8222;<strong>localhost<\/strong>&#8220; \u00fcber einen Webserver auf die Seite zugreifen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker10-1024x576.jpg\" alt=\"\" class=\"wp-image-2184\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker10-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker10-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker10-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker10-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/docker10.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mittels:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps --all<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">sehen wir anschlie\u00dfend den Namen des Containers, mit dem wir den Container mit<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker start NAME<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">wieder starten k\u00f6nnen. M\u00f6chte man sich den Server komplett selbst zusammenstellen, in diesem Fall einfach einen Webserver &#8211; etwa wieder mit dem Image &#8222;<strong>debian<\/strong>&#8220; -, startet man das Image wieder mit den sp\u00e4ter zu nutzenden Ports &#8211; also<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -p 80:80 debian<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">sucht sich nun die ID oder den Namen und stoppt diesen mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps --all\ndocker stop NAME<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun kann man den Container starten, in dem man best\u00e4ndige \u00c4nderungen vornehmen kann, und darin arbeiten:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker start NAME\ndocker attach NAME<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sie k\u00f6nnen einem Container nat\u00fcrlich auch selbst einen Namen geben &#8211; ist einfacher zu merken:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run --name= NAME -p 80:80 debian<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Docker-Volumes &#8211; Auf den Speicher eines Docker-Systems zugreifen und Docker Compose<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hat man eine Software unter Docker installiert und m\u00f6chte auf die Daten dieser zugreifen, kann es schon einmal umst\u00e4ndlich werden. In den Container wechseln, mit Befehlen am Terminal hantieren &#8211; mit sogenannten Volumes f\u00e4llt dies viel einfacher.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Volume ist nichts anderes, als ein Verzeichnis auf dem Docker-System &#8211; dieses wird direkt mit dem Wirtssystem geteilt. Zus\u00e4tzlichen Platz ben\u00f6tigt dies nicht. Man nennt die Geschichte auch gerne Persistenz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sehen wir uns diese Geschichte mit einem Beispiel an &#8211; ich werde dazu ganz einfach MediaWiki &#8211; die Software wird unter anderem bei Wikipedia genutzt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mediawiki unter Docker installieren<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr MediaWiki gibt es auf\u00a0<a rel=\"noreferrer noopener\" href=\"https:\/\/hub.docker.com\/_\/mediawiki\" target=\"_blank\">DockerHub<\/a>\u00a0bereits ein vorgefertigtes Image, dieses k\u00f6nnen wir ganz einfach mittels Docker aufsetzen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run --name mediawiki -p 8080:80 -d mediawiki<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt k\u00f6nnen wir via Webbrowser und der Adresse&nbsp;<em>127.0.0.1:8080<\/em>&nbsp;oder&nbsp;<em>localhost:8080<\/em>&nbsp;auf das Wiki zugreifen. Jetzt wird es jedoch problematisch &#8211; man richtet das Wiki ein und bekommt die Datei &#8222;<strong>LocalSettings.php<\/strong>&#8220; zum Download, diese gilt es anschlie\u00dfend im Verzeichnis der MediaWiki-Installation abzulegen, ansonsten l\u00e4uft das Wiki nicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Daf\u00fcr gibt es nun Volumes &#8211; eben Verzeichnisse, die zwischen Host und Gast geteilt werden. Um Docker-Images anzupassen, erstellen wir uns eine Konfigurationsdatei in einem leeren Verzeichnis &#8211; die Konfigurationsdatei nennt sich &#8222;<strong>docker-compose.yml<\/strong>&#8222;. Mit dieser Konfigurationsdatei und der Software Docker-Compose passen wir das Image an. Docker-Compose wird unter auf Debian basierenden Linux-Distributionen wie \u00fcblich ganz einfach \u00fcber die Paket-Verwaltung durch das Paket &#8222;<strong>docker-compose<\/strong>&#8220; installiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wie schon beschrieben &#8211; f\u00fcr unser Beispiel dient MediaWiki &#8211; am oben gezeigten Link findet sich bereits eine passende Vorlage f\u00fcr die Konfigurationsdatei:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># MediaWiki with MariaDB\n#\n# Access via \"http:\/\/localhost:8080\"\n#   (or \"http:\/\/$(docker-machine ip):8080\" if using docker-machine)\nversion: '3'\nservices:\n  mediawiki:\n    image: mediawiki\n    restart: always\n    ports:\n      - 8080:80\n    links:\n      - database\n    volumes:\n      - images:\/var\/www\/html\/images\n      # After initial setup, download LocalSettings.php to the same directory as\n      # this yaml and uncomment the following line and use compose to restart\n      # the mediawiki service\n      # - .\/LocalSettings.php:\/var\/www\/html\/LocalSettings.php\n  # This key also defines the name of the database host used during setup instead of the default \"localhost\"\n  database:\n    image: mariadb\n    restart: always\n    environment:\n      # @see https:\/\/phabricator.wikimedia.org\/source\/mediawiki\/browse\/master\/includes\/DefaultSettings.php\n      MYSQL_DATABASE: my_wiki\n      MYSQL_USER: wikiuser\n      MYSQL_PASSWORD: example\n      MYSQL_RANDOM_ROOT_PASSWORD: 'yes'\n    volumes:\n      - db:\/var\/lib\/mysql\n\nvolumes:\n  images:\n  db:<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alle mit einer Raute &#8222;<strong>#<\/strong>&#8220; auskommentierten Zeilen werden vom System ignoriert, dienen also zur Beschreibung. Wir sehen zu Beginn den Eintrag &#8222;<strong>services<\/strong>&#8220; &#8211; dieser dient zur Beschreibung der einzelnen Images &#8211; wir haben in diesem Beispiel zwei Images &#8211; &#8222;<strong>mediawiki<\/strong>&#8220; und &#8222;<strong>database<\/strong>&#8222;. Die Services geben den Images grob gesagt nur Namen, mit denen wir etwas anfangen k\u00f6nnen &#8211; f\u00fcr &#8222;<strong>mediawiki<\/strong>&#8220; wird von DockerHub das Image &#8222;<strong>mediawiki<\/strong>&#8220; heruntergeladen und eingerichtet, f\u00fcr &#8222;<strong>database<\/strong>&#8220; das Image &#8222;<strong>mariadb<\/strong>&#8222;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8222;<strong>restart<\/strong>&#8220; zeigt Docker wie und wann Docker das Image starten soll, &#8222;<strong>always<\/strong>&#8220; hei\u00dft nichts anderes als, Docker soll das System automatisch beim Start des Hosts (<em>des Wirtes<\/em>) starten, gibt es Probleme mit dem Gast, soll Docker das Image wieder neu starten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit &#8222;<strong>ports<\/strong>&#8220; geben wir die Ports an, \u00fcber die das Image \u00fcber den Webbrowser erreicht werden soll &#8211; vorne steht der Port, \u00fcber den wir die Software im Webbrowser erreichen wollen, dahinter der Port im Image. &#8222;<em>links<\/em>&#8220; ist eine sehr einfache Definition f\u00fcr das Netzwerk, \u00fcber das die beiden Images kommunizieren &#8211; in diesem Fall nennt sich das Netzwerk &#8222;<strong>database<\/strong>&#8222;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als letzten Eintrag finden wir bei jedem Service den Eintrag &#8222;<strong>volumes<\/strong>&#8220; &#8211; dies sind nun die mit dem Wirt geteilten Verzeichnisse. Wir k\u00f6nnen hier eines oder auch mehrere Verzeichnisse angeben. Als letzte Konfiguration in der Datei zeigt sich hier noch einmal der Eintrag &#8222;<strong>volumes<\/strong>&#8220; &#8211; hier m\u00fcssen alle Volumes &#8211; besser gesagt, deren Bezeichnungen noch einmal angegeben werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtig:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei der Konfigurationsdatei wird das YML-Format (<em>YAML<\/em>) genutzt &#8211; dies ist ein wenig gemein &#8211; man nutzt hier f\u00fcr Einr\u00fcckungen nicht den Tabulator, sondern tats\u00e4chlich zwei Leerzeichen &#8211; alles andere funktioniert bei YML absolut nicht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Volumes einrichten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wir sehen im Original der Einrichtungsdatei oben bereits zwei Volumes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    volumes:\n      - images:\/var\/www\/html\/images\n      # After initial setup, download LocalSettings.php to the same directory as\n      # this yaml and uncomment the following line and use compose to restart\n      # the mediawiki service\n      # - .\/LocalSettings.php:\/var\/www\/html\/LocalSettings.php<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    volumes:\n      - db:\/var\/lib\/mysql<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Im ersten Volume wird das im Gast liegende Verzeichnis &#8222;<em>images<\/em>&#8220; mit dem Host geteilt &#8211; alle anderen Zeilen sind nur Beschreibungen. Sehen wir uns diese Zeile etwas genauer an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      - images:\/var\/www\/html\/images<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vor jeder Volume hat sich ein Bindestrich zu zeigen &#8222;<strong>&#8211;<\/strong>&#8222;, anschlie\u00dfend folgt nach einem Leerzeichen das Verzeichnis, das geteilt werden soll. Sie d\u00fcrfen hier keinen Pfad angeben &#8211; nur das eindeutige Verzeichnis. In diesem Fall liegt das Verzeichnis &#8222;<em>images<\/em>&#8220; im Wirt unter &#8222;<em>\/var\/www\/html\/image<\/em>s&#8220; &#8211; angegeben darf jedoch nur wie schon beschrieben &#8222;<em>images<\/em>&#8220; werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das zweite Volume ist nun ganz einfach &#8222;<em>db<\/em>&#8220; &#8211; hiermit werden alle Dateien in der Datenbank des Images &#8222;<strong>mariadb<\/strong>&#8220; mit dem Host (<em>Wirt<\/em>) geteilt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im Beispiel des Originals wird nur das Verzeichnis &#8222;<em>images<\/em>&#8220; geteilt &#8211; ich m\u00f6chte jedoch das komplette HTML-Verzeichnis teilen, dieses liegt anschlie\u00dfend wie schon beschrieben direkt am Host. Daf\u00fcr lasse ich das Verzeichnis &#8222;<em>images<\/em>&#8220; weg &#8211; dieses liegt ja direkt im Verzeichnis &#8222;<em>html<\/em>&#8222;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die komplette Konfigurationsdatei sieht in meinem Beispiel dann so aus (<em>ohne Beschreibungen<\/em>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3'\nservices:\n  mediawiki:\n    image: mediawiki\n    restart: always\n    ports:\n      - 8080:80\n    links:\n      - database\n    volumes:\n      - html:\/var\/www\/html\/\n  database:\n    image: mariadb\n    restart: always\n    environment:\n      MYSQL_DATABASE: my_wiki\n      MYSQL_USER: wikiuser\n      MYSQL_PASSWORD: example\n      MYSQL_RANDOM_ROOT_PASSWORD: 'yes'\n    volumes:\n      - db:\/var\/lib\/mysql\n\nvolumes:\n  html:\n  db:<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt l\u00e4sst sich aus der Konfigurationsdatei &#8222;<strong>docker-compose.yml<\/strong>&#8220; das originale Docker-Image, das angepasste zaubern &#8211; nat\u00fcrlich mit administrativen Rechten am Terminal im Verzeichnis mit der Datei:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die mit dem Host geteilten Verzeichnisse liegen anschlie\u00dfend auf dem Host unter &#8222;<em>\/var\/lib\/docker\/volumes\/<\/em>&#8220; &#8211; dieses Verzeichnis ist nat\u00fcrlich nur mit administrativen Rechten zug\u00e4nglich.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<div class=\"pld-like-dislike-wrap pld-custom\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"Gef\u00e4llt mir\" data-post-id=\"2174\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                            <img src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/12\/Daumen-Hoch.png\" alt=\"Gef\u00e4llt mir\" \/>\r\n            <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">3    <\/span>\r\n<\/div><div class=\"pld-dislike-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-dislike-trigger pld-like-dislike-trigger  \" title=\"Gef\u00e4llt mir nicht\" data-post-id=\"2174\" data-trigger-type=\"dislike\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                            <img src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/12\/Daumen-Runter.png\" alt=\"Gef\u00e4llt mir nicht\" \/>\r\n            <\/a>\r\n    <span class=\"pld-dislike-count-wrap pld-count-wrap\"><\/span>\r\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>VMWare, VirtualBox und Qemu haben dieselbe Eigenschaft: Sie ben\u00f6tigen Leistung von den Prozessoren. Einerseits ben\u00f6tigt schon die Software, die Hardware virtualisiert, Kraft, andererseits das darauf laufende Betriebssystem &#8211; im Grunde laufen hier dann zwei Betriebssysteme und die Software zur Virtualisierung. In gewissen F\u00e4llen kann hier die Software Docker helfen &#8211; hier l\u00e4uft im Grunde genommen [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2185,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[66,67],"tags":[68,69],"class_list":["post-2174","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker","category-virtualisierung","tag-docker","tag-virtualisierung"],"_links":{"self":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/2174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/comments?post=2174"}],"version-history":[{"count":1,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/2174\/revisions"}],"predecessor-version":[{"id":2186,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/2174\/revisions\/2186"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media\/2185"}],"wp:attachment":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media?parent=2174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/categories?post=2174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/tags?post=2174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}