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
