Skip to content

itsomidho/wp-docker

Repository files navigation

WordPress Docker Multi-Site Boilerplate

A professional Docker-based development environment for running unlimited WordPress sites with Nginx (sites-available/enabled), PHP-FPM, MySQL, and PhpMyAdmin.

Perfect for: agencies, developers managing multiple projects, or anyone running several WordPress sites locally.

✨ Features

  • πŸš€ Unlimited Sites: Simple workflow without editing docker-compose.yml
  • πŸ”’ SSL via mkcert: Trusted local HTTPS certificates
  • πŸ”§ Nginx sites-available/enabled: Professional configuration management
  • 🐘 Single PHP-FPM Pool: Official WordPress PHP 8.2-FPM image serving all sites
  • πŸ—„οΈ MySQL 8.0: Shared database server (separate database per site)
  • πŸ“Š PhpMyAdmin: Web-based MySQL administration
  • ⚑ Optimized: OPcache, Gzip, FastCGI tuning

πŸ“‹ Prerequisites

  • Docker (20.10+) and Docker Compose (2.0+)
  • mkcert for local SSL certificates
  • Linux/macOS (Windows WSL2 supported)

Install mkcert (Ubuntu/Debian)

sudo apt install libnss3-tools
wget -O mkcert https://github.com/FiloSottile/mkcert/releases/latest/download/mkcert-v1.4.4-linux-amd64
chmod +x mkcert
sudo mv mkcert /usr/local/bin/
mkcert -install

πŸš€ Quick Start

The Simple Workflow

Adding a new WordPress site involves 5 simple steps:

  1. Create Nginx config β†’ nginx/sites-available/yoursite.test.conf
  2. Download WordPress β†’ sites/yoursite/
  3. Generate SSL cert β†’ mkcert yoursite.test
  4. Add to /etc/hosts β†’ 127.0.0.1 yoursite.test
  5. Start containers β†’ docker-compose up -d

Option 1: Automated (Recommended)

Use the new-site.sh script:

./new-site.sh

Enter your domain (e.g., mysite.test) and the script will:

  • Create Nginx configuration
  • Download latest WordPress
  • Generate SSL certificates
  • Offer to add to /etc/hosts
  • Offer to start Docker containers

Visit https://mysite.test and complete the WordPress installation!

Database Setup: Use WordPress installer or PhpMyAdmin to create the database.

Option 2: Manual Setup

# 1. Create Nginx configuration
DOMAIN="mysite.test"
SITE_NAME="mysite"

sed "s/DOMAIN/$DOMAIN/g" nginx/sites-available/site.conf.template > nginx/sites-available/${DOMAIN}.conf
sed -i "s|/var/www/SITE_NAME|/var/www/$SITE_NAME|g" nginx/sites-available/${DOMAIN}.conf
ln -s ../sites-available/${DOMAIN}.conf nginx/sites-enabled/${DOMAIN}.conf

# 2. Download WordPress
mkdir -p sites/$SITE_NAME && cd sites/$SITE_NAME
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz --strip-components=1 && rm latest.tar.gz
cd ../..

# 3. Generate SSL certificate
mkcert -cert-file nginx/ssl/certs/${DOMAIN}.pem \
       -key-file nginx/ssl/private/${DOMAIN}-key.pem \
       $DOMAIN

# 4. Add to /etc/hosts
echo "127.0.0.1    $DOMAIN" | sudo tee -a /etc/hosts

# 5. Start Docker
docker compose up -d

🌐 Access Points

Service URL Credentials
Your WordPress Sites https://yoursite.test Set during WP installation
PhpMyAdmin http://localhost:8080 Username: root
Password: See .env
MySQL (external) localhost:3306 Username: root
Password: See .env

πŸ“‚ Project Structure

wp-docker/
β”œβ”€β”€ docker-compose.yml           # Container orchestration
β”œβ”€β”€ .env                         # Environment variables (DB passwords)
β”œβ”€β”€ new-site.sh                  # Automated site provisioning ⭐
β”œβ”€β”€ install-mkcert.sh            # mkcert installation helper
β”œβ”€β”€ manage-sites.sh              # Site management utilities
β”‚
β”œβ”€β”€ nginx/
β”‚   β”œβ”€β”€ nginx.conf              # Main Nginx config
β”‚   β”œβ”€β”€ sites-available/        # All site configurations
β”‚   β”‚   β”œβ”€β”€ site.conf.template  # Template for new sites
β”‚   β”‚   β”œβ”€β”€ default.conf        # Catch-all/default site
β”‚   β”‚   └── *.test.conf         # Your site configs
β”‚   β”œβ”€β”€ sites-enabled/          # Symlinks to enabled sites
β”‚   β”‚   └── *.test.conf β†’ ../sites-available/
β”‚   └── ssl/
β”‚       β”œβ”€β”€ certs/              # SSL certificates (.pem)
β”‚       └── private/            # SSL private keys (-key.pem)
β”‚
└── sites/                      # WordPress installations
    β”œβ”€β”€ site1/                  # Site 1 WordPress files
    β”œβ”€β”€ site2/                  # Site 2 WordPress files
    └── ...

πŸ”§ WordPress Database Setup

When installing WordPress, use these database settings:

  • Database Name: Create via PhpMyAdmin or MySQL CLI (e.g., mysite_db)
  • Username: root (or create dedicated user)
  • Password: Check .env file β†’ DB_ROOT_PASSWORD
  • Database Host: mysql
  • Table Prefix: wp_

Create Database (via CLI)

# Connect to MySQL
docker exec -it wp-mysql mysql -u root -p

# Enter password from .env

# Create database and user
CREATE DATABASE mysite_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mysite_user'@'%' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON mysite_db.* TO 'mysite_user'@'%';
FLUSH PRIVILEGES;
EXIT;

πŸ“– Documentation


🎯 Example Workflow

Let's add a site called portfolio.test:

# Run the automated script
./new-site.sh

# Or manually:
DOMAIN="portfolio.test"
sed "s/DOMAIN/$DOMAIN/g" nginx/sites-available/site.conf.template > nginx/sites-available/${DOMAIN}.conf
sed -i "s|/var/www/SITE_NAME|/var/www/portfolio|g" nginx/sites-available/${DOMAIN}.conf
ln -s ../sites-available/${DOMAIN}.conf nginx/sites-enabled/${DOMAIN}.conf

mkdir -p sites/portfolio && cd sites/portfolio
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz --strip-components=1 && rm latest.tar.gz
cd ../..

mkcert -cert-file nginx/ssl/certs/portfolio.test.pem \
       -key-file nginx/ssl/private/portfolio.test-key.pem \
       portfolio.test

echo "127.0.0.1    portfolio.test" | sudo tee -a /etc/hosts

docker compose up -d

Visit https://portfolio.test and install WordPress!


πŸ› οΈ Common Commands

# Start all containers
docker compose up -d

# Stop all containers
docker compose down

# View logs
docker compose logs -f nginx
docker compose logs -f php

# Restart Nginx (after config changes)
docker exec wp-nginx nginx -s reload

# Test Nginx configuration
### Nginx Configuration Error?

docker exec wp-nginx nginx -t

# Access MySQL CLI
docker exec -it wp-mysql mysql -u root -p

# Fix file permissions
sudo chown -R $USER:$USER sites/yoursite

πŸ› Troubleshooting

SSL Certificate Not Trusted?

mkcert -install

Can't Access Site?

# Verify /etc/hosts entry
cat /etc/hosts | grep yoursite.test

# Check Nginx config
docker exec wp-nginx nginx -t

# Check containers are running
docker compose ps

502 Bad Gateway?

# Restart PHP-FPM
docker compose restart php

# Check PHP logs
docker compose logs php

Permission Denied?

# Fix ownership
sudo chown -R $USER:$USER sites/

πŸ” Security Notes

  • This setup is for local development only
  • .env contains database passwords (never commit to git)
  • mkcert certificates are trusted locally only
  • For production, use proper SSL certificates (Let's Encrypt)

🀝 Contributing

Contributions welcome! Please open an issue or pull request.


πŸ“„ License

MIT License - feel free to use for personal or commercial projects.


βš™οΈ Technical Stack

Component Technology Purpose
Web Server Nginx (Alpine) Reverse proxy, SSL termination, static files
PHP WordPress Official Image (PHP 8.2-FPM) WordPress execution
Database MySQL 8.0 Data storage
DB Admin PhpMyAdmin Database management UI
SSL mkcert Local trusted certificates
Orchestration Docker Compose Container management

πŸŽ“ Learn More


Happy developing! πŸš€

About

πŸš€ Professional Docker boilerplate for unlimited WordPress sites with Nginx, SSL, PHP-FPM, and MySQL - Perfect for local development

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages