How to Dockerize Your WordPress Website Like a Boss

Published by brockheriondev@gmail.com on

I love Docker. It is an absolutely wonderful piece of technology. The ability to spin up any project in a container on any OS and deploy it to virtually any OS with little to no configuration is astounding. You can spin up an entire database or .NET app or, as I have been playing with recently, an entire WordPress installation. Using Docker and WordPress together has been nothing short of beautiful and in this post, I am going to show you how you can Dockerize your WordPress websites.

The motivation to Dockerize WordPress


Because I’m still relatively new to WordPress, I decided that this would be the best way to get more familiar with the platform. PHP is not a language I use on a day-to-day basis and MySQL is definitely not my first choice in databases. But as I read about it and learned more about the platform, I decided that I wanted to get to a real, hands-on experience with it.


I decided the best way to learn WordPress was to develop a theme or a plugin. This meant I had to install PHP, WordPress, and MySQL or MariaDB on my desktop, and possibly a laptop, should I decided to learn on the couch or something. To make matters more difficult, my desktop PC is running Windows 10 and my laptop is a MacBook Pro.


Enter Docker, my knight in shining armor. I had played around with Docker plenty of times before and had used it once in a production environment. What I had not done was developed an entire stack using Docker Compose to manage the whole thing. This, as it would turn out, was the right move for me. It solved my cross-platform issues, I didn’t have to install anymore tooling or databases on my systems, and I was free to spin up as many instances as I wanted to without having to delete a ton of files.

Project Setup

For this tutorial, I am going to assume if you are reading this that you have both Docker and Docker Compose all set up on your system. If you don’t, there are a lot of great tutorials on the internet for getting setup. Check out Docker’s website for more information on the platform or its documentation. Now, let’s get started!

Open up a command prompt or terminal and find the location you want your site to live locally. Then, run

mkdir my-wordpress-docker-site && \
cd my-wordpress-docker-site

This will put you in the folder you just created. We are now ready to get our Docker Compose file setup!

Let the Dockerizing of WordPress Begin

Lets’s start by opening up this folder in your favorite editor. I prefer using Visual Studio Code, but Atom, PHP Storm, and others should do just fine.
Once in your folder, create a file named docker-compose.yml. Open your newly created file and let’s start adding our configuration!
The first line we want to add is

version: '3'

This tells Docker Compose we want to use version 3 for file formatting. At the time of writing this, the latest version is 3.8.


Next, we need to add two sections, one to define and configure our services and the other to mount our volumes. Let’s go ahead and add the following lines

services:

volumes:

Be sure to place both of these under your version declaration!

Setting up the Database

Now, let’s add in our database service. For this install, I chose MariaDB over MySQL. MariaDB is an alternative database to MySQL, created by the guy who originally created MySQL. You can very easily do a MySQL configuration here as well if you prefer, the setup is nearly identical.


Let’s add the following section under services

db:
    image: mariadb:10.5
    volumes:
    - db_data:/var/lib/mysql
    restart: always
    environment:
        MYSQL_ROOT_PASSWORD: <your-root-password>
        MYSQL_DATABASE: <your-database-name>
        MYSQL_USER: <your-user-name>
        MYSQL_PASSWORD: <your-user-password>

This is all that’s needed to spin up a new MySQL/MariaDB instance in Docker. Pretty cool right?


We now need to go under our volumes section and add-in

db_data:

What this will do is map the /var/lib/mysql folder in the Docker container to a folder called db_data. Our data will now be persisted whenever we spin up or shutdown our containers.


We are now ready to Dockerize WordPress!

The way to Dockerize WordPress

Head back up to your services section and add the following configuration

wordpress:
    depends_on: db
    image: wordpress:latest
        ports: 
            - "8000:80"
        restart: always
        volumes: 
            - ./wordpress:/var/www/html/
        environment: 
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: <your-db-user>
            WORDPRESS_DB_PASSWORD: <your-db-password>
            WORDPRESS_DB_NAME: <your-database-name>

Note that we added depends_on:db here. We are telling Docker that this service requires our database to be ready to go before WordPress can spin up. This will prevent WordPress from trying to connect to a database that might or might no be ready to go. We are also mapping port 8000 on our system to port 80 in the container.

Fire up Your Website

Now, all you have to do is run

docker-compose-up

in your command line and let Docker do its thing.


Once it’s done, you should be able to visit http://localhost:8000 and land on the default WordPress setup page. In your folder, you should now see a wordpress folder. This now will contain the entire WordPress install that you can manage. You can add or develop themes and plugins and add them in here.


One thing to note here, as mentioned in the WordPress official Docker page, is that this image does not contain any other PHP extensions or libraries that some plugins require. If you do need them, you might want to find a different image or create your own Dockerfile to add them in.

The Final docker-compose File

version: '3'

services:
    db:
        image: mariadb:10.5
        volumes:
        - db_data:/var/lib/mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: <your-root-password>
            MYSQL_DATABASE: <your-database-name>
            MYSQL_USER: <your-user-name>
            MYSQL_PASSWORD: <your-user-password>

    wordpress:
        depends_on: db
        image: wordpress:latest
            ports: 
                - "8000:80"
            restart: always
            volumes: 
                - ./wordpress:/var/www/html/
            environment: 
                WORDPRESS_DB_HOST: db:3306
                WORDPRESS_DB_USER: <your-db-user>
                WORDPRESS_DB_PASSWORD: <your-db-password>
                WORDPRESS_DB_NAME: <your-database-name>

volumes:
    db_data:

Wrapping up

I would like to thank you for taking the time to read through this and I hope I was able to help you get WordPress up and running in Docker. Docker really is an amazing piece of technology that makes development much easier. When you are ready to deploy now, you can deploy to something like Azure App Service or a Kubernetes cluster or, now that you have everything mapped locally, just package your site up and ship it to something like SiteGround or Digital Ocean. It’s that easy.


For more information on the Docker WordPress image, check out https://hub.docker.com/_/wordpress



1 Comment

Adam · January 19, 2021 at 5:34 pm

Great post!

Leave a Reply

Your email address will not be published. Required fields are marked *