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!

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

Fragen / Kommentare


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