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 passte, 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, Applikationen per Befehl in einem sogenannten Container zu starten.
Ein Container ist eine vom Betriebssystem (OS) unabhängige isolierte Umgebung:
Das OS spielt also keine Rolle, vorausgesetzt Docker lässt sich installieren.
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

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_USER=dev
- MYSQL_PASSWORD=???
networks:
- proxy-tier
restart: always

phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
links:
- laraveldb
environment:
PMA_HOST: laraveldb
ports:
- '8081:80'
restart: always
networks:
- proxy-tier

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 

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!



Fragen / Kommentare


Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Außerdem geben wir Informationen zu Ihrer Nutzung unserer Website an unsere Partner für soziale Medien, Werbung und Analysen weiter. Details anzeigen.