Laravel und Docker: Die perfekte Entwicklungsumgebung

aktualisiert am 3. Juni 2021, erstellt am 15. April 2018 von Dirk Helbert in Laravel
Laravel und Docker

Als Laravel Entwickler ist man immer darum bemüht eine optimale Entwicklungsumgebung zu haben. Laravel und Docker sind dabei zwei perfekte Partner für schnelle Web Entwicklung. Bisher habe ich VirtualBox oder Laravel Valet benutzt. Doch die beiden Möglichkeiten haben auch erhebliche Nachteile. Nachteile, die ich mit der Nutzung von Docker vermeiden möchte.

Ziel des Artikels ist eine einfache und reproduzierbare Entwicklungsumgebung mit Docker zu erstellen innerhalb von wenigen Minuten. Inspiriert wurde ich von Shane Osbourne und seinem Beitrag auf Medium.

Hol dir jetzt mein kostenloses E-Book
Geben Sie Ihre Email Adresse ein und klicken Sie auf den Knopf "Sofort Zugang erhalten".
Ich stimme zu, dass meine Daten beim Newsletter Provider Mailchimp gespeichert werden. ( Datenschutzerklärung und Datenschutz Mailchimp )
Mit der Anforderung des eBooks meldest du dich zu meinem kostenlosen E-Mail Newsletter mit relevanten Informationen zur Webentwicklung sowie meinen Büchern und Leistungen an.

Update 14.02.2021

Mittlerweile ist die Kombination Laravel und Docker wesentlich einfacher zu installieren. Und zwar mit Laravel Sail. Laravel Sail enthält schon alles, was du zum Entwickeln deiner nächsten Laravel Anwendung benötigst.

Update 01.09.2019

Es sind wieder ein paar Monate seit dem letzten Update ins Land gegangen. Daher ist es wieder Zeit für eine Überarbeitung und Update dieses Tutorials.

Update 25.01.2019

In den letzten Wochen habe ich immer wieder Fragen zu dem Thema bekommen und einige hatten auch Probleme es zum laufen zu kriegen.

Daher will ich mir heute meinen Artikel und die Vorgehensweise selbst anschauen und ggf. den Artikel aktualisieren.

Ich habe in dem Zuge auch gleich noch den Code Highlighter ausgetauscht. Ich denke jetzt sind die Code Zeilen besser zu lesen.

Was ist Docker?

Docker ist eine Container Virtualisierung Software. Dabei werden einzelne Services in einem Container isoliert und unabhängig vom Betriebssystem ausgeführt. Im Vergleich zu einer Virtualisierung mit VirtualBox oder VMWare ist die Virtualisierung mit Docker sehr leichtgewichtig und spart Ressourcen auf dem Host System. Außerdem lassen sich Docker Container sehr schnell wieder von Grund auf neu initialisieren und es können sehr einfach komplette Produktivsysteme simuliert werden.

Warum nicht VirtualBox oder Laravel Valet?

Ich habe vor vielen Jahren mit VirtualBox angefangen und benutze es heute auf der Arbeit immer noch. Privat nutze ich seit einiger Zeit Laravel Valet, welches aber nur für Mac OS möglich ist. Viele Laravel Entwickler nutzen auch Laravel Homestead in Verbindung mit VirtualBox. VirtualBox benutzt mehr Systemressourcen als ein Docker Container. Bei Laravel Valet muss PHP, MySQL usw. auf dem Mac installiert sein und aktuell gehalten werden.

Gerade wenn man auch mal eine andere PHP Version testen will, dann ist eine Virtualisierung mit Docker einfach genial. Mehr über Docker erfährst du auf der What is Docker Seite.

Vorbereitungen

Zuerst solltest du Docker für dein Betriebssystem installieren und zwar am besten die Docker Community Edition. Ich arbeite mit der Docker Version 18.03 und der Docker Compose Version 1.20.1.

docker -v
Docker version 19.03.1, build 74b1e89
docker-compose -v
docker-compose version 1.24.1, build 4667896b

Ok, also Docker und Docker Compose sind jetzt schon in einer aktuelleren Version vorhanden. Das sollte allerdings bei diesem relativ einfachen Projekt auch keine große Rolle spielen.

Anwendung mit Laravel Sail installieren

Mit Laravel Sail ist es wirklich super einfach geworden eine Laravel Docker Entwicklungsumgebung zu installieren. Du brauchst auf deinem PC überhaupt keine zusätzlichen Tools außer Docker und einen Texteditor bzw. IDE.

curl -s https://laravel.build/dockerproject | bash

Die Installation dauert keine 5 Minuten und man braucht auch keine Angst wegen inkompatiblen Abhängigkeiten zu haben.

cd dockerproject && ./vendor/bin/sail up

Jetzt kann die Anwendung mit http://localhost im Browser aufgerufen werden.

Das war es schon. Perfekt.

Laravel Sail Probleme

Probleme gibt es nur, wenn einer der benötigten Ports schon belegt ist. Also wenn schon ein Webserver auf deinem Rechner läuft oder ein anderer Dienst.

Die Dienste von Sail benutzen die Ports 3306 (MySQL), 8025 (Mailhog), 6370 (Redit) und 80 (Webserver).

Falls das bei dir der Fall ist, lies dir die Fehlermeldung durch und schaue welcher Port bereits belegt ist. Falls du zwei Sail Projekte gleichzeitig laufen lassen willst, dann musst du alle Ports anpassen

Im Prinzip kannst du jeden Port einmal hochzählen und schauen ob es dann läuft.

In der .env änderst du die Ports für den Webserver, MySQL und Redis.

APP_PORT=81
FORWARD_DB_PORT=3307
FORWARD_REDIS_PORT=6380

Für Mailhog musst du den Port direkt in der /docker-compose.yml ändern.

mailhog:
    image: "mailhog/mailhog:latest"
    ports:
      - 1026:1025
      - 8026:8025

Danach sollte das Projekt einwandfrei hochfahren. Die Anwendung ist dann allerdings im Browser unter http://localhost:81 erreichbar.

Docker und Laravel Legacy Version

Wenn du Laravel Sail nicht nutzen möchtest, dann kannst du Docker und Laravel auch auf die herkömmliche Art installieren. Es funktioniert auch nur noch mit Laravel 7.x. Wenn du eine neuere Version ausprobieren willst, dann nutze am doch die Version mit Laravel Sail.

Jetzt brauchst du noch ein Projektverzeichnis. Hier liegen dann später die beiden Verzeichnisse für die Docker Konfiguration und das Laravel Projekt. Ich nenne das hier einfach mal dockerprojekt.

mkdir dockerprojekt && cd dockerprojekt 

Jetzt brauchst du noch eine aktuelle Laravel Version. Ich lade sie in dem Beispiel hier mit Curl runter. Du kannst auch einfach die Zip Datei von Github runterladen und dann entpacken. Wichtig ist, dass in dem dockerprojekt Verzeichnis ein laravel Verzeichnis liegt mit den entpackten Laravel Dateien.

curl -L https://github.com/laravel/laravel/archive/refs/heads/7.x.zip | tar xz
mv laravel-7.x laravel 

Laravel und Docker konfigurieren

Docker Konfigurations Verzeichnis anlegen

Hier werden später alle Docker Konfigurationen abgelegt. Ich trenne die Konfiguration immer von dem eigentlichen Projekt. Das ist dann aufgeräumter.

mkdir docker && cd docker 

Docker Compose Konfiguration

Zuerst erstelle ich eine docker-compose.yml Datei und öffne sie mit einem geeigneten Editor. Hier musst du aufpassen, dass keine Tabs in der Konfiguration vorkommen. Sonst gibt es beim Start einen Fehler. Ich benutze für solche Sachen gerne Visual Studio Code (vorher Atom) du kannst aber auch vi, oder jeden anderen Editor benutzen.

code docker-compose.yml

Am Anfang steht immer die Konfigurations Versionsnummer. In dem Fall ist es Version 3 Version 3.7. Es kommt auf die Docker Version an, die du benutzt. Einige Konfigurationseinstellungen können während der Versionssprünge weggefallen sein. Eine Aufstellung der Versionsnummern findest du auf der Docker Seite Compose file versions and upgrading. Wenn du bereits eine aktuelle Version hast, dann kannst du meinem Beispiel einfach weiter folgen ohne Anpassungen vorzunehmen.

In der ersten Zeile steht also version: "3.7". Direkt danach folgen die Services. In unserem Fall sind das app für die Laravel Anwendung, web für den Web Server nginx und database für die MySQL Datenbank.

docker-compose.yml

version: "3.7"
services:
...

app Service

...
  app:
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/www
    volumes:
      - ./../laravel:/var/www
    environment:
      - DB_HOST=database
    depends_on:
      - database
...

In dem app Service wird die eigentliche Laravel Anwendung als Container konfiguriert. Wichtig ist hier dockerfile: app.dockerfile, das wir gleich noch erstellen werden. Unter volumes wird der Pfad von dem lokalen Verzeichnis ./../laravel auf den Docker Container Pfad /var/www gemappt. Zusätzlich wird der Anwendung noch die Datenbank Informationen übergeben.

web Service

...
  web:
    image: nginx:latest
    working_dir: /var/www
    volumes:
      - ./../laravel:/var/www
      - ./vhost.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8080:80"
    depends_on:
      - app
...

Der web Service enthält den Webserver nginx. Die vhost.conf wird als default.conf eingebunden. Der Port 8080 wird dann auf den Port 80 gemappt. Damit lässt sich unsere Anwendung dann später mit 127.0.0.1:8080 aufrufen.

Wenn der Port 8080 bei dir schon belegt ist, dann kannst du ihn hier einfach ändern.

database Service

...
  database:
    image: mysql:5.7
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - "MYSQL_ALLOW_EMPTY_PASSWORD=yes"
      - "MYSQL_DATABASE=laravel"
      - "MYSQL_USER=root"
      - "MYSQL_PASSWORD="
      - "MYSQL_ROOT_PASSWORD="
    ports:
      - "33061:3306"
...

Der letzte Service ist der database Service. image ist hier für das Docker Image und in dem Fall nutzen wir MySQL 5.7. Auch eine spätere Änderung der Version ist schnell möglich. Auch hier mappen wir wieder den Port.

Das Verzeichnis db wird automatisch erstellt. Hier liegen dann die Datenbank Files. Docker Container sind nach jedem Neustart „leer“. Daher müssen persistente Daten außerhalb gespeichert werden in den Volumes.

Hier die gesamte docker-compose.yml:

version: "3.7"
services:
  app:
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/www
    volumes:
      - ./../laravel:/var/www
    environment:
      - DB_HOST=database
    depends_on:
      - database
  web:
    image: nginx:latest
    working_dir: /var/www
    volumes:
      - ./../laravel:/var/www
      - ./vhost.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8080:80"
    depends_on:
      - app
  database:
    image: mysql:5.7
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - "MYSQL_ALLOW_EMPTY_PASSWORD=yes"
      - "MYSQL_DATABASE=laravel"
      - "MYSQL_USER=root"
      - "MYSQL_PASSWORD="
      - "MYSQL_ROOT_PASSWORD="
    ports:
      - "33061:3306"

app Service konfigurieren

Jetzt kommt der app Service. Hier installieren wir PHP, den MySQL Client, Imagick, Composer, Git und Zip. Man kann die RUN Befehle auch zusammenfassen. Ich habe sie hier einzeln aufgeführt, damit es übersichtlicher ist.

code app.dockerfile
FROM php:7.4-fpm
RUN apt-get update \
    && apt-get install -y libzip-dev git mariadb-client libmagickwand-dev --no-install-recommends
RUN docker-php-ext-install pdo_mysql zip \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php composer-setup.php \
    && php -r "unlink('composer-setup.php');" \
    && mv composer.phar /usr/local/bin/composer

Ich habe den folgenden RUN Befehl entfernt:

RUN php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Das hat natürlich einmal funktioniert, als ich den Artikel geschrieben habe. Aber der Hash ändert sich mit jeder Version. Daher lasse ich den Check weg ob die Datei intakt ist oder nicht.

web Service konfigurieren

In meinem Beispiel benutze ich nginx als Webserver. Dieser lässt sich auch als Docker Container sehr einfach konfigurieren.

code vhost.conf
server {
    listen 80;
    index index.php index.html;
    root /var/www/public;
    
    location / {
        try_files $uri /index.php?$args;
    }
    
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
} 

Was hier besonders wichtig ist, ist fastcgi_pass app:9000;

Da Nginx und PHP nicht im gleichen Container laufen, muss hier angegeben werden wo PHP läuft.

Endlich starten

Nachdem jetzt alles konfiguriert ist, können wir unsere Composition starten:

docker-compose up 

Beim allerersten Start dauert das jetzt ein wenig. Es müssen einige Pakete aus dem Internet geladen werden. Das aktuelle Konsolen Fenster bleibt auch geöffnet. Hier erscheinen auch Log Daten der einzelnen Container.

Du kannst die Container später auch mit -d starten. Dann kannst du in der Konsole weiter arbeiten und Docker läuft als daemonized Container.

Ich starte gerne ohne -d, damit ich direkt die Log Ausgabe sehe und ggf. Fehler erkenne. Sobald der Container stabil läuft, starte ich denn auch daemonized.

Mögliche Fehler:

ERROR: for web Cannot start service web: driver failed programming external connectivity on endpoint docker_web_1 (21edf08f68044607be77fc7f96bc4e2fa8972c38154b1954ce8e962fddc0ddf2): Error starting userland proxy: Bind for 0.0.0.0:8080 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.

Wenn dieser Fehler auftritt, dann ist der Port schon in Benutzung. Dann änderst du einfach in der docker-compose.yml im Abschnitt web den Port 8080 auf 8800 oder irgendeinen der frei ist.

Also öffne am besten eine neue Konsole und geht wieder in das dockerprojekt/docker Verzeichnis.

docker-compose exec app mv .env.example .env
docker-compose exec app composer update
docker-compose exec app php artisan key:generate 

docker-compose exec führt auf dem Container app den Befehl mv .env.example .env aus. Das gilt auch für die beiden anderen Befehle. Hier wird die mitgelieferte Laravel Beispiel Konfiguration aktiviert, Composer aktualisiert alle benötigten Pakete und der Key wird generiert.

Mögliche Fehler:

Wenn die docker-compose exec Befehle eine Fehlermeldung zurückgeben, dann hat das meistens damit was zu tun, dass der laravel Ordner nicht korrekt in den Container gelinkt ist.

Daher hier die Verzeichnisstruktur:

dockerproject
  -- docker
    -- app.dockerfile
    -- db
    -- docker-compose.yml
    -- vhost.conf
  -- laravel
    -- ... hier liegt dann das Laravel Projekt
  

Der erste Aufruf im Browser

Du kannst jetzt im Browser http://localhost:8080 (oder den geänderten Port) aufrufen und wooohoooooo. Wir sehen unsere Laravel Installation. Ist das nicht genial einfach?

Die kannst jetzt die Laravel Dateien bearbeiten und sie werden im Container automatisch aktualisiert, weil sie gelinkt sind.

Ein paar Meter extra

Da jetzt alles funktioniert machen wir noch die Probe ob auch die Datenbankverbindung einwandfrei läuft. Das sind die sprichwörtlichen extra Meter bzw. der Zusatzaufwand, wenn man es nüchtern aussprechen will.

Ok, also erweitern wir unsere Laravel Anwendung mal um die Authentifizierung.

docker-compose exec app composer require laravel/ui:2.4
docker-compose exec app php artisan ui bootstrap --auth
docker-compose exec app php artisan migrate 

Mögliche Fehler:

In dem Kommentar von Martin bin ich wieder auf einen Fehler gestossen, den ich vor einiger Zeit schon gesehen habe und wohl nur mit MySql 5.6 auftritt:

Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))

Ich dachte der Fehler wäre längst behoben und spielt keine Rolle mehr. Aber auch ich sehe ihn jetzt während ich meine Vorgehensweise noch mal durchgehe.

Lösung: (nur wenn der Fehler bei dir auftritt

Füge folgenden Code in laravel/app/Providers/AppServiceProvider.php ein

use Illuminate\Support\Facades\Schema; 

...

public function boot() {
    Schema::defaultStringLength(191);
}
use Illuminate\Support\Facades\Schema; 

...

public function boot() {
    Schema::defaultStringLength(191);
}

Wenn du den oben genannten Fehler hattest, dann wurde die Tabelle users schon angelegt. Daher muss die Migration jetzt noch mal frisch (fresh) eingespielt werden.

docker-compose exec app php artisan migrate:fresh

Hier geht es weiter, wenn du den Fehler „Specified key was too long“ nicht hattest.

Danach erstellen wir mit artisan tinker einen neuen Benutzer.
dann tinker

docker-compose exec app php artisan tinker 
$user = new App\User;
$user->name = "Dirk";
$user->email = "info@example.com";
$user->password = bcrypt('123456');
$user->save(); 

Jetzt kannst du einmal die Seite localhost:8080 (oder den gewählten Port) im Browser neu laden. Oben rechts dann auf Login klicken und dich mit den eben erstellten Zugangsdaten einloggen. Wenn du eingeloggt bist, hat alles geklappt. Perfekt.

In der Realität benutzt du natürlich nicht 123456 als Passwort. Jetzt denk nicht: „Ja, das ist mit klar“. Wenn es wirklich allen klar wäre, dann hätte es den Promi Hacker Anfang 2019 nicht gegeben.

Wie du siehst, kann man in sehr kurzer Zeit eine Laravel Entwicklungsumgebung mit Docker erstellen. Vor allem ist diese Umgebung reproduzierbar. Mit ein paar Anpassungen kann man das auch für eine WordPress Entwicklungsumgebung machen. Hier sind keine Grenzen gesetzt. Einfacher geht es kaum.

Wenn dir der Beitrag gefallen hat, dann würde ich mich über einen Kommentar freuen.

Laravel Version : 7.17.2
Letztes Update: 3. Juni 2021

27 Kommentare zu “Laravel und Docker: Die perfekte Entwicklungsumgebung”

  • Hi,

    eine wirklich super Anleitung. Danke dafür.

    Die Auflistung der gesamten docker-compose.yml enthält am Anfang noch „services:“ und am Ende noch „volumes: dbdata:“. Das führt etwas zur Verwirrung, da dies in den einzelnen Abschnitten nicht vorhanden ist. Aber ich will nicht klagen, sondern nur einen Hinweis geben.

    Wie würdest Du ein phpmyadmin nachinstallieren um auf die MySQL Datenbank zugreifen zu können? Hast Du hierfür ein Best Practice Example?

    Für Deine Bemühungen vielen Dank!

    Gruß
    Björn

  • Sorry – Funktioniert nicht! Sobald ich die exec Befehle eingeben möchte kommen Fehler. Die composer befehle gehen so auch nicht – habe ich durch „RUN curl -sS https://getcomposer.org/installer | php — –install-dir=/usr/local/bin –filename=composer“ ersetz, aber langsam verliere ich echt die nerven…

  • Hallo Dirk,

    Ich bin auf Win10 unterwegs und habe Docker for Windows installiert. Ich konnte bisher die Container (Linux-Container) aufrufen, scheitere dann aber an folgendem Befehl:

    docker-compose exec app mv .env.example .env

    Fehlermeldung: mv: cannot stat ‚.env.example‘: No such file or directory

    Ich habe aber noch eine Frage zur Ordnerstruktur. Ich habe diese wie folgt erstellt:

    projectName
    -laravel
    -app.dockerfile
    -docker-compose.yml
    -vhost.conf
    -web.dockerfile

    So habe ich es aus deinem Tutorial heraus gelesen.

    Vielen Dank für das Tutorial!

    Gruß
    Nahne

  • Vielen Dank, bei mir läuft es jetzt einwandfrei.
    Bin auf ein zwei Sachen gestoßen. Deshalb hier für andere ggf. eine Hilfestellung:

    Beim installieren von composer in der app.dockerfile meinte docker der Installer sei corrupt. Habe die Zeile # auskommentiert, dann funktioniert es. Hier muss ich später nochmal tiefer einsteigen.

    Und beim erstellen der User Table meinte Laravel
    „SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))“
    -> das hatte mir geholfen: https://laravel-news.com/laravel-5-4-key-too-long-error

  • Anleitung ist super, danke.
    Hatte folgende Probleme:
    1. „Fatal error: require(): Failed opening required ‚/var/www/html/vendor/autoload.php‘ “
    –> composer update innerhalb des Containers
    2. curl hatte nicht funktioniert, deshalb das Paket per zip-Download hergeholt und entpackt. Danach beim Start:
    „The stream or file „/var/www/storage/logs/laravel-2019-02-03.log“ could not be opened: failed to open stream: Permission denied“ –> chmod auf storage-Ordner mit 777

  • Vielen Dank.
    Habe alles wie angegeben aufgesetzt und die kleineren Hürden gemeistert (Virenscannereinstellungen verändert damit „Shared Drive’s“ mit Docker funktionieren und das mit der Key-Length).
    Läuft prima. Die Docker-Integration in meiner IDE (PhpStorm) gefällt mir auch ganz gut.

  • Vielleicht müßte noch ergänzt werden:

    „`sh
    docker exec -it docker_app_1 bash
    composer install
    php artisan key:generate –show # In .env ablegen
    „`

    Außerdem wäre es nicht schlecht, wenn die Passwörter mit denen im Laravel Repo übereinstimmen würden um das Tutorial zu vereinfachen

  • Danke! Dank Deiner Anleitung konnte ich das echt rasch reproduzieren und habe es auch sofort zum laufen gebracht. man muss sich gewöhne artisan befehle mit docker-compose anzufangen aber das ist ja kein weiteres problem. eine frage noch: ich würde gerne parallel auch mit einem mysql client arbeiten (DB Beaver zum beispiel). was sind die db credentials in diesem fall (host , user , dbname usw.)? danke schon mal

  • Danke fuer den Artikel, dass hat mir einige Dinge klarer gemacht.

    Aber was ich immer noch nicht verstehe ist:

    Mit Laravel Valet kann man doch auch easy verschiedene PHP Versionen installieren ‚valet use php@7.2‘. Mit Homebrew ist es super einfach PHP aktuell zu halten, und extensions kann man einfach mit ‚pecl install xdebug‘ installieren und entfernen.

    Wozu dann Docker benutzen, was komplizierteres setup benoetigt?

    Und wenn ich es richtig verstehe, kann man eine application die man mit Docker entwickelt, auch nicht mit normalem hosting in production stellen?

    z.B auf AWS kann ich nicht EC2 benutzen sondern muss ECS benutzen, richtig?

    Also ich sehe die Vorteile fuer groessere Projekte/Firmen, aber bin mir unsicher ob der Aufwand es wert ist fuer mich persoenlich.

    Ist da irgendwas was ich hier total uebersehe? 😀

  • Hallo, bei mir wirft es in der Konsole bei eingabe von “ docker-compose exec app composer update“ diesen Fehler und ich komme nicht auf die Lösung. Ist da irgentwas was ich übersehen habe?

    [RuntimeException]
    /var/www/vendor does not exist and could not be created.

    Auch wenn ich die Seite (localhost:8080) aufrufe wirft es folgendes Problem:

    Warning: require(/var/www/public/../vendor/autoload.php): failed to open stream: No such file or directory in /var/www/public/index.php on line 24

    Jemand eine Idee?

  • Hallo,

    nach der Installation versuche ich mit php artisan migrate zu die Datenbank zu befüllen, das wird mit einerException beantwortet:
    Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from information_schema.tables where table_schema = default and table_name = migrations and table_type = ‚BASE TABLE‘)
    ….

    Das selbe passiert auch bei Browser-Test mit dusk, weil der ja auch mit den migrate-Dateien arbeitet.

    Die Applikation selber läuft sauber im Browser, heisst, sämtliche Querys aus dem Browser-Kontext werden ausgeführt.

    Hast du da eventuell mal eine Lösung oder einen Ansatz?

    Danke

  • Hallo, danke für den guten Artikel. Tatsächlich ist der Container auf Linux direkt am laufen. Das ist schon sehr geil. Allerdings ist bei mir das Laravel Projekt sehr langsam. Jedenfalls wenn es ein paar SQLs drin enthält. Das Problem scheint aber laut Google bekannt zu sein. Ideen?

  • @Marc
    Wenn man eine Entwicklungsumbegung mit mehreren Projekten hat, die ggf. mit verschiedenen PHP Versionen oder mit verschiedenen MySQL Versionen arbeiten, dann macht es für mich Sinn mit Docker Containern zu arbeiten. Dann kann man jedes Projekt gleichzeitig laufen lassen.
    Sagen wir mal, du hast eine API, die nur auf PHP 5 läuft. Du hast aber eine Website gebaut, die mit mind. PHP 7.4 läuft. Dann könntest Du nicht gleichzeitig testen, ob dein lokales Website Projekt auf deine lokale API zugreifen kann, weil Du ja lokal jeweils nur eine PHP Version laufen lassen kannst.
    In unterschiedlichen Docker Containern, würde das aber klappen.

  • docker-compose up liefert den Fehler
    ERROR: Version in „./docker-compose.yml“ is unsupported.
    Da steht bei mir
    version: „3.8“
    da docker -v
    Docker version 19.03.12, build 48a66213fe
    liefert. Mit 3.7 ist es das gleiche Ergebnis.
    Ich arbeite in Ubuntu 20 in Virtual Box

  • Hatte zunächst beim Aufruf der Seite den Fehler mit vendor/autoload, nach composer update in app sehe ich jetzt eine leere Seite im Browser. Ist das korrekt?
    Einbinden der Authorisierung funktioniert bei mir nicht:
    $ docker-compose exec app php artisan make:auth

    Command „make:auth“ is not defined.

    1. Hi Ingo,

      ja, das Problem ist das veraltete Tutorial. Das war noch für Laravel 5.x gedacht. Ich habe den Part ab „docker-compose exec app composer require laravel/ui“ jetzt aktualisiert und es sollte jetzt auch mit Laravel 7.x laufen. Zumindest hat es bei mir geklappt.

      Danke für den Hinweis.

      Dirk

  • Danke für den Beitrag. Es hat mir für den Start sehr geholfen.
    Was ich vorhabe:
    Ich wollte mit einer Gruppe an der HS eine CI/CD bauen für ein Frontend/Backend-Projekt mit Integrationstest und dafür muss ich in der Pipeline laravel als Container laufen haben

  • Hallo Dirk,
    ich habe heute deinen Beitrag gesehen und finde diesen recht interessant, da ich zuvor noch nie richtig mit docker gearbeitet habe.

    Nun aber zu meinem Problem:
    Nachdem ich deiner Anleitung gefolgt bin und 1:1 alles kopiert habe, geht alles… Schief.

    Ich bekomme für meine Laravel Installation folgende Fehlermeldung:
    Warning: require(/var/www/public/../vendor/autoload.php): failed to open stream: No such file or directory in /var/www/public/index.php on line 34

    Daraufhin habe ich überprüft, woran dies liegt und habe dabei herausgefunden, dass der vendor Ordner komplett fehlt. Also habe ich „composer install“ ausgeführt und bekomme dabei folgende Fehlermeldung:

    [RuntimeException]
    Could not load package ezsystems/ezplatform in http://repo.packagist.org: [UnexpectedValueException] Could not parse version constraint dev-load-varnish-only-when-used as ^2.0@dev: Invalid
    version string „^2.0@dev“
    [UnexpectedValueException]
    Could not parse version constraint dev-load-varnish-only-when-used as ^2.0@dev: Invalid version string „^2.0@dev“

    Kannst du unterstützend helfen? Das wäre super, weil das frustriert mich gerade, weil das Thema Laravel+Docker auf MacOS Neuland für mich ist, wie für Merkel das Internet.

    Gruß
    Joel

    1. Hi Joel,

      ich habe gerade mal das komplette Tutorial durchlaufen. Das hat einwandfrei funktioniert.

      Kann es sein, dass du composer install auf dem Host Rechner ausführst und nicht im Docker Container?

      Schau mal in der Anleitung so ab „Also öffne am besten eine neue Konsole und geht wieder in das dockerprojekt/docker Verzeichnis.“

      Wichtig ist hier, dass die drei docker-compose exec Befehle im Ordner dockerprojekt/docker ausgeführt werden.

      Viele Grüße,
      Dirk

  • Halli hallo,

    ich versuche nun schon seit Tagen Docker aufzusetzen, jedoch scheitere ich immer am selben Punkt (in Docker selbst habe ich es bereits mit WSL2 und ohne versucht).

    Ich komme in der Anleitung bis „Anwendung mit Laravel Sail installieren“, wobei ich den ersten Befehl in dem genannten Kapitel schon nicht mehr ausführen kann mit der Meldung:

    „Docker is not running.“

    Mehrere Neuinstallationen haben leider nicht geholfen, das Problem zu beseitigen :(, weshalb ich es hier nochmal versuche.

    Ich würde mich sehr über mögliche Lösungen freuen.

    Lg,
    Matteo

  • Hallo Dirk,

    ja ich habe die Docker Software installiert und gestartet.

    Die beiden Befehle:
    docker -v
    docker-compose -v

    haben auch jeweils eine aktuelle Version ausgegeben.

    Lg,
    Matteo

  • Hallo Dirk,

    ja ich habe Docker installiert und kann die Beiden Versions-Befehle:

    docker -v
    docker-compose -v

    erfolgreich ausführen. Ich habe Docker nun erneut neu installiert und nun erhalte ich die Fehlermeldung:

    „C:\Users\Matteo>curl -s https://laravel.build/dockerproject | bash
    F³r das Windows-Subsystem f³r Linux wurden keine Distributionen installiert.
    Distributionen zur Installation finden Sie im Microsoft Store:
    https://aka.ms/wslstore
    Anmerkung: erste Zeile ist meine Eingabe.

    Ich weiß wirklich nicht mehr, wie ich das Problem gelöst bekomme.

    Nachdem ich das, vermutlich durch Docker, installierte Ubuntu gestartet und Benutzername sowie Passwort eingegeben habe, führt der curl Befehl zu einem geleerten Eingabefenster mit einer leeren ersten Zeile.

    Ich weiß wirklich nicht mehr weiter – sieht so aus, als müsste ich mich von Docker verabschieden :(.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert