{"id":2187,"date":"2023-09-10T07:59:36","date_gmt":"2023-09-10T05:59:36","guid":{"rendered":"https:\/\/linux-bibel.at\/?p=2187"},"modified":"2023-09-10T08:00:00","modified_gmt":"2023-09-10T06:00:00","slug":"erste-schritte-in-docker","status":"publish","type":"post","link":"https:\/\/linux-bibel.at\/index.php\/2023\/09\/10\/erste-schritte-in-docker\/","title":{"rendered":"Erste Schritte in Docker"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Wie auf einem Computer die Software&nbsp;<a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Docker<\/a>&nbsp;installiert wird, hat Robert in diesem Artikel bereits beschrieben:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/linux-bibel.at\/index.php\/2023\/09\/10\/docker-anwendungen-und-systeme-unter-linux-virtualisieren-isolieren\/\" data-type=\"post\" data-id=\"2174\" target=\"_blank\" rel=\"noreferrer noopener\">Docker &#8211; Anwendungen und Systeme unter Linux virtualisieren \/ isolieren<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bislang habe ich ausschlie\u00dflich VirtualBox genutzt, um virtuelle Maschinen aufzubauen und etwas auszutesten. Mit Docker verspreche ich mir die M\u00f6glichkeit, meine Tests auf kleine F\u00fc\u00dfe zu stellen, um nicht immer mit Kanonen auf Spatzen zu schie\u00dfen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um es vorweg zu nehmen: Aus meiner Sicht ist mein Wunsch in Erf\u00fcllung gegangen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es hat keinen Zweck sich dar\u00fcber Gedanken zu machen, ob man die neueste Linuxdistribution in Docker testen kann. Grafischen Oberfl\u00e4chen kann man nicht nutzen &#8211; nur eben den Browser, wenn es bunt und anklickbar sein soll. Bedeutet, Docker ist was f\u00fcr serverseitige Programme.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um mich dem Thema \u00fcberhaupt n\u00e4hern zu k\u00f6nnen, hatte ich mich auf&nbsp;<a href=\"https:\/\/hub.docker.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Hub<\/a>&nbsp;umgesehen. In dem 6-teiligen Tutorial auf dem YouTube-Kanal von&nbsp;<a href=\"https:\/\/www.youtube.com\/user\/heisenewsticker\" target=\"_blank\" rel=\"noreferrer noopener\">heise online<\/a>&nbsp;gibt es einige gute Hinweise f\u00fcr die ersten Schritte und wo man eben die f\u00fcr Docker notwendigen Dinger (Images) bekommen kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tats\u00e4chlich hat es dann etwas gedauert, bis ich die Images, Container und Volumens auseinanderhalten und verwalten konnte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nat\u00fcrlich bin ich ganz klein angefangen und habe die Konsolenbefehle gelernt. Damit wei\u00df ich dann eben, was passiert, sollte ich sp\u00e4ter mit Docker-Compose (yaml-Script, mache ich jetzt) oder Portainer (eine grafischen Oberfl\u00e4che f\u00fcr Docker) arbeite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Heute habe ich f\u00fcr mich den ersten Teil meiner Lernphase f\u00fcr Docker abgeschlossen und kann nun via Docker-Compose ein Tool starten und die Anwendungsdaten in einem externen Volume speichern. Das Speichern der Anwendungdsdaten in den Containern ist suboptimal, weil sie schnell verloren gehen. Daher, wenn man Container produktiv einsetzen m\u00f6chte, ist das Erlernen mit dem Umgang von Volumes wichtig. Diese Volumes geh\u00f6ren dann zwangsl\u00e4ufig in die Backup-Strategie des Computernutzters.&nbsp;<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.linux-bibel-oesterreich.at\/images\/smilies\/icon_e_wink.gif\" width=\"15\" height=\"17\" alt=\";)\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Meine Ausf\u00fchrungen werde ich \u00fcber mehrere Artikel verteilen. Da wir hier im Wiki sind, bitte f\u00fcr Fragen und Anregungen ein entsprechendes Thema im Forum \u00f6ffnen. Danke!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im Docker Hub liegen offizielle Images von Docker und Images aus der Community. Bislang habe ich mich nur mit den offiziellen Images befast. Zum Lernen ist das wirklich ausreichend.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nat\u00fcrlich wollte ich es mir so einfach wie m\u00f6glichen machen. Mein Lernmaterial bezieht sich auf&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Ghost_%28Blogging-Plattform%29\" target=\"_blank\" rel=\"noreferrer noopener\">Ghost<\/a>. Ghost ist eine freie Bloggingplattform. Ich kenne das Tool nicht, nur vom Namen her. Zu jedem Docker-Images gibt es eine Webseite, die Informationen zur weiteren Verwendung des jeweiligen Images bereith\u00e4lt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auf keinen Fall wollte ich etwas machen, wobei zwei Container gleichzeitig zu nutzen sind. Und nur auf der Konsole hantieren, wollte ich auch nicht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Teil 1<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der Befehl zum Download des Docker-Images f\u00fcr Ghost ist auf der Webseite zu finden. Auf der Konsole ist der entsprechende Befehl auszuf\u00fchren. Dieses muss man mit root-Rechten durchf\u00fchren. Will man als Normaluser die Dockerbefehle ausf\u00fchren, ist mit root-Rechten der User der Gruppe docker hinzuzuf\u00fcgen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ usermod -aG docker username<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nach einer Neuanmeldung kann der Normaluser ohne &#8222;<code>sudo<\/code>&#8220; arbeiten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der einfachste Befehl zum Download eines Images lautet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker pull ghost<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Will man Ghost mit einer bestimmten Version nutzen bzw. ausprobieren, muss man mit sogenannten TAGS arbeiten. Diese TAGS beschreiben im Grunde genommen die Version bzw. die Versionsreihe. Dann k\u00f6nnte der pull-Befehl z.B. so aussehen, wenn es die neueste Version sein soll:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker pull ghost:latest<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Defaulteinstellung lautet wohl immer auf den TAG&nbsp;<strong>latest<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nachdem der einfache Pull-Befehl abgesetzt ist, wird der Download gestartet und durchgef\u00fchrt. Das Ergebnis sind wie folgt aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Using default tag: latest\nlatest: Pulling from library\/ghost\ne1acddbe380c: Pull complete \n7263c7b7f332: Pull complete \n0e985e216445: Pull complete \n75a9268f63ec: Pull complete \n15b30c5db6de: Pull complete \n46e57f8bb6f3: Pull complete \n76bb54f82d33: Pull complete \nef365ad3ce09: Pull complete \nd9989d0de9cc: Pull complete \nDigest: sha256:26e68af5cfe2902f7e1524bdb1ac77f1fcd6ffd462a990f80aff595008c1d926\nStatus: Downloaded newer image for ghost:latest\ndocker.io\/library\/ghost:latest<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der interessierte User wird sich nun fragen, wo denn der Download abgelegt wird. Wo liegt das Image?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Leider ist das nicht offensichtlich, denn im Downloadordner liegt es nicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es liegt hier:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"788\" height=\"78\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_01.png\" alt=\"\" class=\"wp-image-2188\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_01.png 788w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_01-300x30.png 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_01-768x76.png 768w\" sizes=\"auto, (max-width: 788px) 100vw, 788px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Aber das Images selber interessiert uns nicht, denn damit wird nur auf der Konsole (oder sp\u00e4ter in einer Docker-Compose-Datei) gearbeitet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es gibt sehr viele und unterschiedliche Dockerbefehle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nun haben wir einen pull-Befehl abgesetzt und ein Image heruntergeladen. Mit dem folgenden Befehl (incl. Ergebnis) kann man feststellen, ob es wirklich vorhanden ist und welche anderen Images es vielleicht noch gibt:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CODE:&nbsp;<a href=\"https:\/\/www.linux-bibel-oesterreich.at\/viewtopic.php?t=248#\">ALLES AUSW\u00c4HLEN<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker image ls\nREPOSITORY   TAG       IMAGE ID       CREATED        SIZE\nghost        latest    b05a58075ef6   22 hours ago   448MB<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Fall liegt derzeit nur ein Image auf dem Rechner, hat eine Gr\u00f6\u00dfe von 448MB und ist vor 22 Stunden zuletzt aktualisiert worden (von den Entwicklern).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als n\u00e4chstes steht an, dass dieses Image irgendwie benutzbar gemacht werden muss. Um ein Image zu nutzen, muss der run-Befehl verwendet werden. Es gibt diverse M\u00f6glichkeiten, um einen run-Befehl zu kreieren. Es ist immer gut, auf der Webseite des Docker-Images nach der Ausf\u00fchrung des run-Befehls zu schauen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die einfachste Ausf\u00fchrung w\u00e4re<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CODE:&nbsp;<a href=\"https:\/\/www.linux-bibel-oesterreich.at\/viewtopic.php?t=248#\">ALLES AUSW\u00c4HLEN<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker run -d --name myghost ghost<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Was steckt dahinter?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der run-Befehl wird mit de Option&nbsp;<strong>-d<\/strong>&nbsp;gestartet sowie der Option&nbsp;<strong>&#8211;name<\/strong>&nbsp;gefolgt von einer Bezeichnung, die unser Container haben soll, n\u00e4mlich myghost. Und zum Schluss kommt der Image-Name hinten dran.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diesen Befehl setzen wir nicht ab, denn Ghost ist eine Webanwendung. Um eine Webanwendung auch wirklich im Browser starten zu k\u00f6nnen, muss der Befehl erweitert werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker run -d --name myghost -e url=http:\/\/localhost:3001 -p 3001:2368 ghost<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In die Adresszeile des Browsers ist sp\u00e4ter&nbsp;<a href=\"http:\/\/localhost:3001\/\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:3001<\/a>&nbsp;(oder&nbsp;<a href=\"http:\/\/localhost:3001\/ghost\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:3001\/ghost<\/a>&nbsp;f\u00fcr Adminzugang) einzugeben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Ergebnis der Befehlsausf\u00fchrung sieht wie folgt aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>a92b1f1e260d72392c211a4d06c8855a6f5d096d0fd92ea7716267be6befd9e0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mehr ist in der Tat nicht zu sehen, da die Option&nbsp;<strong>-d<\/strong>&nbsp;alles unsichtbar im Hintergrund ablaufen l\u00e4sst.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Damit haben wir unseren ersten Container gestartet. Ob das wirklich so ist, und ob vielleicht noch mehr Container vorhanden sind, erf\u00e4hrt man hier\u00fcber:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker container ls -a\nCONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                                       NAMES\na92b1f1e260d   ghost     \"docker-entrypoint.s\u2026\"   About a minute ago   Up About a minute   0.0.0.0:3001-&gt;2368\/tcp, :::3001-&gt;2368\/tcp   myghost<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mit folgendem Befehl werden die Container angezeigt, die gerade ausgef\u00fchrt werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker ps\nCONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                       NAMES\na92b1f1e260d   ghost     \"docker-entrypoint.s\u2026\"   4 minutes ago   Up 4 minutes   0.0.0.0:3001-&gt;2368\/tcp, :::3001-&gt;2368\/tcp   myghost<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist nahezu die gleiche Anzeige wie beim <code>ls<\/code>-Befehl.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Damit haben wir ein Image heruntergeladen und einen Container gestartet. Das ein Image sowie ein Container vorhanden sind, k\u00f6nnen wir nun pr\u00fcfen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Ergebnis unserer Bem\u00fchungen sollte eine laufende Instanz von Ghost in unserem Browser sein:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"681\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_02-1024x681.png\" alt=\"\" class=\"wp-image-2189\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_02-1024x681.png 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_02-300x199.png 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_02-768x510.png 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_02.png 1163w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Teil 2<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der erste Container l\u00e4uft. Was man damit jetzt weiter macht, spielt im Moment noch keine Rolle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Handling von Images und Containern ist noch nicht beendet, denn Container k\u00f6nnen gestoppt, gestartet und gel\u00f6scht werden. Letztlich k\u00f6nnen Images nur gel\u00f6scht werden, wenn man sie nicht mehr ben\u00f6tigt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um einen Container zu stoppen, k\u00f6nnte man so vorgehen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker ps\nCONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                       NAMES\na92b1f1e260d   ghost     \"docker-entrypoint.s\u2026\"   26 minutes ago   Up 26 minutes   0.0.0.0:3001-&gt;2368\/tcp, :::3001-&gt;2368\/tcp   myghost\n$ docker stop a92b1f1e260d\na92b1f1e260d\n$ docker ps\nCONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">1. Mit dem ersten Befehl wird gepr\u00fcft, ob der zu stoppende Container \u00fcberhaupt l\u00e4uft.<br>2. Der zweite Befehl stoppt die Ausf\u00fchrung des Container \u00fcber seine ID.<br>3. Mit dem dritten Befehl wird das Ergebnis der Bem\u00fchungen \u00fcberpr\u00fcft.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Ergebnis ist, dass der Container nicht mehr aktiv ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nat\u00fcrlich kann man einen Container auch wieder starten. Das sieht dann wie folgt aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker start a92b1f1e260d\na92b1f1e260d\n$ docker ps\nCONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS        PORTS                                       NAMES\na92b1f1e260d   ghost     \"docker-entrypoint.s\u2026\"   29 minutes ago   Up 1 second   0.0.0.0:3001-&gt;2368\/tcp, :::3001-&gt;2368\/tcp   myghost<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Damit ist der Container wieder aktiv und ebenfalls l\u00e4sst sich die Webseite wieder anzeigen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der letzte Befehl, der noch im Handling der Container wichtig ist, betrifft das L\u00f6schen. Damit ein Container gel\u00f6scht werden kann, muss er stoppt sein. Ingesamt kann das so ablaufen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker ps\nCONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                                       NAMES\na92b1f1e260d   ghost     \"docker-entrypoint.s\u2026\"   32 minutes ago   Up 2 minutes   0.0.0.0:3001-&gt;2368\/tcp, :::3001-&gt;2368\/tcp   myghost\n$ docker stop a92b1f1e260d\na92b1f1e260d\n$ docker container rm a92b1f1e260d\na92b1f1e260d\n$ docker ps\nCONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\n$ docker ps -a\nCONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\n$ docker container ls -a\nCONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">1. Pr\u00fcfung, ob der zu l\u00f6schende Container aktiv ist.<br>2. Wenn ja, wird der Container gestoppt.<br>3. Dann wird der Container gel\u00f6scht.<br>4. &#8211; 6. Es wird gepr\u00fcft, ob der Container noch vorhanden ist (ich nutze meist Befehl Nr. 6 nach dem L\u00f6schen).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Container ist nun weg. Geblieben ist das Image. Denn mit dem Image kann man jederzeit einen neuen Container erstellen (run-Befehl).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W\u00e4ren in dem Container Anwendungsdaten vorhanden gewesen, so w\u00e4ren sie jetzt weg. Sobald der Container gel\u00f6scht wird, sind auch die Anwendungsdaten gel\u00f6scht. Gestoppte Container behalten die Daten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generell sollte man in Containern keine Anwendungsdaten speichern. Diese Daten geh\u00f6ren in ein Volume, das au\u00dferhalb des Containers liegt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das L\u00f6schen von Images wird zu einem sp\u00e4teren Zeitpunkt behandelt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Teil 3<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Anwendungsdaten k\u00f6nnen gespeichert werden. Allerdings nicht im Container, da geh\u00f6ren sie nicht hin, sondern daf\u00fcr verwendet man&nbsp;<strong>Volumes<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der generelle Befehl zum Anlegen eines Volumes lautet wie folgt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker volume create<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mit diesem Befehl wird ein Volume angelegt, dessen &#8222;Name&#8220; aus zuf\u00e4lligen Ziffern und Buchstaben besteht und ellenlang ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es w\u00e4re schon besser, wenn man dem Kind einen Name gibt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker volume create meinvolume<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der letzte Teil des Befehls &#8222;meinvolume&#8220; ist nun der Name des Volumes. Ob Volumes vorhanden und wie sie benannt sind, l\u00e4sst sich wie folgt feststellen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker volume create meinvolume\nmeinvolume\n$ docker volume ls\nDRIVER    VOLUME NAME\nlocal     0bf98e29f96b7bf612a0b183bc4b43007142f3244eb3e9cd0033dae29f92ee57\nlocal     445e2c5a1e8f0b7319bca133189a910ce388566bec53968f87adfb8ee1e2f640\nlocal     a36d2c024a46485c50549b59a6da30da3d110530d9555c3e92a02bff9e0adb3c\nlocal     meinvolume<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aus meiner Sicht ist der lesbare Volumenname angenehmer als die 3 bereits bestehenden Volumes aus meiner Testphase, die ich absichtlich habe bestehen lassen. Nat\u00fcrlich lassen sich, analog zu Images und Containern, Volumens l\u00f6schen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Volumes werden im Hostsystem abgelegt und k\u00f6nnen ganz normal benutzt werden. Wie bereits weiter oben angedeutet, sind diese Volumes durchaus in die Sicherungsroutinen einzubauen, wenn wichtige Daten in den Volumens erzeugt und gehalten werden. Die Volumens liegen standardm\u00e4\u00dfig hier:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"788\" height=\"126\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_03.png\" alt=\"\" class=\"wp-image-2190\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_03.png 788w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_03-300x48.png 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_03-768x123.png 768w\" sizes=\"auto, (max-width: 788px) 100vw, 788px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Bitte beachten, dass auch ein in der Gruppe docker angelegter Normaluser den Ordner&nbsp;<strong>docker<\/strong>&nbsp;nicht sieht. Hier muss mit sudo gearbeitet werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Volumens enthalten die Anwendungsdaten. Nat\u00fcrlich muss man beim L\u00f6schen von Volumens aufpassen. Im Grunde genommen ist das nichts anderes wie das L\u00f6schen der eigenen Systemfestplatte.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Folgender Befehl l\u00f6scht ein Volume:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker volume rm meinvolume\nmeinvolume\n$ docker volume ls\nDRIVER    VOLUME NAME\nlocal     0bf98e29f96b7bf612a0b183bc4b43007142f3244eb3e9cd0033dae29f92ee57\nlocal     445e2c5a1e8f0b7319bca133189a910ce388566bec53968f87adfb8ee1e2f640\nlocal     a36d2c024a46485c50549b59a6da30da3d110530d9555c3e92a02bff9e0adb3c<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dem ersten Befehl wurde das Volume gel\u00f6scht. Mit dem zweiten Befehl wurde \u00fcberpr\u00fcft, ob das Volume tats\u00e4chlich gel\u00f6scht wurde.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es ist nicht wirklich vorteilhaft, wenn die Volumes irgendwo in den Tiefen des Systems versteckt liegen. Es macht Sinn, dass man eine Struktur aufbaut, die alle Volumes beinhaltet und somit auch einfach in die Sicherungsroutinen eingef\u00fcgt werden kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dazu lenkt man das Volume an einen definierten Ort. Im Home-Verzeichnis meines Users habe ich einen Ordner&nbsp;<strong>dockerdata<\/strong>&nbsp;sowie einen Unterordner&nbsp;<strong>ghost<\/strong>&nbsp;angelegt. Ich m\u00f6chte erreichen, dass die Anwendungsdaten im Unterordner gespeichert werden. Dort kann ich sie jederzeit sehen und benutzen wie alle anderen Daten auch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Verlinken des Volumes auf den Unterordner\u00a0<strong>ghost<\/strong>\u00a0kann w\u00e4hrend der Ausf\u00fchrung des run-Befehls erfolgen. Das sieht dann sehr kryptisch aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name myghost -e url=http:\/\/localhost:3001 -p 3001:2368 -v ~\/dockerdata\/ghost:\/var\/lib\/ghost\/content ghost<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wie mit dem run-Befehl ein Container erzeugt wird, wurde weiter oben schon beschrieben. Der aktuelle Befehl wurde um den Zusatz<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">-v ~\/dockerdata\/ghost:\/var\/lib\/ghost\/content<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">erweitert. Die Option &#8211;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>v<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">steht f\u00fcr Volume. Hinter dem Doppelpunkt wird der Originalort angegeben, an dem das Volume liegt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In dem Unterordner\u00a0<strong>ghost<\/strong>\u00a0unter \/home\/django\/dockerdata wurden nun weitere Ordner angelegt:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"475\" height=\"183\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_04.png\" alt=\"\" class=\"wp-image-2191\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_04.png 475w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_04-300x116.png 300w\" sizes=\"auto, (max-width: 475px) 100vw, 475px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Alle Anwendungsdaten, die von nun an in Ghost erstellt oder hingebracht werden, werden in diesen Ordnern gespeichert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich habe mich als Admin angemeldet und einen ersten Artikel geschrieben, in dem ein Bild eingef\u00fcgt wurde. Dieses Bild wird im Unterordner\u00a0<strong>images<\/strong>\u00a0abgelegt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"810\" height=\"636\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_05.png\" alt=\"\" class=\"wp-image-2192\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_05.png 810w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_05-300x236.png 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_05-768x603.png 768w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Auf der Webseite ist das Ergebnis der Artikelerstellung auch zu bewundern:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_06.png\" alt=\"\" class=\"wp-image-2193\" style=\"width:692px;height:510px\" width=\"692\" height=\"510\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_06.png 1017w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_06-300x221.png 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_06-768x566.png 768w\" sizes=\"auto, (max-width: 692px) 100vw, 692px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Teil 4<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Das Arbeiten in\/auf der Konsole macht durchaus Spa\u00df. Das Handling von Images, Containern und Volumes in der einfachsten Art und Weise, wie bislang beschrieben, ist eine wichtige Grundlage zum Kennenlernen von Docker und seinen vielen M\u00f6glichkeiten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aber man muss auch die Zeit bedenken, die es kostet, immer wieder diese Befehle einzutippen. Inbesondere die Aktionen aus Teil 3 lassen sich sehr gut automatisieren. Und das funktioniert mit&nbsp;<strong>docker-compose<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei der Installation von Docker wird dieses Tool nicht installiert. Es l\u00e4sst sich aber ganz flott nachinstallieren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install docker-compose<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die 3 wichtigsten Befehle von docker-compose sind:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. docker-compose up -d<br>2. docker-compose stop<br>3. docker-compose down<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dem ersten Befehl wird das Tool im Hintergrund gestartet. Der zweite Befehl stoppt das Tool. Der dritte Befehl f\u00e4hrt das Tool herunter. Sobald das erfolgt, wird auch sofort der Container, der beim Start erzeugt wurde, gel\u00f6scht. Man muss eigentlich als User nichts mehr machen, um im Container zu arbeiten bzw. die Arbeit mit dem Container zu beenden. Das macht eben docker-compose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das funktioniert aber alles nur, wenn eine entsprechende Konfigurationsdatei vorhanden ist. Diese Konfigurationsdatei muss den Namen&nbsp;<strong>docker-compose.yaml<\/strong>&nbsp;haben, sonst l\u00e4uft docker-compose nicht. Die Einr\u00fcckungstiefe der Programmzeilen sollte mit je zwei Leerzeichen erfolgen. Tabs gehe auch, k\u00f6nnen aber Problem verursachen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Inhalt der Datei ist nun so aufgebaut, dass das gleiche erreicht wird, wie in den obigen Beschreibungen dargestellt. So sieht es aus:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">version: &#8218;3.1&#8216;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">services:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">meinghost:<br>image: ghost<br>restart: always<br>ports:<br>&#8211; 8081:2368<br>volumes:<br>&#8211; .\/ghost:\/var\/lib\/ghost\/content<br>environment:<br>url:&nbsp;<a href=\"http:\/\/localhost:8081\/\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:8081<\/a><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Die Ausf\u00fchrung von docker-compose zum Start des Tools ist dann wie folgt vorzunehmen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker-compose up -d\nCreating network \"dockerdata_default\" with the default driver\nCreating dockerdata_meinghost_1 ... done\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Es wird bei der Ausf\u00fchrung ein Default-Netzwerk eingerichtet. Auch Netzwerke kann man in Docker wie Images, Container und Volumes selber erstellen und verwalten. In dem Script ist das aber nicht erfolgt, daher wird ein Default-Netzwerk ausgef\u00fchrt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ob die Ausf\u00fchrung des Befehl gelungen ist, zeigt wieder eine \u00dcberpr\u00fcfung der laufenden Container:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker ps -a\nCONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                       NAMES\n3311a4b8aa24   ghost     \"docker-entrypoint.s\u2026\"   4 minutes ago    Up 4 minutes    0.0.0.0:8081-&gt;2368\/tcp, :::8081-&gt;2368\/tcp   dockerdata_meinghost_1\n52e8545e09eb   ghost     \"docker-entrypoint.s\u2026\"   32 minutes ago   Up 32 minutes   0.0.0.0:3001-&gt;2368\/tcp, :::3001-&gt;2368\/tcp   myghost<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hier ist zu sehen, dass zwei Container laufen. Der erste Container ist der mit docker-compose erzeugte Container, der auf Port 8081 l\u00e4uft. Der zweite Container ist der vorhin erstellte Container, der auf Port 3001 gelegt wurde.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auch der mit dem Script erzeugte Container nutzt das vorhandene Volume und zeigt die gleiche Webseite an.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1017\" height=\"747\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_07.png\" alt=\"\" class=\"wp-image-2194\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_07.png 1017w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_07-300x220.png 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/screener_07-768x564.png 768w\" sizes=\"auto, (max-width: 1017px) 100vw, 1017px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Egal, was mit den Containern passiert, solange das Volume unangetastet bleibt, kann man mit jedem Container auf das Volume zugreifen. Allerdings muss man beim Wechsel des Image aufpassen. Man kann nicht einfach so eine andere Version des Images nutzen. Dazu sp\u00e4ter irgendwann mal mehr.<\/p>\n\n\n\n<p class=\"has-light-green-cyan-color has-text-color wp-block-paragraph\">Verfasst von Bommo<\/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=\"2187\" 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\">1    <\/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=\"2187\" 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>Wie auf einem Computer die Software&nbsp;Docker&nbsp;installiert wird, hat Robert in diesem Artikel bereits beschrieben: Docker &#8211; Anwendungen und Systeme unter Linux virtualisieren \/ isolieren Bislang habe ich ausschlie\u00dflich VirtualBox genutzt, um virtuelle Maschinen aufzubauen und etwas auszutesten. Mit Docker verspreche ich mir die M\u00f6glichkeit, meine Tests auf kleine F\u00fc\u00dfe zu stellen, um nicht immer mit [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2194,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[66,67],"tags":[68,69],"class_list":["post-2187","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\/2187","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=2187"}],"version-history":[{"count":2,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/2187\/revisions"}],"predecessor-version":[{"id":2196,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/2187\/revisions\/2196"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media\/2194"}],"wp:attachment":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media?parent=2187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/categories?post=2187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/tags?post=2187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}