Modernes und schlankes Docker-Image auf Basis von PHP 8.5/8.6 + Apache für moderne PHP-Webanwendungen.
Das Image stellt eine vorkonfigurierte PHP-/Apache-Umgebung mit den benötigten PHP-Erweiterungen, Apache-Modulen, PHP-Limits und Sicherheitsoptimierungen bereit.
GeoIP-Datenbanken und die geoip2.phar werden nicht fest in das Docker-Image eingebaut. Sie können beim Containerstart automatisch über das entrypoint.sh aktualisiert werden.
🐘 PHP 8.5/8.6
🌐 Apache 2
🗄️ PDO MySQL
🔤 mbstring
📦 zip
🌍 GeoIP-Unterstützung
🔄 Automatische GeoIP-Aktualisierung
🌐 GeoLite2 ASN
🌐 GeoLite2 City
🌐 GeoLite2 Country
📦 Aktuelle MaxMind geoip2.phar
🔄 Apache mod_rewrite
🔐 Apache mod_headers
🌐 Apache mod_remoteip für korrekte Client-IP hinter Reverse Proxy
🛡️ Apache Security Hardening
ServerTokens ProdServerSignature OffTraceEnable Off💾 128 MB Upload-/POST-Limit
🧠 512 MB PHP Memory Limit
⏱️ 300 Sekunden Execution- und Input-Time
🔧 Optionaler automatischer Composer-Autoloader
🔧 Optionales Korrigieren der Datei-/Verzeichnisrechte
🚀 Eigenes Entrypoint-Script für die Containerinitialisierung
FROM php:8.5.11-apache
FROM php:8.6.0RC2-apache
Zusätzlich zum PHP-Basisimage werden folgende Erweiterungen installiert:
mbstring
pdo_mysql
zip
Weitere Funktionen wie curl, dom, SimpleXML, fileinfo, session und openssl werden vom verwendeten PHP-Image bereitgestellt.
Aktivierte Apache-Module:
maxminddb
rewrite
headers
remoteip
Zusätzlich werden beim Containerstart weitere benötigte Module aktiviert:
env
setenvif
Das Image ist damit besonders für PHP-Anwendungen hinter einem Reverse Proxy wie Nginx Proxy Manager geeignet.
Das Image verwendet:
ServerTokens Prod
ServerSignature Off
TraceEnable Off
Dadurch werden unnötige Informationen über die Apache-Installation nach außen reduziert.
Das Image verwendet folgende PHP-Einstellungen:
upload_max_filesize=128M
post_max_size=128M
memory_limit=512M
max_execution_time=300
max_input_time=300
Weitere Anpassungen können in einer eigenen php.ini vorgenommen werden.
volumes:
- ./custom_php.ini:/usr/local/etc/php/php.ini:ro
Um die echte Client-IP von einem Reverse Proxy weiterzuleiten, binden Sie Ihre remoteip.conf ein:
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 172.18.0.0/16 <-- Webspace Network
RemoteIPTrustedProxy 172.19.0.0/24 <-- Reverse Proxy Network
volumes:
- ./remoteip.conf:/etc/apache2/conf-enabled/remoteip.conf:ro
Edit Proxy Host -> Advanced -> Custom Nginx Configuration:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
Das Image erstellt das Verzeichnis:
/usr/share/GeoIP
Die GeoIP-Dateien werden nicht in das Docker-Image eingebaut.
Bei aktivierter Umgebungsvariable:
GEOIP_UPDATE: "1"
lädt das entrypoint.sh beim Containerstart folgende Dateien herunter:
/usr/share/GeoIP/
├── GeoLite2-ASN.mmdb
├── GeoLite2-City.mmdb
├── GeoLite2-Country.mmdb
└── geoip2.phar
GeoLite2:
https://github.com/P3TERX/GeoLite.mmdb
GeoIP2 PHP:
https://github.com/maxmind/GeoIP2-php
Die Dateien werden zunächst als temporäre Dateien heruntergeladen und anschließend atomar ersetzt. Dadurch bleibt eine bereits vorhandene funktionierende Datei erhalten, falls ein Download fehlschlägt.
Für eine dauerhafte Speicherung der GeoIP-Dateien kann ein Docker Volume verwendet werden:
volumes:
- geoip:/usr/share/GeoIP
Dadurch müssen die GeoIP-Dateien bei einem Container-Neustart oder Recreate nicht unnötig erneut heruntergeladen werden.
Das entrypoint.sh übernimmt beim Containerstart unter anderem:
| Variable | Standard | Funktion |
|---|---|---|
GEOIP_UPDATE | 0 | Aktualisiert GeoIP-Datenbanken und geoip2.phar |
FIX_PERMISSIONS | 0 | Korrigiert Rechte unter /var/www/html |
COMPOSER_AUTOLOAD | 0 | Führt composer dump-autoload aus |
Beispiel:
environment:
GEOIP_UPDATE: "1"
FIX_PERMISSIONS: "0"
COMPOSER_AUTOLOAD: "0"
docker-compose.yml:version: "3.9"
networks:
webserver: # Gemeinsames Netzwerk definieren
driver: bridge
services:
mariadb:
image: mariadb:latest
container_name: webserver_mariadb
environment:
MYSQL_ROOT_PASSWORD: <SicheresPasswort>
MYSQL_DATABASE: root
MYSQL_USER: user
MYSQL_PASSWORD: <SicheresPasswort>
ports:
- "6033:3306"
volumes:
- ./mariadb-phpmyadmin/data:/var/lib/mysql
restart: always
networks:
webserver: # Dienst in das gemeinsame Netzwerk einbinden
aliases:
- mariadb
phpmyadmin:
image: phpmyadmin:latest
container_name: webserver_phpmyadmin
links:
- mariadb
environment:
PMA_HOST: mariadb
PMA_PORT: 3306
ports:
- "9000:80"
restart: always
networks:
webserver: # Dienst in das gemeinsame Netzwerk einbinden
aliases:
- phpmyadmin
web:
image: chrno79/php-gb:latest # <latest = 8.5 / dev = 8.6>
links:
- mariadb
environment:
TZ: Europe/Berlin
GEOIP_UPDATE: "1"
FIX_PERMISSIONS: "0"
COMPOSER_AUTOLOAD: "0"
ports:
- "8080:80"
volumes:
- ./html:/var/www/html
- ./geoip:/usr/share/GeoIP
- ./remoteip.conf:/etc/apache2/conf-enabled/remoteip.conf:ro
- ./custom_php.ini:/usr/local/etc/php/php.ini:ro
- ./hosts:/etc/hosts:ro
restart: always
networks:
webserver: # Chat in das gemeinsame Netzwerk einbinden
Das Image enthält bewusst nur die Komponenten, die zur PHP-/Apache-Laufzeitumgebung gehören.
Anwendungsdaten, Datenbanken und aktualisierbare GeoIP-Daten werden getrennt vom eigentlichen Image verwaltet.
Dadurch bleiben die Images reproduzierbar, übersichtlich und leichter aktualisierbar.
Content type
Image
Digest
sha256:3e745841d…
Size
193.4 MB
Last updated
4 days ago
docker pull chrno79/php-gb