Containerised Hosting [3/4]: Wordpress
Hello Everybody! Tansanrao here, Welcome to part 3 of the Containerised Hosting series, today we will be setting up Wordpress to run as a separate stack.
Step 1 - Create a docker compose file
version: "3.3"
services:
mysql:
image: mysql:8.0
container_name: mysql
restart: unless-stopped
env_file: .env
environment:
- MYSQL_DATABASE=wordpress
volumes:
- mysql:/var/lib/mysql
command: "--default-authentication-plugin=mysql_native_password"
networks:
- private
wordpress:
depends_on:
- mysql
container_name: wordpress
restart: unless-stopped
image: wordpress:5.5.0-php7.4-apache
env_file: .env
environment:
- WORDPRESS_DB_HOST=mysql:3306
- WORDPRESS_DB_USER=$MYSQL_USER
- WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
- WORDPRESS_DB_NAME=wordpress
labels:
- traefik.enable=true
- traefik.http.middlewares.redirect-websecure.redirectscheme.scheme=https
- traefik.http.routers.wordpress-web.rule=Host(`example.com`)
- traefik.http.routers.wordpress-web.entrypoints=web
- traefik.http.routers.wordpress-web.middlewares=redirect-websecure
- traefik.http.routers.wordpress-websecure.entrypoints=websecure
- traefik.http.routers.wordpress-websecure.rule=Host(`example.com`)
- traefik.tags=traefik-public
- traefik.docker.network=traefik-public
- traefik.http.routers.wordpress-websecure.tls=true
- traefik.http.routers.wordpress-websecure.tls.certresolver=myresolver
volumes:
- wordpress:/var/www/html/wp-content
- ./upload.ini:/usr/local/etc/php/conf.d/uploads.ini
networks:
- private
- traefik-public
volumes:
wordpress:
mysql:
networks:
private:
driver: bridge
traefik-public:
external: true
In the above docker-compose
file, we are defining 4 major things, The Database, The Wordpress Install, Persistent Volumes for the 2, and networks for the stack.
We first create the mysql
service using the image mysql:8.0
. We set the container name, set a restart policy to auto-restart the container unless manually stopped, we tell it to load environment variables from a file called .env
, and we assign the persistent volume mysql
as shown mysql:/var/lib/mysql
. We also pass the command flag "--default-authentication-plugin=mysql_native_password"
to force mysql 8.0 to use the older password scheme to maintain compatibility with mysql 5 clients.
Similarly we define the wordpress
service, we attach the volume wordpress
to wordpress:/var/www/html/wp-content
to provide persistence for uploaded content. We also pass in a custom upload.ini file to configure php like so ./upload.ini:/usr/local/etc/php/conf.d/uploads.ini
(more on this later).
The Traefik labels attached are explained in Part 2 of this series here.
We then define the required volumes and networks at the end of the file.
Step 2 - Create a .env file
Create a file called .env
in the same directory as the docker-compose
file
nano .env
Enter the following and make sure you change the passwords
MYSQL_ROOT_PASSWORD=ghost
MYSQL_USER=ghost
MYSQL_PASSWORD=ghost
This file is used to pass on the environment variables without adding credentials in the GitHub repo.
Step 3 - Create upload.ini to override php
Create a file called upload.ini
in the same directory as the docker-compose
file
nano upload.ini
Enter the following:
file_uploads = On
memory_limit = 512M
upload_max_filesize = 512M
post_max_size = 512M
max_execution_time = 600
This allows Wordpress to accept file uploads up to 500mb in size, and allows php execution to continue for 600 seconds before being killed.
And that’s it!
docker-compose up -d
And you are good to go!
As always, You can refer the repository here for the entire structure and final state of each file.
For any doubts, suggestions or issues, leave a comment below and I will get back to you asap! Follow me on Twitter & Instagram for behind the scenes and updates.