Using Docker for local WordPress Development

docker-compose for local development with an existing Wordpress site

Posted on May 31, 2019

I’ve worked extensively with WordPress in the past but my main focus over the last few years has been Javascript – Because of this I didn’t want to setup an apache server locally or install MAMP, so I decided Docker was the way to go for local WordPress development.

The first thing you need to do is install Docker desktop which can be found here: https://www.docker.com/products/docker-desktop

Once you’ve installed docker you’ll need to:

  • Checkout your WordPress project.
  • Add the following code to a docker-compose.yml file in the root of your project.
  • Create a /data folder in the root of your project.
  • Add a dump of your database to the /data folder.
  • Add a migrate.sql file to the /data folder containing the sql commands below (this will update the URLs in your database once it’s been imported).
  • Update the oldUrl placeholder in the migrate.sql file.

Once this has been done you should be able to run docker-compose up via the command line and view your site at http://localhost:3500.

As we’re mapping the template directory from your local files into the docker image, you can update your local template files and refresh the browser to view the changes.

I’ve commented the docker-compose.yml file to try and make it as obvious as possible whats going on, but here’s a break down of what we’re doing.

  • Creating a MySQL database container, setting the root password, creating a database called ‘wordpress’ and creating a user.
  • Mapping our container database port (3306) to 3400 so we can access the database on our host machine via a third party app. I use Sequel Pro.
  • Downloading the latest Version of the WordPress Docker Image.
  • Mapping the containers port 80 to 3500 so we can access it locally in browser at http://localhost:3500
  • Updating the wp-config file with the user and database details we created above.
  • Mapping our theme, plugins and uploads folder to the container.

And there we have it – a simple docker setup for local WordPress development without the need for setting up a local http server or installing MAMP.

The code for your docker-compose.yml and migrate.sql files can be found below.

Accessing the database using Sequel Pro

You can access the MySQL database in the docker container with the following settings:

Host: 127.0.0.1
Username: user
Database: wordpress
Password: password
Port: 3400 (We mapped the default port 3306 to port 3400 on our host machine in the docker-compose.yml file)

docker-compose.yml file

version: '3.3'

services:
    db:
        image: mysql:5.7
        volumes:
            - ./data:/docker-entrypoint-initdb.d # This will import DB data from an sql file in your /data folder
            - ./data/migrate.sql:/docker-entrypoint-initdb.d/data/migrate.sql # run sql commands in migrate.sql to update site urls in DB
        restart: always
        ports:
            - "3400:3306" # mapping our ports for networking
        environment:
            MYSQL_ROOT_PASSWORD: testRootPassword
            MYSQL_DATABASE: wordpress
            MYSQL_USER: user
            MYSQL_PASSWORD: password
    wordpress:
        build:
          context: .
        depends_on:
            - db
        image: wordpress:latest
        ports:
            - "3500:80" # mapping our ports for networking
        restart: always
        environment:
            WORDPRESS_DB_HOST: db:3306 # Docker will automatically update the wp-config file with these details when using a WordPress image
            WORDPRESS_DB_USER: user
            WORDPRESS_DB_PASSWORD: password
            WORDPRESS_DB_NAME: wordpress
        volumes: # this is where we tell Docker what to pay attention to
            - ./wp-content/themes/my-theme-name:/var/www/html/wp-content/themes/my-theme-name # map theme to container
            - ./wp-content/plugins:/var/www/html/wp-content/plugins # map plugins to container
            - ./wp-content/uploads:/var/www/html/wp-content/uploads # map uploads to container

migrate.sql file

UPDATE wp_options SET option_value = replace(option_value, 'oldUrl', 'http://localhost:3500') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET guid = replace(guid, 'oldUrl','http://localhost:3500');
UPDATE wp_posts SET post_content = replace(post_content, 'oldUrl', 'http://localhost:3500');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'oldUrl','http://localhost:3500');