Laravel in Docker betreiben: eigenes Dockerfile erstellen

Nachdem die meisten Laravel-Docker-Container entweder mittels des PHP-eigenen Webserver betrieben werden und Laradock nicht so ganz zu meiner Nextcloud-Docker-Umgebung gepasst hatte, hab ich mir den Applikationscontainer selbst gebaut. Mit ein Grund war die Anforderung Python in das Paket zu integrieren.

Docker Basics

Docker ermöglicht es, Services oder Applikationen per Befehl in einem sogenannten Container zu starten.
Ein Container ist eine vom Betriebssystem (OS) unabhängige isolierte Umgebung:
Beim ersten Start eines Containers, lädt Docker selbstständig alle notwendigen Quellen
aus dem Internet.
Docker kann unter Windows, macOS oder einer Linux-Distribution installiert werden,
siehe auch: Docker

Ein Dockerfile ist ein Textdokument mit Befehlen, die auch in der Kommandozeile aufgerufen werden könnten, um ein Image zusammenzustellen.
Mit Docker Build können Benutzer einen automatischen Build erstellen, der mehrere Befehlszeilenanweisungen nacheinander ausführt.

Beispiel Webserver

sudo gedit ./docker/laravel/Dockerfile

[+]
FROM php:7.4-fpm
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    mariadb-client \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl \
    gnupg \
    python \
    supervisor \
    libzip-dev 
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl bcmath gd
#RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
#RUN docker-php-ext-install gd
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# NPM
RUN curl -sL https://deb.nodesource.com/setup_11.x  | bash -
RUN apt-get -y install nodejs
RUN npm install
#Supervisor
RUN touch /var/run/supervisor.sock
RUN chmod 777 /var/run/supervisor.sock 
RUN service supervisor start
# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
sudo docker build -t laravelapp.dockerfile /docker/laravel

nginx.conf

[+]
user www-data;

events {
 worker_connections 2048;
}

http {
 upstream backend {
 server laravelapp:9000;
 }
 include /etc/nginx/mime.types;
 default_type application/octet-stream;

server {
 listen 80;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
 index index.php index.html;
 error_log /var/log/nginx/error.log;
 access_log /var/log/nginx/access.log;
 root /var/www/public;
 location ~ \.php$ {
 try_files $uri =404;
 fastcgi_split_path_info ^(.+\.php)(/.+)$;
 fastcgi_pass laravelapp:9000;
 fastcgi_index index.php;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param PATH_INFO $fastcgi_path_info;
 }
 location /codemirror {
 auth_basic “Codemirror”;
 auth_basic_user_file /var/www/.htpasswd; 
 }

 location / {
 try_files $uri $uri/ /index.php?$query_string;
 gzip_static on;
 }
}
}

in der nginx-Konfig habe ich zusätzlich einen Passwortschutz auf den Ordner /codemirror gesetzt. Das Passwort dafür kann mit folgendem Befehl erzeugt werden: htpasswd -c /var/www/.htpasswd admin

Supervisor NPM File: /docker/laravel/supervisor.conf.d/laravel_npm.conf

[program:laravel-npm]
directory=/var/www
process_name=%(program_name)s_%(process_num)02d
command=npm run watch
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/storage/logs/npm.log

Hier die zusätzlichen Container in der docker-compose.yml Datei:

[+]
laravelapp:
 image: laravelapp.dockerfile
 container_name: laravelapp
 links:
 - laraveldb
 volumes:
 - ./laravel/www:/var/www
 depends_on:
 - "proxy"
 networks:
 - proxy-tier
 restart: always 

laravelweb:
 image: nginx
 container_name: laraveldev_webserver
 links:
 - laravelapp
 volumes_from:
 - laravelapp
 volumes:
 - ./laravel/nginx.conf:/etc/nginx/nginx.conf:ro
 environment:
 - VIRTUAL_HOST=laravel.domain.net
 - VIRTUAL_NETWORK=nginx-proxy
 - LETSENCRYPT_HOST=laravel.domain.net
 - LETSENCRYPT_EMAIL=mail@mail.mail
 networks:
 - proxy-tier
 restart: always

 laraveldb:
 image: mariadb
 container_name: laraveldb
 volumes:
 - ./laravel/devdb:/var/lib/mysql
 environment:
 - MYSQL_ROOT_PASSWORD=???
 - MYSQL_DATABASE=dev
 - MYSQL_

Den Inhalt habe ich einfach in das Nextcloud-Docker-File hinzugefügt, somit wird zusätzlich zur Nextcloud-Seite auch ein Zertifikat für Laravel ausgestellt, mittels phpmyadmin kann ich mich aus dem internen LAN auf die Datenbank verbinden.

Hier die Basis-Konfig:  Docker Nextcloud ssl - letsencrypt https 

Container neu erstellen

docker-compose build --no-cache

in den Container verbinden:

sudo docker exec -u 0 -i -t laravelapp /bin/bash

TaskScheduler vom Host:

* * * * * * docker exec -i laravelapp php /var/www/artisan schedule:run >> /dev/null 2>&1

Composer Memory Limit

im Container:

echo 'memory_limit = 4G' >> /usr/local/etc/php/conf.d/docker-php-memlimit.ini;
positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE fĂĽr deine Bewertung!

Aktualisiert: 26.12.2022 von Bernhard |đź”” | Kommentare:0

➨ Docker Swarm, Portainer und Traefik kombiniert | ➦ Docker | Laradock als Laravel Entwicklungsumgebung ➨

Top-Artikel in diesem Bereich


Docker Daten speichern: Docker Volumes vs. Host-Ordner

Ich betreibe eine handvoll Docker Container auf einem einzelnen Linux-Host. Docker-Container werden bei einem erneuten erstellen oder beim Austausch auf eine neuere Imageversion bekanntlich ausgetauscht und verlieren dabei alle geänderten Daten. Um bestimmte Ordner eines Containers permanent zu speichern, müssen diese über Volumes oder Bind-Mounts ausgelagert werden. Ich habe dazu meist bestimmte Pfade der Container in definierten Ordnern am Host verbunden (Bind-Mounts). Mit ein Grund für die Ve...


Docker Container GUI grafische Weboberfläche mit Portainer

Ursprünglich habe ich Docker rein über die Kommandozeile verwaltet, was mit ein paar simplen Befehlen schon sehr einfach ist. Noch mehr Übersicht und eine komfortable Admin-Oberfläche liefert Portainer. Portainer selbst kann auch als Docker-Container gestartet werden und macht das Verwalten von Containern zum Kinderspiel.


Docker Swarm, Portainer und Traefik kombiniert

Wie bereits mehrfach auf dieser Seite erwähnt, verwende ich für den Zugriff auf meine Docker-Container primär den Reverse-Proxy Traefik. Um die Container in einer grafischen GUI verwalten zu können, habe ich zusätzlich Portainer im Einsatz. Für einen Single-Server passt das Setup so weit, wer aber mehrere Server einsetzen will, kann dazu Docker-Swarm verwenden. Ich habe dazu zunächst Portainer in Kombination mit Swarm getestet und das Setup um Traefik inklusive...

Fragen / Kommentare


Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details