Docker Ordnerstruktur

  • Hallo,

    nachdem ich jetzt längere Zeit auf einem Raspi mit Docker experimentiert habe und meine Wunsch Container jetzt so eingerichtet habe, dass alles wie gewünscht läuft, möchte ich das ganze jetzt nochmal frisch und ordentlich aufsetzten.

    Zur Verwaltung der Container nutze ich wenn möglich Portainer.

    Bisher hab ich mich bei der Ordnerstruktur bzw. -ablage an die Vorgaben der compose files bzw. stacks gehalten. Gab natürlich schöne Unordnung. Alles kreut und quer verteilt.

    Soll jetzt alle in einem Ordner mit Unterordnder pro Container landen.

    Habt ihr Empfehlungen, auch was ein möglichst einfaches Backup der Docker Daten anbelangt?

    Hart vercodete Pfade nehmen? Volumes anlegen?

    In den diversen compose Dateien sind mir diverse Formen begegnet:

    volumes:

    - Adguard2:/opt/adguardhome/conf:rw

    - Adguard1:/opt/adguardhome/work:rw

    => Ist klar

    Hier wird scheinbar wieder direkt in einen Ordner gemountet. Kann kann nicht auch beides in ein Volume oder zweich machen, um alles an einer Stelle zu haben?

    volumes:

    - ./config:/config:rw

    - /lib/modules:/lib/modules:rw

    Was wäre denn eine gute Strategie bwzgl. Ordnung und Backups?

    Danke für Tipps

  • Ich sehe mich nicht als Experte, aber ich verwende für meine Projekte auf dem Pi Docker Volumes. Zur Sicherung der Daten fahre ich einen Container hoch, der nur dazu dient die Daten zu exportieren. Die eigentliche Sicherung findet dann auf der Host-Ebene statt.

    Zur Erstellung der Images und für die Verwaltung der Container (z.B. mit Docker Compose) habe ich eine projektorientierte Ordnerstrucktur enhelegt. Sie liegen bei mir alle in einem Ordner mit dem Namen 'docks'. So habe ich immer Ordnung und finde alles dort wo es (für mich) hingehört.

    Wie du die Volumes organisierst ist natürlich projektabhängig. Ich versuche die Dinge möglichst einfach zu halten. Komplexe Strukturen, wie sie mit den Extensions von Microsoft erstellt werden, versuche ich zu vermeiden.

    Es macht aber unter Umständen schon Sinn bestimmte Dinge in separaten Volumes zu halten. Was mich betrifft, so denke ich diesbezüglich z.B. an den Server-Code der bei Remote-Zugriff mit Visual Studio Code erstellt wird.

    Ich persönlich bin kein Freund von Portainer. Ich gehöre zur Fraktion derjenigen, die am liebsten immer noch an der schwarzen Konsole arbeiten. Aber auch das muss jeder selber wissen.

  • Für die persistenten Daten meiner Docker-Container habe ich eine Ordnerstruktur /data/docker/docker_volumes/ im root angelegt. Dort speichere ich je nach Container in weitere Unterverzeichnisse. Für AdGuard ist das bei mir /data/docker/docker_volumes/adguard/.

    In der Compose habe ich für Adguard folgende Pfade angegeben:

    - /data/docker/docker_volumes/adguard/work:/opt/adguardhome/work
    - /data/docker/docker_volumes/adguard/conf:/opt/adguardhome/conf
          
    Für ein Backup (ich benutze dafür restic) starte ich die Container einmal neu, damit auch die aktuellsten Daten in die persistenten Volumes geschrieben werden.

    docker stop $(docker ps -q)
    docker start $(docker ps -a -q)

    Stirbt der Elternprozess, während das Kind noch als Zombie herumsteht, wird das Kind an PID 1 weitergereicht.

  • Was meinst Du mit "fahre ich einen Container hoch, der nur dazu dient die Daten zu exportieren". Welchen? Was ist das für ein Tool. Erzähl doch mal mehr...

    Nichts besonderes, einfach ein Container mit einer bash shell in dem ich die Linux-Befehle ausführe, die ich für den Export der Daten nutzen will. Das kann z.B. tar sein.

    Im Prinzip mache ich das so wie in der Docker Dokumentation zu den Volumes beschrieben.

  • Ich schicke voraus, dass ich auch eher der Shell-Fraktion angehöre.

    Portainer habe ich zwar ein paar Monate lang ausprobiert, bin aber wieder davon weggekommen.

    Außerdem verwende ich die Container primär für Test, Builds oder kleinere Services - meist nichts wirklich kritisches... und ich bin der einzige Nutzer.

    Docker (oder in meinem Fall meist Podman rootless) verwende ich unter einem dedizierten Benutzer bei dem die Daten projektorientiert gespeichert werden.

    In dem Projektordner liegen die Dateien zum bauen des Containers und auch die jeweiligen mounts.

    Damit kann ich alles via tar zusammenpacken, sichern, zwischen verschiedenen Servern hin und herschieben und einfach hochfahren.

    Ich persönlich habe noch nicht verstanden, welchen großen Vorteil ein docker volume gegenüber einem directory mount hat.

    Aktuell verwende ich Volumes hauptsächlich für volatile Daten, die ich nicht unbedingt sichern muss - hauptsächlich weil mir der Aufwand für einen dedizierten Sicherungs- und Rücksicherungs-Container zu groß ist. ;)

    VPS 1000 G11 | RS X-Mas 2016 🎄 | VPS A Ostern 2017 🐰 | VPS [piko|nano|mikro] G11s | RS Cyber Quack 🦆 | WH Expert Special 2018 / 4000

  • Danke für die bisherigen Antworten. Vll. stehe ich auch auf dem Schlauch, aber das hier ist doch ein Directory Mount und kein Volume, oder?


    - /data/docker/docker_volumes/adguard/work:/opt/adguardhome/work

    - /data/docker/docker_volumes/adguard/conf:/opt/adguardhome/conf

    Das gleiche sieht bei mir mit Volume so aus:

    Code
    services:
        adguardhome:
            container_name: Adguard
            volumes:
                - Adguard2:/opt/adguardhome/conf:rw
                - Adguard1:/opt/adguardhome/work:rw

    Oder bringe ich was total durcheinander?

  • Damit speicherst du die Dateien in zwei verschiedenen Ordnern (Adguard1 / Adguard2). Das kann man schon so machen, ist aber doch eher unübersichtlich. Aus meiner Sicht ist es besser, wenn alles in einem Ordner mit dem Namen Adguard liegen würde.

    Code
                - Adguard/conf:/opt/adguardhome/conf:rw
                - Adguard/work:/opt/adguardhome/work:rw

    Wenn du mehrere Container betreibst und diese Struktur weiterführen möchtest, würde ich das Ganze noch in einem übergeordneten Verzeichnis ablegen. Das übergeordnete Verzeichnis könnte "docker" heißen.

    Code
                - /docker/Adguard/conf:/opt/adguardhome/conf:rw
                - /docker/Adguard/work:/opt/adguardhome/work:rw

    Bei mehreren Containern hätte man dann eine bessere Übersicht über die gespeicherten Daten.

    Code
    /docker
        /Adguard
            /conf
            /work
        /docker
            /unterordner1
            /unterordner2
        /docker1
        /docker2

    Stirbt der Elternprozess, während das Kind noch als Zombie herumsteht, wird das Kind an PID 1 weitergereicht.

  • Obwohl ich glaube, dass es genügend gute Übersetzungssoftware gibt, sende ich trotzdem die von mir überprüfte Computerübersetzung. Die deutsche Version ist unten angefügt.


    Notice: I'm not following any "Best Practice". I just want to share how I deployed them.

    I am using docker compose. I decided not to use docker volumes at the beginning. And I separate the mounted paths into four categories:

    • configuration
    • runtime data
    • logs
    • persistent data

    and put them respectively in the corresponding directories according to file-hierarchy(7).

    The configuration is version controlled with git and the persistent data is backuped (also version controlled, sort of) with restic. Most of the build files have been separated into git repos and docker compose will build from the git URLs. The rest are seen as configuration.

    Each compose project(by definition of https://docs.docker.com/compose/project-name/) has a folder with the project name and each service(by definition of https://docs.docker.com/reference/compose-file/services/) has a subfolder with its service name. Services may have multiple folders but I didn't regulate this much details.

    Storing runtime data separately is mainly because of my partition plan. I believe it should be adjusted accordingly depending on partition plan.


    Hinweis: Ich halte mich nicht an "Erfolgsmethode". Ich möchte einfach teilen, wie ich sie bereitgestellt habe.

    Ich benutze Docker Compose. Zu Beginn habe ich beschlossen, keine Docker-Volumes zu verwenden. Ich habe die gemounteten Pfade in drei Kategorien unterteilt:

    - Konfiguration

    - Laufzeitdaten
    - Protokolldatei

    - Persistente Daten

    Und habe sie entsprechend in den entsprechenden Verzeichnissen gemäß der file-hierarchy(7) abgelegt.

    Die Konfiguration wird mit Git versioniert und die persistenten Daten werden (auch versioniert, sozusagen) mit Restic gesichert. Die meisten Build-Dateien sind in separate Git-Repos unterteilt, und Docker Compose wird aus den Git-URLs bauen. Die restlichen werden als Konfiguration betrachtet.

    Jedes Compose-Projekt (laut Definition von https://docs.docker.com/compose/project-name/) hat einen Ordner mit dem Projektnamen, und jeder Dienst (laut Definition von https://docs.docker.com/reference/compose-file/services/) hat einen Unterordner mit seinem Dienstnamen. Dienste können mehrere Ordner haben, aber ich habe dies nicht sehr detailliert geregelt.

    Das separate Speichern von Laufzeitdaten ist hauptsächlich auf meinen Partitionierungsplan zurückzuführen. Ich glaube, es sollte entsprechend angepasst werden, je nach Partitionierungsplan.

    2 Mal editiert, zuletzt von simonmysun (21. August 2024 um 03:30) aus folgendem Grund: Die deutsche Version ist unten angefügt.

  • Damit speicherst du die Dateien in zwei verschiedenen Ordnern (Adguard1 / Adguard2). Das kann man schon so machen, ist aber doch eher unübersichtlich. Aus meiner Sicht ist es besser, wenn alles in einem Ordner mit dem Namen Adguard liegen würde.

    Code
                - Adguard/conf:/opt/adguardhome/conf:rw
                - Adguard/work:/opt/adguardhome/work:rw

    Wenn du mehrere Container betreibst und diese Struktur weiterführen möchtest, würde ich das Ganze noch in einem übergeordneten Verzeichnis ablegen. Das übergeordnete Verzeichnis könnte "docker" heißen.

    Code
                - /docker/Adguard/conf:/opt/adguardhome/conf:rw
                - /docker/Adguard/work:/opt/adguardhome/work:rw

    Bei mehreren Containern hätte man dann eine bessere Übersicht über die gespeicherten Daten.

    Code
    /docker
        /Adguard
            /conf
            /work
        /docker
            /unterordner1
            /unterordner2
        /docker1
        /docker2

    Danke, so war die Struktur geplant. In der Testumgebung war wie gesagt alles Kreuz und Quer.

    Ich war nur durch die Ordnerpfade verwirrt (mit vollen Pfaden und trotzdem Volume vs. Named Volume, welches ja auch immer im gleich Standardordner gespeichert wird und man damit eine Struktur anlegen kann).

    Muss ich z.B. diese Pfade hier unbedingt so ablegen:

    - ./config:/config:rw

    - /lib/modules:/lib/modules:rw

    Oder kann ich das nicht auch mit in die "Struktur" packen?

  • Muss ich z.B. diese Pfade hier unbedingt so ablegen:

    - ./config:/config:rw

    - /lib/modules:/lib/modules:rw

    Oder kann ich das nicht auch mit in die "Struktur" packen?

    Wenn, wie in deinem Beispiel, in dem Docker-Container ein Ordner /config und /lib/modules existiert, würde ich das der Übersicht wegen auch so mit in die dauerhaften Volumes mit übernehmen.

    Um bei dem Beispiel mit dem Verzeichnis /docker für Ablage der Volumes zu bleiben:

    Code
    - /docker/meinedockeranwendung/config:/config:rw
    - /docker/meinedockeranwendung/lib/modules:/lib/modules:rw

    In dem Fall sind die Ordner /config und /lib/modules im Pfad /docker/meinedockeranwendung/ zu finden.

    Du kannst das ganze aber auch nach deinen Vorstellungen abändern:

    Code
    - /docker/meinedockeranwendung/ordner1:/config:rw
    - /docker/meinedockeranwendung/ordner2:/lib/modules:rw

    In dem Beispiel werden die Daten von /config in /ordner1 und /lib/modules in /ordner2 gespeichert, wobei /ordner1 und /ordner2 wiederum im Pfad /docker/meinedockeranwendung/ zu finden sind.

    Stirbt der Elternprozess, während das Kind noch als Zombie herumsteht, wird das Kind an PID 1 weitergereicht.