Docker - Pfade usw.

Jonny2k

New member
Hi Leute,
ich komme aus der Windows Welt und versuche grade Docker zu lernen allerdings habe ich Probleme von der Logik her mit den Pfaden.


Woher weiss ich wenn ich ein Image installiere und einen Container erstelle in welchem Pfad die Applicationen liegen bzw. welche Ordner dort wichtig sind.
Ich hab ja Linux für Windows installiert, das bietet dann sozusagen den Kernel, werden dann die Pfade von diesem Linux genommen oder wird bei jedem Container ein eigenes Linux mitinstalliert?

Sorry für meine dummen Fragen, ich bin noch kompletter Anfänger, ich muss das aber lernen, für mich wirklich erstmal sehr kompliziert.

Vielen Dank schon mal im voraus.

LG
Jonny
 
Hi :)
Woher weiss ich wenn ich ein Image installiere und einen Container erstelle in welchem Pfad die Applicationen liegen bzw. welche Ordner dort wichtig sind.
eigentlich... RTFM 🤪😁 Aber mal ernsthaft: "Es kommt darauf an..."

Hört sich ein bisschen doof an (ist es auch), aber ist auch so. Grundsätzlich hängt es erstmal vom Image ab, welches Du benutzt und ggf. was die Grundlage dessen ist.

Ich z.B. wollte vor einiger Zeit mal ein Image (Webserver+Website) selber bauen. Hab ich mir also ein httpd rausgesucht auf "Alpine"-Basis (bin eher der "Debian"-Typ). Hab mir nix groß dabei gedacht, eine einfache html-Datei in das Image geschmissen (nach "/var/www/html", so wie "immer" unter Debian), hab das Image gestartet und... nichts....... Den Grund dafür hab ich dann auch erst nachschauen müssen, aber im Alpine-Image war der korrekte Pfad dafür dann "/usr/local/apache2/htdocs" 😅 Auf der anderen Seite... Alpine vs. Debian... hätte man ja theoretisch auch schon darauf kommen können, dass da ggf. doch etwas anders ist... Die Macht der Gewohnheit eben... 😇

Aber: Glück für Dich! Die meisten Dinge sind auch entsprechend beschrieben. Tip: Nicht einfach irgendwas aus der Docker-Registry herunterladen und starten, sondern vorher die Beschreibung dazu lesen! Bleiben wir mal einfach bei meinem o.g. Beispiel:

https://hub.docker.com/_/httpd ... Scrollt man da einfach mal etwas runter, steht das ganze auch beschrieben dort! 😅

COPY ./public-html/ /usr/local/apache2/htdocs/
oder auch nur zum starten, ohne irgendwas "in" das Image zu packen:
$ docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

Wenn Du möchtest, können wir gerne ein praktisches Beispiel nehmen, aber besten etwas, was Du grade sowieso im Kopf hast? 😊
 
Wow super, echt etwas komplex das ganze, das heisst ich muss mich bei jedem Image darüber Informieren :eek:
Ich dachte da gibt es genauere Regeln wie die Pfad genutzt werden.

OK ein Beispiel wäre, ich möchte einen apache Webserver, PHP, Mysql und Redis installieren und dann miteinander kombinieren, auf dem PHP Container möchte ich dann Laravel installieren, wäre echt super wenn du mir da vielleicht helfen könntest, ich möchte es aber auch verstehen das ist mir das wichtigste.

Echt lieben Dank :)(y)
 
Also vorab: Ich hab bei weitem weniger Ahnung von Docker, als Du derzeit evtl. vermutest und von Laravel hab ich so "gar keine" Ahnung 😅 aber ... dafür vielleicht ein paar Ansätze:

Webserver und Datenbank sind oft "getrennt" (also nicht so wie bei den klassischen "Hosting"-Kisten, wo alles auf einer Kiste läuft). Redis ist meist auch extra, Damit wärst Du schon mal bei 3 Containern:

- Webserver (inkl. PHP)
- Datenbank
- Redis

Da es die Sache "wesentlich" einfacher macht, würde ich auch dazu raten, dass Du Dir Dein Konstrukt einfach über eine Datei namens "docker-compose.yml" zusammenbastelst. Das hat den Vorteil, dass Du das gesamte Konstrukt (bestehend aus diversen Images) einfach hochziehen kannst. Die Alternative dazu wäre, sich ein komplett eigenes Image zu basteln, das dürfte aber wesentlich zeitaufwändiger sein.

Im Grunde genommen geht es bei dem docker-compose.yml-File darum, dass man sich seine eigene Umgebung zusammenbastelt. Das könnte dann z.B. so aussehen:

Web: von extern erreichbar (z.B. Ports 80+443) + internes Netz
DB: internes Netz
Redis: internes Netz

Heisst aber auch: Du kannst von "extern" z.B. nicht auf die DB zugreifen (über den MySQL-Port). Allerdings kannst Du auf dem Dockerhost normalerweise schon "in" die Container (z.B. via "docker exec -it <container-name> /bin/bash"). Für den Anfang könnte man aber bei einer lokalen Umgebung auch erstmal hingehen und all das - wo man gerne dran möchte - auch Port-technisch von aussen erreichbar machen (z.B. den MySQL-Port).

So im "kleinen" könnte das z.B. so aussehen:

YAML:
---
version: '3'

services:
  php:
    image: php:8.2-apache
    container_name: php
    restart: unless-stopped
    networks:
      - intern
    depends_on:
      - db
      - redis
    ports:
      - 80:80
    volumes:
      - ./html:/var/www/html
    environment:
      - TZ=Europe/Berlin
      - MYSQL_DATABASE=db1
      - MYSQL_USER=db1user
      - MYSQL_PASSWORD=db1password
      - MYSQL_HOST=db
      - REDIS_HOST=redis

  db:
    image: mariadb
    container_name: db
    restart: unless-stopped
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    networks:
      - intern
    ports:
      - 3306:3306
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - TZ=Europe/Berlin
      - MYSQL_ROOT_PASSWORD=true
      - MYSQL_DATABASE=db1
      - MYSQL_USER=db1user
      - MYSQL_PASSWORD=db1password
  redis:
    image: redis:alpine
    container_name: redis
    volumes:
      - ./redis:/data
    networks:
      - intern

networks:
  intern:
    name: intern
    driver: bridge

Ich erstelle mir gern ein gesondertes Verzeichnis pro Projekt (z.B. .../webdings/) dort hinein kommt dann der o.g. Inhalt in eine Datei (docker-compose.yml) und dann braucht es in diesem Verzeichnis eigentlich nur noch ein "docker compose up -d", die in der Datei genannten Images werden heruntergeladen und das ganze wird hochgezogen.

Da halt "etliche" Leute ihre eigenen Container basteln und diese auch zur Verfügung stellen bzw. auch bei Docker-Hub hochladen, lohnt es sich auf jeden Fall, sich da ggf. im Vorfeld mal umzuschauen.

So auf die schnelle mit "ohne Ahnung", findet sich dort z.B. https://hub.docker.com/r/bitnami/laravel, kann ich aber nicht einschätzen und hab ich auch keine Ahnung von. Aber es gibt halt auch andere, wie z.B. diesen hier: https://hub.docker.com/r/laravelfans/laravel ("Laravel Docker for production and development, base on Official PHP Apache image"), liest sich ja jetzt auch erstmal nicht SO verkehrt, scheint ja schon das meiste dabei zu sein. Nebst dem gäbe es dann auch noch sowas hier, das scheint mir so ein "all in one"-Ding zu sein: https://hub.docker.com/r/systemsdk/docker-apache-php-laravel ("Components: Apache 2.4, PHP 8.2 (Apache handler), MySQL 8, Laravel 10, Mailpit (only for debug emails on dev environment)").

Schlussendlich hast Du die Qual der Wahl und musst für Dich entscheiden, womit Du am besten klar kommst :)
 
Zuletzt bearbeitet:
Wow super, echt etwas komplex das ganze, das heisst ich muss mich bei jedem Image darüber Informieren :eek:
Ich dachte da gibt es genauere Regeln wie die Pfad genutzt werden.
... aber ohne Docker müsste man das doch auch alles für die jeweilige Anwendung lernen... bei Docker ist der Charme das es direkt in der Image-Beschreibung steht und nicht irgendwo in den Untiefen einer Dokumentation vergraben ist. Jeder Image-Maintainer baut sein Image wie er es für richtig hält, dass heißt auch das es keine Garantie gibt, dass jeder Image-Maintainer standardpfade einer Anwendung verwendet - aber zumindest sollte er die erwarteten Pfade dokumentiert haben.

Es wird keinen Spaß machen Docker "irgendwie" zu nutzen und einfach nur wild Sachen auszuprobieren. Man sollte zumindest mal einen Gettings Started Guide machen, damit man das relevante schon mal gesehen oder zumindest davon gelesen hat.

Gerade, wenn man selbst eine Anwendung in einen Container sperren will, bleibt kein Weg dran vorbei selbst ein Dockerfile zu schreiben und sich damit auseinanderzusetzen, wie Images erzeugt werden. Häufig lohnt es sich in Github Repos bei anderen Anwendungen mit selbem Technologiestack zu spicken und zu schauen, wie sie bestimmte Probleme im Image gelöst haben.
 
Ich hab ja Linux für Windows installiert, das bietet dann sozusagen den Kernel, werden dann die Pfade von diesem Linux genommen oder wird bei jedem Container ein eigenes Linux mitinstalliert?
Was heisst das? Hast Du Docker Desktop for Windows installiert? Oder hast Du docker-CE in einer Linux-VM oder WSL2 installiert?
Wo arbeitest Du? Unter Windows? in der Linux VM bzw. in WSL2?

Ein Container ist kein vollwertiges Linux OS: er hat keinen eigenen Kernel, startet keine Systemdienste oder dergleichen. Meist steckt im Image ein Mindestmaß an Bibliotheken, Binaries und Konfigurationsdaten, die eine Distro ausmachen... das ist aber eher um dem Anwender ein halbwegs gewohntes Umfeld an die Hand zu geben und kein vollständiges OS. Ein Container ist am Ende nichts anderes als ein isolierter Prozess auf dem Linux Host-Kernel (Unter Windows IMMER auf einer Linux-VM, auch bei WSL2).
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
4.534
Beiträge
46.468
Mitglieder
4.171
Neuestes Mitglied
bendermaier
Zurück
Oben