VPS Series · Post 3 of 5

WordPress on a Subdomain
via Docker Compose

Need a staging site, a dev environment, or a second WordPress install on the same VPS? Docker makes it dead simple. We'll spin up a fully isolated WordPress on staging.example.com using Docker Compose and route traffic through Nginx as a reverse proxy.

1 Install Docker & Docker Compose

bash
apt install docker.io docker-compose -y
systemctl enable docker
systemctl start docker

# Verify
docker --version
docker-compose --version

2 Add Subdomain in Cloudflare

In your Cloudflare dashboard, add an A record for the subdomain:

dns
Type    Name    Content          Proxy
A       staging 192.0.2.100      Proxied ✅

3 Create Docker Compose File

bash
mkdir -p /var/www/docker/dev-wordpress
cd /var/www/docker/dev-wordpress
nano docker-compose.yml

Paste this configuration:

yaml
version: '3.8'

services:
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: SecurePass@2024!
      MYSQL_ROOT_PASSWORD: RootSecure@2024!
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: SecurePass@2024!
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:

4 Start the Containers

bash
docker-compose up -d

# Check containers are running
docker ps

The -d flag runs containers in detached mode (background). First run will pull the images — takes a minute.

5 Configure Nginx Reverse Proxy

bash
nano /etc/nginx/sites-available/dev-wordpress
nginx
server {
    listen 80;
    listen [::]:80;
    server_name staging.example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        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;
    }
}

6 Enable & Test

bash
ln -s /etc/nginx/sites-available/dev-wordpress /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

Visit https://staging.example.com — you should see a fresh WordPress installation screen. Your Dockerised staging site is live and completely isolated from your main site.