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.
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.
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
Top Tutorial, macht es wirklich einfach schnell eine Entwicklungsumgebung für Laravel aufzusetzen.
Wer Probleme bei Step 2/16 : RUN apt-get update hat, habe bei Stackoverflow die Lösung gefunden: https://superuser.com/questions/1423486/issue-with-fetching-http-deb-debian-org-debian-dists-jessie-updates-inrelease
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.
Hammer!
Danke vielmals. Funktioniert bei mir einwandfrei mit kleineren Anpassungen.
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
I got docker-compose up working by using just
version: „3“
in docker-compose.yml
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.
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
Moin. Danke für deinen Kommentar. Schön, dass ich dir helfen konnte. 🙂
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
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 Matteo,
läuft der Docker Desktop denn? Also hast du die Docker Software installier?
https://www.docker.com/get-started
Viele Grüße
Dirk
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 :(.