Een geoptimaliseerde PHP-FPM 8.5 Docker image speciaal voor WordPress, met APCu, OPcache, en automatische gebruikersrechten.
- PHP 8.5 FPM - Gebaseerd op Debian 13 (Trixie)
- Geoptimaliseerd voor WordPress - Specifieke PHP settings voor verbeterde performance
- APCu voor Object Cache - Met igbinary serializer voor snellere caching
- OPcache - Met file cache voor betere performance na start
- Automatische gebruikersrechten - Draait met dezelfde PUID/PGID als de host
- Per-site configuratie - Elke WordPress installatie kan eigen resources krijgen
- MSMTP ingebouwd - Mail verzenden via host SMTP
- Beveiligd - Gevaarlijke PHP functies uitgeschakeld
- Multi-site ready - Werkt met WordPress Multisite installaties
| Tag | Beschrijving | Wanneer gebruiken |
|---|---|---|
| latest | Meest recente stable versie | Productie omgevingen |
| v1.0.0 | Semantische version tags | Specifieke versie vastzetten |
| main-abc1234 | Commit SHA tag | Debugging / testen |
- Docker 20.10+ en Docker Compose 2.0+
- Een bestaand Docker netwerk: phpnet met subnet 172.50.0.0/24
- Toegang tot GitHub Container Registry (ghcr.io)
docker network create --subnet=172.50.0.0/24 phpnet
services:
php:
image: ghcr.io/hansvaneijsden/php-wordpress-base:latest
container_name: ${CONTAINER_NAME}
restart: unless-stopped
user: root
environment:
# Gebruiker instellingen (verplicht!)
- PUID=${PUID}
- PGID=${PGID}
- USERNAME=${USERNAME}
# PHP instellingen
- TIMEZONE=${TIMEZONE:-Europe/Amsterdam}
- PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-256M}
- PHP_UPLOAD_MAX_FILESIZE=${PHP_UPLOAD_MAX_FILESIZE:-64M}
- PHP_POST_MAX_SIZE=${PHP_POST_MAX_SIZE:-64M}
- PHP_MAX_EXECUTION_TIME=${PHP_MAX_EXECUTION_TIME:-300}
- PHP_MAX_INPUT_VARS=${PHP_MAX_INPUT_VARS:-4000}
# APCu instellingen
- APC_SHM_SIZE=${APC_SHM_SIZE:-32M}
# OPcache instellingen
- OPCACHE_MEMORY_CONSUMPTION=${OPCACHE_MEMORY_CONSUMPTION:-348}
- OPCACHE_INTERNED_STRINGS_BUFFER=${OPCACHE_INTERNED_STRINGS_BUFFER:-32}
- OPCACHE_MAX_ACCELERATED_FILES=${OPCACHE_MAX_ACCELERATED_FILES:-10000}
# Session instellingen
- SESSION_SAVE_PATH=/var/lib/php/sessions
# PHP-FPM pool instellingen
- PM_TYPE=${PM_TYPE:-dynamic}
- PM_MAX_CHILDREN=${PM_MAX_CHILDREN:-20}
- PM_START_SERVERS=${PM_START_SERVERS:-5}
- PM_MIN_SPARE_SERVERS=${PM_MIN_SPARE_SERVERS:-3}
- PM_MAX_SPARE_SERVERS=${PM_MAX_SPARE_SERVERS:-10}
# SMTP instellingen
- SMTP_HOST=${SMTP_HOST:-127.0.0.1}
- SMTP_PORT=${SMTP_PORT:-25}
- SMTP_FROM=${SMTP_FROM:-localhost}
volumes:
- ${WP_PATH}:/var/www/html:rw
- php-opcache-data:/var/cache/php-opcache
- php-session-data:/var/lib/php/sessions
networks:
phpnet:
ipv4_address: ${CONTAINER_IP}
wp-cli:
image: wordpress:cli
container_name: ${CONTAINER_NAME}-cli
user: "${PUID}:${PGID}"
volumes:
- ${WP_PATH}:/var/www/html
networks:
- phpnet
working_dir: /var/www/html
environment:
- HTTP_HOST=${WP_DOMAIN}
- HTTPS=on
- REMOTE_ADDR=127.0.0.1
- SERVER_PORT=443
- SERVER_NAME=${WP_DOMAIN}
- SERVER_PROTOCOL=HTTP/2.0
- REQUEST_METHOD=GET
- DOCUMENT_ROOT=/var/www/html
entrypoint: ["wp"]
profiles:
- cli
networks:
phpnet:
external: true
name: phpnet
volumes:
php-opcache-data:
name: ${VOLUME_PREFIX}-php-opcache
php-session-data:
name: ${VOLUME_PREFIX}-php-sessions
# Container instellingen
CONTAINER_NAME=my-website-php
VOLUME_PREFIX=my-website
CONTAINER_IP=172.50.0.10
# Gebruiker instellingen (verplicht!)
PUID=1001
PGID=1001
USERNAME=gebruiker
# WordPress domein
WP_DOMAIN=example.com
WP_PATH=/var/www/example.com/public
# PHP resource instellingen
PHP_MEMORY_LIMIT=256M
PHP_UPLOAD_MAX_FILESIZE=64M
PHP_POST_MAX_SIZE=64M
PHP_MAX_EXECUTION_TIME=300
PHP_MAX_INPUT_VARS=4000
# APC instellingen
APC_SHM_SIZE=32M
# OPcache instellingen
OPCACHE_MEMORY_CONSUMPTION=348
OPCACHE_INTERNED_STRINGS_BUFFER=32
OPCACHE_MAX_ACCELERATED_FILES=10000
# PHP-FPM pool instellingen
PM_TYPE=dynamic
PM_MAX_CHILDREN=20
PM_START_SERVERS=5
PM_MIN_SPARE_SERVERS=3
PM_MAX_SPARE_SERVERS=10
# SMTP instellingen
SMTP_HOST=127.0.0.1
SMTP_PORT=25
SMTP_FROM=localhost
PHP_MEMORY_LIMIT=128M PM_MAX_CHILDREN=10 OPCACHE_MEMORY_CONSUMPTION=96 APC_SHM_SIZE=16M
PHP_MEMORY_LIMIT=256M PM_MAX_CHILDREN=20 OPCACHE_MEMORY_CONSUMPTION=256 APC_SHM_SIZE=32M
PHP_MEMORY_LIMIT=512M PM_MAX_CHILDREN=40 OPCACHE_MEMORY_CONSUMPTION=512 APC_SHM_SIZE=64M
docker compose run --rm wp-cli core install --url=example.com --title="My Website" --admin_user=admin --admin_password=securepass --admin_email=admin@example.com
docker compose run --rm wp-cli plugin list
docker compose run --rm wp-cli db optimize
docker compose run --rm wp-cli cache flush
docker compose logs -f php
docker compose restart php
docker compose pull php docker compose up -d php
docker stats ${CONTAINER_NAME}
Oorzaak: Environment variabelen niet correct doorgegeven. Oplossing: Controleer of .env bestand bestaat en variabelen bevat.
Oorzaak: PM_TYPE heeft een ongeldige waarde. Oplossing: Gebruik dynamic, static of ondemand (kleine letters).
Oorzaak: De PM_TYPE variabele is niet vervangen. Oplossing: Zorg dat PM_TYPE in de environment sectie staat.
docker compose logs php docker compose config
docker run --rm -e PUID=1000 -e PGID=1000 -e USERNAME=test ghcr.io/hansvaneijsden/php-wordpress-base:latest php -v
Deze image heeft de volgende beveiligingsmaatregelen:
- Gevaarlijke PHP functies uitgeschakeld (exec, shell_exec, etc.)
- expose_php = Off - Verbergt PHP versie informatie
- Secure session cookies (session.cookie_secure = 1)
- Strict session mode (session.use_strict_mode = 1)
- Wekelijkse security scans met Trivy
- Gebaseerd op officiële PHP images
De image bevat:
- OPcache file cache - Gecached scripts opslaan op disk
- Igbinary serializer - Snellere en compactere serialization
- APCu object cache - Voor WordPress transients via SQLite Object Cache plugin
- OPcache interned strings - Bespaart geheugen voor duplicate strings
- PHP-FPM static/dynamic pool - Aanpasbaar per website
Issues en pull requests zijn welkom! Zorg dat je:
- De Dockerfile lokaal test
- De GitHub Actions workflow niet breekt
- De README update indien nodig
- Eerste stabiele release
- PHP 8.5 FPM basis
- APCu en OPcache optimalisaties
- Automatische gebruikersrechten
- MSMTP integratie voor mail
MIT License - Vrij te gebruiken en aan te passen.
- PHP Docker official images
- WordPress Docker Hub
- Trivy security scanner
git clone https://github.com/HansVanEijsden/php-wordpress-base.git my-site cd my-site
cp .env.example .env nano .env
docker compose up -d
docker compose run --rm wp-cli core download docker compose run --rm wp-cli config create --dbname=wordpress --dbuser=root --dbpass=password --dbhost=mariadb docker compose run --rm wp-cli core install --url=example.com --title="My Site" --admin_user=admin --admin_password=secure --admin_email=admin@example.com
Tip: Voor productieomgevingen wordt aangeraden om een specifieke versie tag te gebruiken in plaats van latest, bijvoorbeeld v1.0.0.
Bug gevonden? Open een issue op GitHub