Setting up local WordPress environments manually wastes hours—installing PHP, MySQL, configuring virtual hosts, managing multiple versions. Every project needs different configurations, and your local machine becomes cluttered with conflicting dependencies.
Docker + WP-CLI creates isolated, reproducible WordPress environments in minutes. Spin up fresh WordPress installs with one command, test on multiple PHP versions simultaneously, and share identical environments with your entire team.
In this guide, you’ll learn to build production-ready WordPress development environments using Docker and WP-CLI, with automated setup scripts and best practices used by modern WordPress development teams.
Why Docker for WordPress Development?
Docker containers provide isolated, consistent environments for WordPress development without polluting your local system.
Problems with Traditional Local WordPress
Version conflicts: Multiple PHP versions cause headaches and break projects.
Configuration drift: Development doesn’t match staging or production environments.
Slow setup: Installing WordPress manually on each project wastes 30-60 minutes.
Team inconsistency: Developers have different local setups causing “works on my machine” bugs.
Resource waste: Running multiple databases and servers consumes system resources.
Docker + WP-CLI Advantages
Isolated environments: Each project runs independently without conflicts.
Instant setup: Launch complete WordPress stack in under 2 minutes.
Version flexibility: Test on PHP 7.4, 8.0, 8.1 simultaneously.
Team consistency: Everyone runs identical environments via docker-compose.yml.
Easy cleanup: Delete containers without leaving system residue.
According to Docker adoption surveys, 65% of professional WordPress developers use Docker for local development.
Docker WordPress Setup
Create a complete WordPress development environment with Docker Compose.
Basic docker-compose.yml
version: "3.8"
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wordpress:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- db_data:/var/lib/mysql
wpcli:
image: wordpress:cli
user: "33:33"
volumes:
- ./wordpress:/var/www/html
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
- wordpress
volumes:
db_data:Launch Environment
# Start all services
docker-compose up -d
# Check status
docker-compose ps
# Access WordPress
open http://localhost:8080
# View logs
docker-compose logs -f wordpressRun WP-CLI in Container
# Execute WP-CLI commands
docker-compose run --rm wpcli wp --info
# Install WordPress core
docker-compose run --rm wpcli wp core install \
--url=localhost:8080 \
--title="Docker WordPress" \
--admin_user=admin \
--admin_password=admin \
--admin_email=admin@example.com
# Install plugins
docker-compose run --rm wpcli wp plugin install contact-form-7 --activateLearn more about Docker Compose configuration.
Advanced Docker Configuration
Enhance your Docker WordPress environment with professional features.
Multiple PHP Versions
# docker-compose.yml with PHP version control
version: "3.8"
services:
wordpress-php74:
image: wordpress:php7.4-apache
ports:
- "8074:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wp_php74
volumes:
- ./wp-php74:/var/www/html
wordpress-php80:
image: wordpress:php8.0-apache
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wp_php80
volumes:
- ./wp-php80:/var/www/html
wordpress-php81:
image: wordpress:php8.1-apache
ports:
- "8081:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wp_php81
volumes:
- ./wp-php81:/var/www/htmlUse Case: Test plugin compatibility across PHP versions simultaneously.
Custom PHP Configuration
# docker-compose.yml with custom PHP settings
services:
wordpress:
image: wordpress:latest
volumes:
- ./wordpress:/var/www/html
- ./php.ini:/usr/local/etc/php/conf.d/custom.iniphp.ini:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
display_errors = On
error_reporting = E_ALLAdd PHPMyAdmin
services:
phpmyadmin:
image: phpmyadmin:latest
ports:
- "8081:80"
environment:
PMA_HOST: db
PMA_USER: wordpress
PMA_PASSWORD: wordpress
depends_on:
- dbAccess PHPMyAdmin at http://localhost:8081.
Automated WordPress Setup
Create scripts for one-command WordPress environment initialization.
Complete Setup Script
#!/bin/bash
# wp-docker-init.sh - Initialize WordPress Docker environment
set -e
PROJECT_NAME="${1:-wordpress-project}"
ADMIN_USER="admin"
ADMIN_PASS="admin"
ADMIN_EMAIL="admin@example.com"
echo "Initializing WordPress Docker environment: $PROJECT_NAME"
# Create project directory
mkdir -p "$PROJECT_NAME"
cd "$PROJECT_NAME"
# Create docker-compose.yml
cat > docker-compose.yml <<'EOF'
version: '3.8'
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wordpress:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- db_data:/var/lib/mysql
wpcli:
image: wordpress:cli
user: "33:33"
volumes:
- ./wordpress:/var/www/html
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
- wordpress
volumes:
db_data:
EOF
# Start containers
echo "Starting Docker containers..."
docker-compose up -d
# Wait for WordPress to be ready
echo "Waiting for WordPress..."
sleep 10
# Install WordPress
echo "Installing WordPress..."
docker-compose run --rm wpcli wp core install \
--url=localhost:8080 \
--title="$PROJECT_NAME" \
--admin_user="$ADMIN_USER" \
--admin_password="$ADMIN_PASS" \
--admin_email="$ADMIN_EMAIL"
# Install essential plugins
echo "Installing plugins..."
docker-compose run --rm wpcli wp plugin install \
contact-form-7 \
yoast-seo \
wordfence \
--activate
# Install theme
echo "Installing theme..."
docker-compose run --rm wpcli wp theme install astra --activate
# Set permalinks
docker-compose run --rm wpcli wp rewrite structure '/%postname%/'
echo "✓ WordPress environment ready!"
echo "URL: http://localhost:8080"
echo "Admin: $ADMIN_USER / $ADMIN_PASS"Run it:
chmod +x wp-docker-init.sh
./wp-docker-init.sh my-projectDevelopment Helper Scripts
# wp.sh - WP-CLI wrapper for Docker
#!/bin/bash
docker-compose run --rm wpcli wp "$@"
# Usage:
chmod +x wp.sh
./wp.sh plugin list
./wp.sh post create --post_title="Test" --post_status=publishDocker WordPress Workflows
Professional development patterns with Docker and WP-CLI.
Import Existing Site
#!/bin/bash
# import-to-docker.sh - Import existing WordPress site
BACKUP_SQL="$1"
BACKUP_FILES="$2"
if [ -z "$BACKUP_SQL" ]; then
echo "Usage: $0 <backup.sql> <files.tar.gz>"
exit 1
fi
# Start containers
docker-compose up -d
sleep 10
# Import database
echo "Importing database..."
docker-compose exec -T db mysql -uwordpress -pwordpress wordpress < "$BACKUP_SQL"
# Extract files
echo "Extracting files..."
tar -xzf "$BACKUP_FILES" -C ./wordpress/
# Update URLs
echo "Updating URLs..."
docker-compose run --rm wpcli wp search-replace \
'https://oldsite.com' 'http://localhost:8080' \
--skip-columns=guid
# Flush cache
docker-compose run --rm wpcli wp cache flush
echo "✓ Site imported successfully"Export for Production
#!/bin/bash
# export-from-docker.sh
DATE=$(date +%Y%m%d)
echo "Exporting WordPress from Docker..."
# Export database
docker-compose run --rm wpcli wp db export - > "backup-$DATE.sql"
# Compress database
gzip "backup-$DATE.sql"
# Archive files
tar -czf "files-$DATE.tar.gz" -C ./wordpress .
echo "✓ Export complete:"
echo " Database: backup-$DATE.sql.gz"
echo " Files: files-$DATE.tar.gz"Reset Development Environment
#!/bin/bash
# reset-docker-wordpress.sh
read -p "This will destroy all data. Continue? (y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 0
fi
# Stop and remove containers
docker-compose down -v
# Remove WordPress files
rm -rf ./wordpress/*
# Start fresh
docker-compose up -d
sleep 10
# Reinstall
docker-compose run --rm wpcli wp core install \
--url=localhost:8080 \
--title="Fresh WordPress" \
--admin_user=admin \
--admin_password=admin \
--admin_email=admin@example.com
echo "✓ Environment reset complete"Testing and Debugging
Debug WordPress issues in Docker containers.
View Container Logs
# WordPress logs
docker-compose logs -f wordpress
# Database logs
docker-compose logs -f db
# All logs
docker-compose logs -f
# Last 50 lines
docker-compose logs --tail=50 wordpressAccess Container Shell
# WordPress container bash
docker-compose exec wordpress bash
# Once inside, check PHP info
php -i
# Check Apache config
cat /etc/apache2/sites-available/000-default.conf
# View error logs
tail -f /var/log/apache2/error.logDebug WP-CLI Issues
# Check WP-CLI version
docker-compose run --rm wpcli wp cli version
# Verify WordPress installation
docker-compose run --rm wpcli wp core is-installed
# Check database connection
docker-compose run --rm wpcli wp db check
# List environment variables
docker-compose run --rm wpcli envPerformance Optimization
Improve Docker WordPress performance for development.
Enable Object Caching
services:
redis:
image: redis:alpine
ports:
- "6379:6379"
wordpress:
# ... existing config
depends_on:
- db
- redisInstall Redis plugin:
docker-compose run --rm wpcli wp plugin install redis-cache --activate
docker-compose run --rm wpcli wp redis enableOptimize MySQL
services:
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password --innodb-buffer-pool-size=256MVolume Performance
# Use cached mode for better performance on macOS
volumes:
- ./wordpress:/var/www/html:cachedLearn about Docker volume performance optimization.
Next Steps
You now have professional Docker-based WordPress development skills with WP-CLI integration.
Recommended Learning Path
Week 1: Basic Docker setup
- Launch WordPress with Docker Compose
- Run WP-CLI in containers
- Import/export sites
Week 2: Advanced configuration
- Test multiple PHP versions
- Add development tools
- Optimize performance
Week 3: Automation
- Build setup scripts
- Create helper commands
- Implement CI/CD
Week 4: Team workflows
- Share configurations
- Document processes
- Standardize environments
Advanced Topics
- Docker Multi-Stage Builds – Optimized production images
- Kubernetes WordPress – Container orchestration
- CI/CD Pipelines – Automated deployment
Get More Resources
Download Docker WordPress configs including:
- Complete docker-compose files
- Setup automation scripts
- Development tools
- Weekly WP-CLI tutorials
- Docker best practices
- Modern WordPress DevOps
Conclusion
Docker and WP-CLI together create the ultimate WordPress development environment—fast, consistent, isolated, and completely reproducible across your entire team.
What we covered:
✅ Docker Compose WordPress configuration
✅ WP-CLI integration in containers
✅ Advanced Docker features (multiple PHP versions, tools)
✅ Automated setup and teardown scripts
✅ Import/export workflows
✅ Testing, debugging, and optimization
Master these techniques, and you’ll never waste time on local WordPress setup again—spin up fresh environments in seconds, test across PHP versions, and share identical setups with your team.
Ready for more? Learn WordPress CI/CD pipelines or Kubernetes deployment.
Questions about Docker WordPress with WP-CLI? Drop a comment below!
Found this helpful? Share with other WordPress developers.
