Kein mir jemand Docker erklären?

  • Ich raff es nicht. Folgendes Problem, bisher bastel ich auf Windows mit XAMPP an der Homepage. Das wird nicht mehr richtig gepflegt und Mysql ist mal wieder kaputt. Also will ich mich nach was anderem umschauen.

    Alle Sagen Docker. Jetzt habe ich mir nen Paket aus nginx, mysql, php und phpmyadmin geschnürt. Aber wo sind meine Dateien? Das ganze scheint ja auf den Linux Subsystem zu laufen.

    Bin ich der einzige auf dem Planeten, der einfach nen verficktes Windows Verzeichnis als root für einen Websserver betreiben will? Und warum kann ich keine 2te Datenbank anlegen. Was sind Volumes? Warum alles so abstrahiert?

  • Den Docker Container kannst du dir vorstellen wie ne minimale VM ohne alles. Also du emulierst nicht nen BIOS, Betriebssystem, Hardware etc. sondern hast nur ne Umgebung in der ne Anwendung laufen kann. Die Anwendung merkt das nicht, dass sie in einem Container läuft und hat die gleichen rechte wie normalerweise, nur halt im Container.

    Angenommen du willst jetzt auf einem Server drei verschiedene Versionen einer Software am laufen haben und installierst das ganz normal wirst du schnell Probleme mit Abhänigkeiten etc. bekommen. Außerdem kann ja jedes Programm auch einfach Daten der anderen Version bearbeiten und löschen. Das ist schlecht und das will man vermeiden.

    Deshalb bekommt jeder Container ne eigene frische Installation des Base-Images vorgegaukelt und die Daten werden in Volumes gehalten.

    Also du kannst in der Shell mal

    Code
    docker ps -a


    ausführen. Damit siehst du alle vorhanden Container. Die sind per Default alle Einzelgänger und haben nur Internet und sonst nichts (keine Ports offen etc.).

    Code
    docker volume ls


    Listet alle Volumes der Container. Das ist die Festplatte wo die Daten des Containers liegen.
    Mit

    Code
    docker volume inspect NAME

    siehst du auch wo der Container liegt.

    Für sowas wie einen Webserver willst du jetzt aber den Container ja mit deinem Hostsystem teilen. Dafür gibts sogenannte Bind-Mounts. Damit kann man einen Ordner im Container einfach auf einen lokalen Pfad legen und so kannst du und das Programm im Container auf den Pfad einfach zugreifen und da Daten lesen und schreiben.
    Und wenn du den Container neu anlegst und den mount wieder angibst sind die Daten dann noch da.
    beim Starten vom Container spezifizierst du das einfach so [code]-v /path/to/music/library:/music" Vor dem Doppelpunkt ist der Lokale Pfad und hinter dem Doppelpunkt der Pfad im Container.

    Docker ist sehr praktisch wenn mans verstanden hat.
    Am besten stellst du dir vor du hast ne Maschine die nur ein Terminal und ne Internetverbindung hat. Alles andere spezifizierst du beim Start des Containers nach. Also welche Ports offen sind, ob irgendwelche Daten mit anderen Maschinen ausgetauscht werden sollen, ob Geräte vom Host an die Maschine durchgereicht werden sollen etc.
    Und Container sind dafür gemacht weggeworfen zu sein, alles was du im Container tust aber nicht in einem Volume gespeichert wird ist beim nächsten Erstellen des Containers weg. So sollte man das auch handhaben und nicht im Container mit apt Dinge updaten etc.

    Musst mal die offizielle Doku durchschauen. Chatgpt kann dir in der Hinsicht auch fast alles erklären wenn du fragen hast. Sonst Poste auch hier gerne mal dein Dockerfile.

    Achja und es gibt auch noch ne Strategie wenn man mehrere Container auf einmal verwalten will, z.B. wenn du 3 Webserver und eine DB Starten möchtest. Nennt sich Docker Compose.

  • Das ist schonmal interessant. Ich habe gedacht, dass man die ordner über diese yml Datei definieren muss/kann. Ich finde es auch äußerst verwirrend dass niemand irgendwas mit der oberfläche machen zu scheint und alle nur Konsolenbefehle rauswerfen. werde die datei mal hier reinstellen. aber wie immer falscher Rechner


  • Ich finde es auch äußerst verwirrend dass niemand irgendwas mit der oberfläche machen zu scheint und alle nur Konsolenbefehle rauswerfen.

    Das ist im (unixoiden) Server-Umfeld aber Gang und Gebe. Da klickt sich keiner "was zusammen". Eine GUI dient nur dazu, mehrere Console-Fenster auf einem Bildschirm anzuzeigen.


    Wie kamst Du eigentlich auf den Thread-Titel "Kein mir jemand Docker erklären?" ?


  • Das ist schonmal interessant. Ich habe gedacht, dass man die ordner über diese yml Datei definieren muss/kann. Ich finde es auch äußerst verwirrend dass niemand irgendwas mit der oberfläche machen zu scheint und alle nur Konsolenbefehle rauswerfen. werde die datei mal hier reinstellen. aber wie immer falscher Rechner

    Ja, da geht, wenn du mit Docker Compose arbeitest. Letztendlich kannst du aber auch einzelne Container einfach per Command Line starten und über Netzwerke miteinander verbinden.
    Um das eben zu vereinfachen, gibts Docker Compose. Da wird dann alles in einer YAML Datei angegeben und gestartet/gestoppt, was das ganze etwas komfortabler macht.

    Noch ein wenig komfortabler gehts über Tools wie DDEV.

  • Das Tool versteh ich überhaupt nicht.

    Ich wollte mein Compose hier posten. Aber sinnlos. Der haufen Müll funktioniert schon nicht mehr. Erst hatte ich keine Verbindung mehr zum SQL Server herstellen können und jetzt beendet sich der Webserver einfach.

    ICh brauche primär einfach:
    HMTL Server der auf nen lokalen Ordner zeigt (Wunsch parallelverzeichnis)
    PHP 8.3
    phpmyadmin
    mysql Datenbank

    Was mich ankotzt ist das man via google kein Tutorial findet. Jeder bastelt nur irgendwas, postet es, das listing funktioniert nicht und 15 andere Leute haben Ideen



    Bin jetzt erstmal damit weiter gekommen. Jetzt mit Apache. Aber jetzt kämpfe ich mit der DB Anbindung

    docker compose

    dockerfile



    update: Es läuft. Ich glaub es kaum. Mein fehler war das ich per Localhost mich verbinden wollte, es muss aber mysql heißen, weil ... weil ich es so angegeben habe? Die Mysql hat auch was importiert, war aber egal, weil ich jetzt root hatte, konnte ich meine 2 dbs direkt einspeichern. Was Dockerfile macht ist mir ein völliges rätsel und ich weiß gerade nicht, welche php version aktiv ist. aber von den Fehlermeldungen scheint es mindestens 8.1 zu sein. Jede Menge deprecated. muss mal schauen wie ich zu mindest warnings weg kriege. Auf dem Server wie der Testbench.


    Einmal editiert, zuletzt von Dirk (16. September 2024 um 16:42)


  • Mein fehler war das ich per Localhost mich verbinden wollte, es muss aber mysql heißen, weil ... weil ich es so angegeben habe?

    Container bekommen automatisch Hostnamen, die zu dem korrespondieren, was du als Namen der Services im "Services"-Abschnitt angibst.

    Code
    services:
        php:  #  <--- Hostname
            build: .
        mysql:  #  <--- Hostname
            image: mysql:8.0
        phpmyadmin:  #  <--- Hostname
            image: phpmyadmin

    Theoretisch kannst du auch manuell Namen angeben:

    Code
    services:
        php:  #  <--- Hostname
            build: .
        mysql:  #  <--- Hostname
            image: mysql:8.0
        phpmyadmin:
            image: phpmyadmin
            container_name: admin  #  <--- Hostname und Container-Name wird hier mit "admin" überschrieben

    Noch etwas zu der Sache mit den Versionen von Container-Images:

    Dadurch, dass du

    Code
    services:
        php:
            build: .

    angegeben hast, fängt docker compose beim ausführen von "docker compose build" oder "docker compose up" an, ein Container-Image zu bauen, welches dann auf deinem Server abgelegt und direkt danach gestartet wird.

    Im "Dockerfile", welches dafür benutzt wird ("build: ." gibt an, dass es im aktuellen Verzeichnis nach einem Dockerfile suchen soll), hast du folgendes angegeben:

    Code
    FROM php:8-apache

    Das bedeutet, dass Docker sich als "Grundschicht" erstmal das Image "php:8-apache" runterlädt (per Default von https://hub.docker.com/) und darauf aufbauend deine Befehle, die weiter unten angegeben sind, ausführt. Nachdem die Befehle ausgeführt wurden, wird das Endprodukt (also z.B. installiertes wget, aktiviertes apache2 ssl Modul) als Image abgelegt.

    Versionen von Images kannst du pinnen, indem du einen Tag oder einen Digest bzw. Hash angibst. Ein Digest pinnt eine Version sehr sehr spezifisch - sobald sich an einem Image ein Bit ändert, wird der Digest am Ende anders sein.
    Welche Versionen von einem Image es gibt, kannst du im Fall von php hier sehen: https://hub.docker.com/_/php/tags
    Hier gibt es noch eine bessere Übersicht, aber vorsicht, es ist wirklich viel: https://github.com/docker-library…ockerfile-links
    Wenn du in die Suche nun "8-apache" rein wirfst, wirst du auf folgendes Image stoßen: https://hub.docker.com/layers/library…context=explore
    Das ist das "php"-Image mit dem Tag "8-apache". Viele Anbieter laden verschiedene Varianten hoch, die auf bestimmte Bedürfnisse zugeschnitten sind. In dem Fall beinhaltet dieses PHP-Image das neueste stable PHP in Version 8, und dazu einen Apache-Webserver. Natürlich gibt es dementsprechend auch Varianten, die ein FPM drin haben, oder z.B. eine spezifische ältere Debian-Version als Basis benutzen.

    Diese Tags (also z.B. "8-apache") sind frei vergebbare Namen. Mit jedem Update wird das "8-apache" Tag überschrieben und beinhaltet dahinter ein anderes Image. Du kannst dir das wie einen Alias vorstellen, der Name zeigt einfach auf ein ganz bestimmtes Image.
    Welches ganz bestimmte Image das ist, kann mit dem Digest angegeben werden. Wenn du ein Image pinnst, sieht das z.B. so aus:

    Code
    FROM php:8-apache@sha256:7d01ff3c5de85dd3a2acc1cefb8b220e3086488e5f9d506c8b1e7565aa01cd77


    Das ist jetzt aber natürlich für manuelle Bearbeitung extrem nervig. Daher bieten viele Anbieter an mehrere Tags an, die auf das gleiche Image zeigen, immer spezifischer von der Versionierung her.
    Du kannst also auch

    Code
    FROM php:8.3.11-apache


    verwenden, da es zum jetzigen Zeitpunkt auf den gleichen Digest zeigt. Während sich in "php:8-apache" immer die neueste Version 8 mit Bookworm-Basis und Apache befinden wird, ist in "php:8.3.11-apache" immer nur diese eine spezifische Version drin. Analog dazu gibt es auch "php:8.3-apache", in welchem dann regelmäßig neue Patch-Versionen landen.

    *blök* 🦌

    Einmal editiert, zuletzt von Nik (18. September 2024 um 11:24)

  • Wow. Viel Info. Ich habe viele Beispiele gefunden, wo PHP in de Services stand, und habs nicht verstanden, warum das bei dem Beispiel gerade nicht so gemacht wurde. Weil logischer fände ich schon wenn PHP von PHP in der neuesten Version käme. Auf dem Server habe ich ja auch nur begrenzt einfluss drauf und ich nehme immer das aktuelle, weil so edge ist das ganze Winhistory.de Zeug nicht. Jetzt ist mal viel alter Code dagewesen, der sich viel gemeldet hatte.

    Bin am Überlegen nochmal weiterzubasteln. Ich könnte doch jetzt einen weiteren Docker Ordner daneben mit anderen Namen machen, und der würde dann eine parallele Maschine zusammenbasteln? Weil die würde ich nicht aufgeben wollen. Das läuft jetzt wirklich, habe noch den Port auf 80 geändert.

    Würde es was bringen von php:8-apache auf php:8.3-fpm oder versau ich mir dann alle einstellungen? bzw wenns nen 8.4 gäbe, würde 8-apache (wenn es noch gepflegt wird direkt darauf gehen und php:8.3 wohl eher nicht. PHP scheint da wirklich etwas strange zu sein, habe andere Beispiele angeschaut, aber letztlich wird doch nur über nen dockerfile was nachgeladen.

    Will auch mal schauen, ob ich mit der db über init die richtigen user und db zumindest anlege. Importieren müsste ich ja eh manuell.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!