Sign inSign up

mcloudllc/wordpress

By mcloudllc

•Updated 8 months ago

Image
Web servers
Content management system
0

2.3K

mcloudllc/wordpress repository overview

⁠WordPress Custom Images - Production-Ready Suite

A collection of production-ready WordPress Docker images optimized for Kubernetes deployments with enhanced PHP settings, automation capabilities, security hardening, and dynamic hostname support.

⁠Available Images

⁠1. WordPress (Apache) - mcloudllc/wordpress:php8.4-apache

Production-ready WordPress with optimized PHP configuration based on official wordpress:php8.4-apache.

Key Features:

  • ✅ Optimized PHP Settings - 512M memory limit, 64M upload limit, extended execution times
  • ✅ OPcache Enabled - Significant performance improvement
  • ✅ Production-Ready - Error logging configured, display errors disabled
  • ✅ Health Checks - Built-in health monitoring for Kubernetes/Docker
  • ✅ Security Hardened - Disabled dangerous PHP functions, security headers, proper permissions
  • ✅ Dynamic URL Support - Accept any incoming hostname without hardcoding URLs
  • ✅ External Configuration - PHP and Apache configs stored outside Dockerfile for easy customization

PHP Configuration:

SettingValueDescription
memory_limit512MTotal memory available to PHP scripts
upload_max_filesize64MMaximum file upload size
post_max_size128MMaximum POST request size
max_execution_time120Script execution timeout (seconds)
max_input_time120Input parsing timeout (seconds)
max_input_vars3000Maximum input variables (for page builders)
opcache.enable1PHP OPcache enabled
opcache.memory_consumption128OPcache memory allocation

Security Hardening:

FeatureDescription
Disabled Functionsexec, passthru, shell_exec, system, proc_open, popen
expose_phpOff - Don't reveal PHP version
allow_url_fopenOff - Disable remote file access
open_basedirRestricted to /var/www/html:/tmp
Security HeadersX-Frame-Options, X-Content-Type-Options, X-XSS-Protection
ServerTokensProd - Minimal server info exposed
Uploads ProtectionScript execution blocked in uploads directory

Dynamic URL Environment Variables:

VariableDefaultDescription
WP_DYNAMIC_URLtrueEnable dynamic hostname support
WP_ALLOW_ANY_HOSTtrueAllow any incoming hostname
WP_ALLOWED_HOSTS-Comma-separated whitelist (supports wildcards: *.example.com)
MEMCACHED_HOST-Memcached server hostname for sessions
MEMCACHED_PORT11211Memcached server port
⁠2. WordPress CLI - mcloudllc/wordpress:cli

Enhanced WP-CLI image optimized for automation and management operations.

Key Features:

  • ✅ High Memory Limit - 512M PHP memory for complex operations
  • ✅ Extended Timeouts - 300s execution time for long-running tasks
  • ✅ Additional Tools - Includes mysql-client, bash, jq, and less
  • ✅ Automation-Ready - Pre-configured for non-interactive operations
  • ✅ Alpine-Based - Small footprint, fast startup
  • ✅ External Configuration - PHP config stored outside Dockerfile

Optimized For:

  • Plugin/theme installations
  • Database import/export operations
  • Content migrations
  • Automated backups
  • Bulk operations
⁠3. WordPress Init Container - mcloudllc/wordpress:init

Specialized init container for automated WordPress installation and configuration in Kubernetes.

Key Features:

  • ✅ Fully Automated - Zero-touch WordPress installation
  • ✅ Database Ready Detection - Waits for database with configurable retry logic
  • ✅ Idempotent Operations - Safe to run multiple times
  • ✅ Plugin/Theme Management - Install and activate via environment variables
  • ✅ Permission Management - Automatic file permission configuration
  • ✅ Dynamic URL Plugin - Automatically installs dynamic URL support
  • ✅ Security Configuration - Applies security hardening to wp-config.php

What It Does:

  1. Validates required environment variables
  2. Waits for database to be ready (with timeout and retry)
  3. Downloads WordPress core files if needed
  4. Creates wp-config.php with database credentials
  5. Applies security configuration (DISALLOW_FILE_EDIT, FORCE_SSL_ADMIN, etc.)
  6. Installs dynamic URL must-use plugin
  7. Installs WordPress if not already installed
  8. Manages plugins (install/activate)
  9. Manages themes (install/activate)
  10. Sets proper file permissions for www-data

⁠Dynamic Hostname Support

The images include a must-use plugin that enables WordPress to respond to any incoming hostname. This is useful for:

  • Kubernetes deployments with multiple ingress hostnames
  • Development environments with different domains
  • Blue-green deployments where URLs change
  • Multi-tenant setups serving multiple domains
⁠How It Works
  1. The dynamic-url.php must-use plugin intercepts all URL generation
  2. It detects the incoming hostname from HTTP_HOST or X-Forwarded-Host headers
  3. It rewrites WordPress home_url() and site_url() to match the incoming request
  4. HTTPS is detected from X-Forwarded-Proto header (for reverse proxy setups)
⁠Security

The plugin includes host validation to prevent host header injection attacks:

  • Set WP_ALLOWED_HOSTS environment variable to restrict allowed hostnames
  • Supports wildcards: *.example.com
  • Always allows localhost and 127.0.0.1 for development

⁠Quick Start Examples

⁠Complete Stack with Docker Compose
version: '3.8'

services:
  wordpress:
    image: mcloudllc/wordpress:php8.4-apache
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: your_password
    volumes:
      - wordpress_data:/var/www/html
    depends_on:
      - db

  db:
    image: mariadb:12
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: your_password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  wordpress_data:
  db_data:
⁠Kubernetes Deployment with Init Container
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 2
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      initContainers:
      - name: wordpress-install
        image: mcloudllc/wordpress:init
        env:
        - name: WORDPRESS_DB_HOST
          value: mariadb:3306
        - name: WORDPRESS_DB_NAME
          value: wordpress
        - name: WORDPRESS_DB_USER
          valueFrom:
            secretKeyRef:
              name: wordpress-db
              key: username
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: wordpress-db
              key: password
        - name: WORDPRESS_ADMIN_PASSWORD
          valueFrom:
            secretKeyRef:
              name: wordpress-admin
              key: password
        - name: WORDPRESS_SITE_URL
          value: https://mysite.com
        - name: WORDPRESS_TITLE
          value: "My Awesome Site"
        - name: WORDPRESS_PLUGINS
          value: "akismet:activate,jetpack:activate"
        - name: WORDPRESS_THEMES
          value: "twentytwentyfour"
        - name: WORDPRESS_ACTIVE_THEME
          value: "twentytwentyfour"
        - name: WP_DYNAMIC_URL
          value: "true"
        - name: WP_ALLOW_ANY_HOST
          value: "true"
        volumeMounts:
        - name: wordpress-data
          mountPath: /var/www/html
        resources:
          requests:
            cpu: 100m
            memory: 256Mi
          limits:
            cpu: 250m
            memory: 512Mi
      
      containers:
      - name: wordpress
        image: mcloudllc/wordpress:php8.4-apache
        ports:
        - containerPort: 80
        env:
        - name: WORDPRESS_DB_HOST
          value: mariadb:3306
        - name: WORDPRESS_DB_NAME
          value: wordpress
        - name: WORDPRESS_DB_USER
          valueFrom:
            secretKeyRef:
              name: wordpress-db
              key: username
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: wordpress-db
              key: password
        volumeMounts:
        - name: wordpress-data
          mountPath: /var/www/html
        resources:
          requests:
            cpu: 250m
            memory: 512Mi
          limits:
            cpu: 500m
            memory: 1Gi
      
      volumes:
      - name: wordpress-data
        persistentVolumeClaim:
          claimName: wordpress-pvc
⁠WP-CLI Management Tasks
# Install a plugin
docker run --rm \
  -v $(pwd):/var/www/html \
  mcloudllc/wordpress:cli \
  plugin install akismet --activate

# Export database
docker run --rm \
  -v $(pwd):/var/www/html \
  -e WORDPRESS_DB_HOST=db:3306 \
  mcloudllc/wordpress:cli \
  db export backup.sql

# Search and replace URLs
docker run --rm \
  -v $(pwd):/var/www/html \
  mcloudllc/wordpress:cli \
  search-replace 'http://oldsite.com' 'https://newsite.com'

# Update all plugins
docker run --rm \
  -v $(pwd):/var/www/html \
  mcloudllc/wordpress:cli \
  plugin update --all

⁠Environment Variables

⁠WordPress Container

Standard WordPress environment variables:

  • WORDPRESS_DB_HOST - Database host (required)
  • WORDPRESS_DB_NAME - Database name (required)
  • WORDPRESS_DB_USER - Database user (required)
  • WORDPRESS_DB_PASSWORD - Database password (required)
  • WORDPRESS_TABLE_PREFIX - Table prefix (default: wp_)
  • WORDPRESS_DEBUG - Enable debug mode (default: 0)
  • WORDPRESS_CONFIG_EXTRA - Additional wp-config.php defines
⁠Init Container

Required:

  • WORDPRESS_DB_HOST - Database host and port (e.g., mariadb:3306)
  • WORDPRESS_DB_NAME - Database name
  • WORDPRESS_DB_USER - Database username
  • WORDPRESS_DB_PASSWORD - Database password
  • WORDPRESS_ADMIN_PASSWORD - WordPress admin password

Optional:

  • WORDPRESS_SITE_URL - Site URL (default: http://localhost)
  • WORDPRESS_TITLE - Site title (default: My WordPress Site)
  • WORDPRESS_ADMIN_USER - Admin username (default: admin)
  • WORDPRESS_ADMIN_EMAIL - Admin email (default: [email protected])
  • WORDPRESS_PLUGINS - Plugins to install (format: plugin1:activate,plugin2:noactivate)
  • WORDPRESS_THEMES - Themes to install (format: theme1,theme2)
  • WORDPRESS_ACTIVE_THEME - Theme slug to activate
  • WP_DYNAMIC_URL - Enable dynamic URL support (default: true)
  • WP_ALLOW_ANY_HOST - Allow any incoming hostname (default: true)
  • WP_ALLOWED_HOSTS - Comma-separated whitelist of allowed hostnames
  • FORCE_SSL_ADMIN - Force HTTPS for admin (default: true)
  • WP_DEBUG - Enable WordPress debug mode (default: false)
  • WP_DEBUG_LOG - Enable debug logging (default: false)

⁠Image Tags

ImageTagsDescription
WordPressphp8.4-apache, php8.4-apache-<sha>, latestLatest stable with PHP 8.4
WP-CLIcli, cli-<sha>Latest WP-CLI build
Init Containerinit, init-<sha>Latest init container

All images use the same repository with different tags: mcloudllc/wordpress:<tag>


⁠Use Cases

⁠Perfect For:

WordPress Container:

  • 🎨 Media-heavy websites with large image/video uploads
  • 🏗️ Sites using page builders (Elementor, Divi, WPBakery)
  • 🛒 WooCommerce stores with extensive product catalogs
  • 📱 Membership sites with user-generated content
  • 🏢 Enterprise WordPress deployments

WP-CLI Container:

  • 🔄 Automated backups and maintenance
  • 📦 Plugin/theme mass updates
  • 🔧 Database migrations and repairs
  • 🎯 Content import/export operations
  • 🤖 CI/CD pipeline integrations

Init Container:

  • ☸️ Kubernetes StatefulSet deployments
  • 🔁 Automated environment provisioning
  • 🧪 Development/staging environment setup
  • 📋 GitOps-based WordPress deployments
  • 🚀 Zero-downtime WordPress installations

⁠Performance Benefits

  • Faster Page Loads - OPcache eliminates the need to recompile PHP files on each request
  • Higher Upload Limits - Support for media-rich content and large plugins/themes
  • Better Stability - Increased memory limits prevent common WordPress errors
  • Page Builder Compatible - Higher input variable limits support complex forms
  • Automated Setup - Init container reduces deployment time from hours to minutes

⁠Health Check

The WordPress image includes a built-in health check:

HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
    CMD curl -f http://localhost/readme.html || exit 1

⁠Resource Recommendations

⁠WordPress Container
resources:
  requests:
    cpu: 250m
    memory: 512Mi
  limits:
    cpu: 500m
    memory: 1Gi
⁠Init Container
resources:
  requests:
    cpu: 100m
    memory: 256Mi
  limits:
    cpu: 250m
    memory: 512Mi

⁠Support & Documentation


⁠Security Scanning

All images can be scanned for vulnerabilities:

# Using Trivy
trivy image mcloudllc/wordpress:php8.4-apache
trivy image mcloudllc/wordpress:cli
trivy image mcloudllc/wordpress:init

# Using Docker Scout
docker scout cves mcloudllc/wordpress:php8.4-apache

⁠License

GPL-2.0 - Same as WordPress and WP-CLI


⁠Why Use These Images?

⁠Traditional WordPress Deployment ❌
  • Manual WordPress installation required
  • Complex bash scripts in deployment files
  • Inconsistent PHP settings across environments
  • Hard to test and debug
  • Slow deployment process
⁠With This Image Suite ✅
  • Automated installation with init container
  • Optimized performance out of the box
  • Clean deployment files (just env vars)
  • Test independently before deployment
  • Fast, reliable deployments every time
  • Production-proven configurations
  • Dynamic hostnames - no URL reconfiguration needed
  • Security hardened - ready for production

Tag summary

Content type

Image

Digest

sha256:ba9565b98…

Size

259.9 MB

Last updated

8 months ago

docker pull mcloudllc/wordpress