If you’ve ever thought about setting up a multisite WordPress installation via Docker I highly recommend you do so as it is an excellent project to revisit several topics.
Overview:
- Load new Oracle 7.7 system via PXE and join to domain
- Install Docker & Docker Compose
- Acquire Docker Compose script from online video (Reference: https://www.youtube.com/watch?v=pYhLEV-sRpY)
- Modify script to work in an SELinux enabled environment
- Modify script to work with multisite
- Modify script to allow a larger upload size
- Run Docker Compose
- Configure WordPress for multisite
- Setup DNS entries & modify sites to use full domain names
What is great about this Docker setup is by stopping and then restarting the Docker Compose, WordPress will automatically be updated if a new release has come out. With a High Availability setup, you can restart one WordPress instance at a time, allowing for no downtime during upgrades.
# install docker sudo yum -y install docker # add user who will be running docker to docker group sudo usermod -aG docker travis # enable docker to start up at boot & start sudo systemctl enable docker sudo systemctl start docker # install pip which will be used to install docker-compose sudo yum -y install python-pip # install docker-compose sudo pip install docker-compose |
# create directory to store docker compose configuration & change to it
mkdir -p docker/wordpress
cd docker/wordpress
# create uploads.ini file which is used to configure a larger upload size
cat > uploads.ini
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 400M
file_uploads = On
max_execution_time = 180
# create docker-compose.yaml file
# original version: https://www.youtube.com/watch?v=pYhLEV-sRpY
cat > docker-compose.yaml
version: '3'
services:
# Database
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: password
networks:
- wpsite
# WordPress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- '80:80'
restart: always
privileged: true
volumes:
- ./html:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: password
networks:
- wpsite
networks:
wpsite:
volumes:
db_data:
Notes on docker-compose.yaml:
1. MySQL is loaded via Container image. Data is stored in local volume.
2. MySQL & WordPress are able to interact via a local network wpsite.
3. With a Multisite configuration port 80 is required.
4. “Privileged” must be used as we are using an enforced SELinux environment.
# create directory to store wordpress files
mkdir html
# Start up WordPress via docker-compose
docker-compose up -d
# Configure firewall
firewall-cmd --permanent --add-port 80
firewall-cmd --reload
Next a configuration file must be modified:
./html/wp-config-sample.php
Locate the string “That’s all, stop editing! …” and add the following lines after:
define(‘WP_ALLOW_MULTISITE’, ‘true’);
define(‘COOKIE_DOMAIN’, $_SERVER[‘HTTP_HOST’]);
After logging into the WordPress site for the first time browse to:
Tools -> Network, choose subdomains or subfolders and follow directions.
Finally, you can use a domain instead of a subdomain or subfolder by first creating a site with a subdomain or subfolder then, after configuring the domain in DNS, go back to the site and modifying the URL with the domain. For example: wp-1.com/travisloyd –> www.travisloyd.xyz