Blog

Host Multiple WordPress Websites on a Single Server Using Docker

#!/bin/bash

DOCKER_NETWORK="mynetwork"
LETSENCRYPT_EMAIL="john@example.com"

# Prompt user for inputs

while true; do
    read -p "Enter website name: " website_name
    if [[ $website_name =~ ^[a-zA-Z0-9]+$ && ! $website_name =~ \.com$ ]]; then
        break
    else
        echo "Invalid website name. Please enter an alphanumeric name without the .com part."
    fi
done

while true; do
    read -p "Enter domain: " domain
    if [[ $domain =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
        break
    else
        echo "Invalid domain. Please enter a valid domain."
    fi
done

while true; do
    read -p "Enter MySQL root password: " mysql_root_password
    if [[ ${#mysql_root_password} -ge 8 && $mysql_root_password =~ [A-Z] && $mysql_root_password =~ [a-z] && $mysql_root_password =~ [0-9] ]]; then
        break
    else
        echo "Invalid password. Must be at least 8 characters with 1 number, 1 uppercase, and 1 lowercase letter."
    fi
done

while true; do
    read -p "Enter WordPress DB user: " wp_db_user
    if [[ $wp_db_user =~ ^[a-zA-Z0-9]+$ ]]; then
        break
    else
        echo "Invalid DB user. Please enter an alphanumeric name."
    fi
done

while true; do
    read -p "Enter WordPress DB password: " wp_db_password
    if [[ ${#wp_db_password} -ge 8 && $wp_db_password =~ [A-Z] && $wp_db_password =~ [a-z] && $wp_db_password =~ [0-9] ]]; then
        break
    else
        echo "Invalid password. Must be at least 8 characters with 1 number, 1 uppercase, and 1 lowercase letter."
    fi
done

# Start MariaDB container
docker run --name ${website_name}_mariadb --net $DOCKER_NETWORK -v ${website_name}_mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=${mysql_root_password} -e MYSQL_DATABASE=${website_name} -e MYSQL_USER=${wp_db_user} -e MYSQL_PASSWORD=${wp_db_password} -d --restart always mariadb

# Start WordPress container
docker run --name ${website_name}_wp --net $DOCKER_NETWORK -v ${website_name}_wp:/var/www/html -v ~/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini -e WORDPRESS_DB_HOST=${website_name}_mariadb:3306 -e WORDPRESS_DB_NAME=${website_name} -e WORDPRESS_DB_USER=${wp_db_user} -e WORDPRESS_DB_PASSWORD=${wp_db_password} -e VIRTUAL_HOST=${domain} -e LETSENCRYPT_HOST=${domain} -e LETSENCRYPT_EMAIL=$LETSENCRYPT_EMAIL -d --restart always wordpress

echo "Containers for $website_name started!"

Want more insights?

Sign up for my newsletter.

I care about your data. Read my privacy policy.