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
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;
{{percentage}} % positiv