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.
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;

{{percentage}} % positiv
