umschuelerths
Goto Top

Docker Container mit Apache, PHP, MySQL u. GitLab Actions einrichten

Guten Morgen zusammen,

ich habe vor ein paar Tagen über die Arbeit Docker kennengelernt. Da ich direkt die Funktionalität dahinter sehr interessant fand, wie die Handhabung von Dateien etc. stattfindet, wollte ich mir das auch für Privat mal anschauen und einrichten.

So, jetzt der Kniff (zumindest noch aktuell in meinen Augen);
Ich habe mich gestern zumeist damit befasst, einen Container zu erstellen, welcher mir als Grundlage einen Webserver (Apache), für die Programmierung PHP, zum erstellen & verwalten von integrierten Daten MySQL & zum abrunden des ganzen möchte ich noch GitLab nutzen können.

Bei der Arbeit wurde das alles mit einem Shopware Image bereitgestellt. Hatte man die Repo geclont und alles richtig konfiguriert, war die Website aus dem GitLab dann Local eingerichtet und über Localhost erreichbar. Und genau das ist mein Ziel.

Ich habe mir eine docker-compose.yml gebastelt, welche aktuell so aussieht;

services: 
  web: 
    image: php:7.4-apache
    volume: ...
    ......
  git:
    image: gitlab/gitlab-ce:latest
    volume: ...
    ......
  mysql: 
    image: mysql:latest
    volume: ...
    ......

Das funktioniert auch super, nur nach aktueller Lage ist es so, dass die Git Actions natürlich nicht im Web Container abrufbar sind, bedeutet ich kann zwar meine GitLab Repo in das Git Volume Clonen, aber dann die Seite nicht über Localhost abrufbar, weil logisch, sie liegt ja nicht auf dem Apache.

Also frage ich mich, wie kann ich die beiden kombinieren ? Muss ich mir dafür ein eigenes Image erstellen ?

Ich hoffe ich habe alles gut genug erklärt und ihr versteht mein Problem.

Beste Grüße & noch einen schönen Sonntag
Kevin

Content-ID: 1479097524

Url: https://administrator.de/contentid/1479097524

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

148848
148848 07.11.2021 um 10:23:19 Uhr
Goto Top
Hallo,

ich glaube du hast das Konzept von Docker noch nicht so ganz verstanden. Ein Container ist ein Endzustand und sollte sich nach dem Erstellen nicht mehr verändern. D.h. wenn du Änderungen an deiner Software vornehmen möchtest, musst du einen neuen Container bauen. Die Bauanleitung (Dockerfile) sollte mit jeder Änderung versioniert werden.

Hier kannst du dich ausführlich darüber informieren:
https://docs.docker.com/get-started/overview/

MfG
UmschuelerThs
UmschuelerThs 07.11.2021 um 10:29:57 Uhr
Goto Top
Zitat von @148848:

Hallo,

ich glaube du hast das Konzept von Docker noch nicht so ganz verstanden. Ein Container ist ein Endzustand und sollte sich nach dem Erstellen nicht mehr verändern. D.h. wenn du Änderungen an deiner Software vornehmen möchtest, musst du einen neuen Container bauen. Die Bauanleitung (Dockerfile) sollte mit jeder Änderung versioniert werden.

Hier kannst du dich ausführlich darüber informieren:
https://docs.docker.com/get-started/overview/

MfG

Vielen dank für deine Antwort.
Inwiefern möchte ich den Container denn noch verändern? Davon schreibe ich doch gar nichts. Ich benötige nur eine Grundlage, um den Container als Lokale Webanwendung, mit weiteren Diensten, nutzen zu können.

Ich weiß, dass Docker zum Isolieren von Dateien dient.
148848
148848 07.11.2021 aktualisiert um 10:49:34 Uhr
Goto Top
Inwiefern möchte ich den Container denn noch verändern? Davon schreibe ich doch gar nichts.

Naja, du möchtest doch die Software im Web Container weiterentwickeln? Die ändert sich dann face-smile
Für die lokale Entwicklung ist das auch erstmals in Ordnung.

Das funktioniert auch super, nur nach aktueller Lage ist es so, dass die Git Actions natürlich nicht im Web Container abrufbar sind, bedeutet ich kann zwar meine GitLab Repo in das Git Volume Clonen, aber dann die Seite nicht über Localhost abrufbar, weil logisch, sie liegt ja nicht auf dem Apache.

Von welchen Git "Actions" sprichst du denn? Meinst du die Git Befehle wie git clone usw.?
Ebenso das gleiche für das Git Volume. Meinst du damit nicht eher das Docker Volume?

aber dann die Seite nicht über Localhost abrufbar, weil logisch, sie liegt ja nicht auf dem Apache.

Wenn der Source Code im Web Container liegt (d.h. entweder in diesem Docker Volume von dem Web Container oder direkt im Filesystem des Containers), die Apache Konfiguration passt und der Container einen Exposed Port hat, dann solltest du die Anwendung auch erreichen können.

Am besten postest du uns mal die Konfiguration. Damit können wir dir schon eher schneller und zielgerichteter helfen.
UmschuelerThs
UmschuelerThs 07.11.2021 um 11:08:13 Uhr
Goto Top
Zitat von @148848:

Naja, du möchtest doch die Software im Web Container weiterentwickeln? Die ändert sich dann face-smile


Naja, ansich schon, aber damit ändere ich doch nur den Zuständ der Daten innerhalb des Containers ? Die Konfiguration und der Aufbau bleibt gleich.


Zitat von @148848:

Von welchen Git "Actions" sprichst du denn? Meinst du die Git Befehle wie git clone usw.?
Ebenso das gleiche für das Git Volume. Meinst du damit nicht eher das Docker Volume?


Ja genau, git init,clone,checkout ... & ja ich habe es Git Volume genannt, weil ich den Container vom Git so genannt habe, natürlich meine ich das Docker Volume.

Zitat von @148848:

Wenn der Source Code im Web Container liegt (d.h. entweder in diesem Docker Volume von dem Web Container oder direkt im Filesystem des Containers), die Apache Konfiguration passt und der Container einen Exposed Port hat, dann solltest du die Anwendung auch erreichen können.

Am besten postest du uns mal die Konfiguration. Damit können wir dir schon eher schneller und zielgerichteter helfen.

Alles klar, aktuell sieht sie so aus:

version: '3.3'  
services: 
  web: 
    image: php:7.4-apache
    container_name: Website
    domainname: uw.local
    volumes: 
      - ./php:/var/www/html
      - ~/Documents/Containers//ssh:/var/www/.ssh
    networks:
    - web
    ports:
      # Web
      - "80:80"  
      # SSH
      - "22:22"  
      # Admin Watcher Port
      - "8888:8888"  
      # Storefront Watcher Port
      - "7777:9999"  
  git:
    image: gitlab/gitlab-ce:latest
    container_name: Git
    volumes:
      - ~/storage/gitlab/config:/etc/gitlab \
      - ~/storage/gitlab/log:/var/log/gitlab \
      - ~/storage/gitlab/data:/var/opt/gitlab \
    ports:
      # Web
      - "80:80"  
      # SSH
      - "22:22"  
      # Admin Watcher Port
      - "8888:8888"  
      # Storefront Watcher Port
      - "7777:9999"  
  mysql: 
    image: mysql:latest
    container_name: Datenwilli
    restart: always
    environment:
      MYSQL_DATABASE: 'db'  
      MYSQL_ROOT_PASSWORD: '1234'  
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '3306:3306'  
    expose:
      # Opens port 3306 on the container
      - '3306'  
      # Where our data will be persisted
    volumes:
      - db:/var/lib/mysql
volumes:
  db:
    driver: local

networks:
  web:
    external: false
aqui
aqui 07.11.2021 um 11:24:29 Uhr
Goto Top
Ich weiß, dass Docker zum Isolieren von Dateien dient.
Ist ja auch mal eine ganz interessante und sehr individuelle Interpretation was Docker ist und was nicht ! face-wink
148848
148848 07.11.2021 aktualisiert um 11:51:58 Uhr
Goto Top
Naja, ansich schon, aber damit ändere ich doch nur den Zuständ der Daten innerhalb des Containers ? Die Konfiguration und der Aufbau bleibt gleich.

Du musst zwischen Systemdaten und Nutzdaten unterscheiden. Einer der Ziele von Docker ist eben diese strikte Trennung zwischen diesen Daten. Zu den Systemdaten gehöhren neben Dienste wie Apache oder MySQL eben auch deine PHP Anwendung.

Nur die relevanten Nutzdaten sollen gespeichert werden. Außerdem, und das ist deutlich entscheidender, der Zustand des Containers ist immer gleich. Egal in welcher Stage der Container deployt wird. Wenn du beispielsweise nach der Entwicklung deinen Container zum Reviewer schickst, dann erhält er den gleichen Zustand. Es können sich keine Fehler unabsichtlich mehr einschläußen z.B. aufgrund eines falschen Toolstacks beim Reviewer.

Ja genau, git init,clone,checkout ... & ja ich habe es Git Volume genannt, weil ich den Container vom Git so genannt habe, natürlich meine ich das Docker Volume.

Ah okay. Ja klar funktioniert das nicht, weil im Web Container kein Git installiert ist.

Alles klar, aktuell sieht sie so aus:

Was mir schon mal auffällt, dass du zwei mal den Port 80 für 127.0.01 vergeben hast. (Web und Git). Das kann natürlich nicht funktionieren. Entweder du änderst für einen der Dienste den Port, du erstellst einen zusätzlichen Container der als Reverse Proxy fungiert und anhand von DNS Namen das Routing übernimmt oder du erstellst bei deinem Rechner eine weitere virtuelle IP und mappst den zweiten 80 Port an diese.

Edit: Warum eigentlich SSH beim Web Container? Da sollte ohnehin kein SSH Dienst laufen. Nochmals: ein Docker Container sollte man nicht wie eine VM benutzen!
UmschuelerThs
UmschuelerThs 07.11.2021 um 12:20:54 Uhr
Goto Top
Zitat von @148848:

Was mir schon mal auffällt, dass du zwei mal den Port 80 für 127.0.01 vergeben hast. (Web und Git). Das kann natürlich nicht funktionieren. Entweder du änderst für einen der Dienste den Port, du erstellst einen zusätzlichen Container der als Reverse Proxy fungiert und anhand von DNS Namen das Routing übernimmt oder du erstellst bei deinem Rechner eine weitere virtuelle IP und mappst den zweiten 80 Port an diese.

Okay, das klingt so, als ob es dann nicht möglich ist GIT & Web in einem zu Container integrieren ?


Edit: Warum eigentlich SSH beim Web Container? Da sollte ohnehin kein SSH Dienst laufen. Nochmals: ein Docker Container sollte man nicht wie eine VM benutzen!

Das mit den gleichen Ports war nicht gewollt, hatte ich kopiert und noch nicht abgeändert.
Und das SSH war auch nicht für den Web gedacht, sondern für den GIT, ist also dort auch falsch platziert.
148848
Lösung 148848 07.11.2021 aktualisiert um 12:44:21 Uhr
Goto Top
Okay, das klingt so, als ob es dann nicht möglich ist GIT & Web in einem zu Container integrieren ?

Du willst Gitlab und Web in einem Container haben? Theoretisch ginge das schon, ist aber vollkommender murks!
Ein Container = Ein Dienst!

Wenn ich das richtig verstehe, dann möchtest du beim Erstellen eines Images, dass von dem Git Repository der aktuelle Zustand (Master) geklont wird. Wenn du von dem Image ein Container erstellst, dann hast du ein Container mit Apache, PHP und deiner Software.

Also wie gesagt, da wirst du dein eigenes Image erstellen müssen. Keine Sorge, dass ist sehr leicht.
Hier mal ein kleines Beispiel:

FROM php:7.2-apache
RUN apt update && apt install -y git
    && cd /var/www/html/
    && git clone ssh://user@localhost/path/to/myapp.git 

Wie ich dir schon anfangs empfohlen habe, solltest du dich erstmals mit Docker beschäftigen.
Hier gibt es auch ein schönes Tutorial: https://docs.docker.com/get-started/
UmschuelerThs
UmschuelerThs 07.11.2021 um 12:45:58 Uhr
Goto Top
Zitat von @148848:

Du willst Gitlab und Web in einem Container haben? Theoretisch ginge das schon, ist aber vollkommender murks!
Ein Container = Ein Dienst!

Danke dir für deine ganzen Tipps. Ich verstehe, aber wie wird das denn dann z.B. bei dem Shopware Image gemacht ? Oder generell, dort wird ja auch nur ein Volume erstellt bzw. noch ein weiteres für die Datenbank. Dort ist das alles (Web, PHP, GitLab) inbegriffen.
148848
148848 07.11.2021 aktualisiert um 13:12:03 Uhr
Goto Top
Ich verstehe, aber wie wird das denn dann z.B. bei dem Shopware Image gemacht ?

Beziehst du dich dabei auf dieses Image (https://hub.docker.com/r/shyim/shopware#!) ?

Beim dem oben genannten Image sind die Dienste doch getrennt. Einmal die Anwendung und einmal die Datenbank.
Gitlab ist da definitiv nicht drin! Höchstens Git als Tool.

Grundsätzlich muss jeder für sich selbst bestimmen wie stark die Trennung der Dienste sein soll. Man muss nicht den Konzepten von Docker folgen. Allerdings wer das macht, der braucht Docker eigentlich nicht bzw. da ist Docker nur überflüssig und stellt zusätzlich ein großes Hindernis mit vielen Nachteilen dar.

Man sollte grundsätzlich schauen, dass man die Container so klein wie möglich hält. Je größer der Container wird, desto länger dauert die Skalierung und desto mehr Fehler können sich einschleichen. Auch das Troubleshooting wird deutlich erschwert. Außerdem ist eine Überwachung nur noch eingeschränkt möglich, wenn mehrere Dienste im Container laufen. Wenn also im Container der Apache also auch MySQL laufen, wie soll dann Docker erkennen können, wenn einer der Dienste ausfällt?
UmschuelerThs
UmschuelerThs 07.11.2021 um 14:45:27 Uhr
Goto Top
Zitat von @148848:

Beziehst du dich dabei auf dieses Image (https://hub.docker.com/r/shyim/shopware#!) ?


services:   
    shopware:
      image: dockware/essentials

Sagt dir das was ? Gibts eine Möglichkeit ein Git Tool mit zu initialisieren ?

Grundsätzlich muss jeder für sich selbst bestimmen wie stark die Trennung der Dienste sein soll. Man muss nicht den Konzepten von Docker folgen. Allerdings wer das macht, der braucht Docker eigentlich nicht bzw. da ist Docker nur überflüssig und stellt zusätzlich ein großes Hindernis mit vielen Nachteilen dar.

Man sollte grundsätzlich schauen, dass man die Container so klein wie möglich hält. Je größer der Container wird, desto länger dauert die Skalierung und desto mehr Fehler können sich einschleichen. Auch das Troubleshooting wird deutlich erschwert. Außerdem ist eine Überwachung nur noch eingeschränkt möglich, wenn mehrere Dienste im Container laufen. Wenn also im Container der Apache also auch MySQL laufen, wie soll dann Docker erkennen können, wenn einer der Dienste ausfällt?

Ja das macht alles Sinn, vielen Dank.
148848
148848 08.11.2021 aktualisiert um 17:13:22 Uhr
Goto Top
Sagt dir das was ? Gibts eine Möglichkeit ein Git Tool mit zu initialisieren ?

Ja, indem du einfach dein eigenes Image erstellst.

Du kannst dir das so vorstellen. Du willst ein Kuchen backen. Dazu brauchst du eine Rezeptur. Wenn du dich exakt an die Rezeptur hältst, so erhältst du exakt den selben Kuchen. So eine Rezeptur fällt ja nicht einfach so vom Himmel. Die muss erstmals ein Bäcker geschrieben haben.

In Docker ist das exakt gleich. Der Kuchen ist der Docker Container. Die Rezeptur ist das Image. Und die Rezeptur wird mithilfe des Dockerfiles definiert. Eine Änderung ist somit nur beim Dockerfile möglich.

Ich hoffe das macht die ganze Sache etwas verständlicher. Aber wie gesagt. Mein Rat, wenn du dich wirklich mit Docker beschäftigen möchtest, dann schau dir die offizielle Doku und das Tutorial an. Falls dir die englische Sprache nicht liegen sollte, so gibt es mittlerweile recht gute, deutschsprachige Bücher z.B. vom Rheinwerk-Verlag.