Skip to content
A slightly less shitty wordpress development workflow
Branch: master
Clone or download
Latest commit d990976 May 12, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Large refactor + improvements (#97) May 23, 2017
example add /docker-entrypoint-initwp.d/ init scripts directory (#150) Dec 14, 2018
.editorconfig various improvements and build updates (#130) Apr 14, 2018
.gitignore various improvements and build updates (#130) Apr 14, 2018 add missing site health extensions (#154) May 12, 2019
Dockerfile add missing site health extensions (#154) May 12, 2019 add /docker-entrypoint-initwp.d/ init scripts directory (#150) Dec 14, 2018
package.json v0.23.0 May 12, 2019 add /docker-entrypoint-initwp.d/ init scripts directory (#150) Dec 14, 2018

Visible Wordpress Starter

A Docker Wordpress development environment by the team at Visible and some awesome contributors. Our goal is to make Wordpress development slightly less frustrating.


We wrote a series of articles explaining in depth the philosophy behind this project:


Well, to run a Docker environment, you will need Docker. The Dockerfile is only for an Apache+PHP+Wordpress container, you will need a MySQL or MariaDB container to run a website. We use Docker Compose 1.6+ for the orchestration.

Getting started

This project has 2 parts: the Docker environment and a set of tools for theme development. To quickly get started, you can simply run the following:

# copy the files
git clone

# navigate to example directory
cd wordpress-starter/example

# start the website at localhost:8080
docker-compose up -d && docker-compose logs -f wordpress

NOTE: If you run on MacOS with Docker in VirtualBox, you will want to forward the port by running this VBoxManage controlvm vm-name natpf1 "tcp8080,tcp,,8080,,8080". If you use another port than 8080, change it in the command.

Available Images

PHP Version Tags
7.3 latest latest-php7.3 <version>-php7.3
7.2 latest-php7.2 <version>-php7.2
7.1 latest-php7.1 <version>-php7.1
7.0 latest-php7.0 <version>-php7.0
5.6 latest-php5.6 <version>-php5.6

If you need a specific version, look at the Changelog

Default Wordpress Admin Credentials

To access the Wordpress Admin at /wp-admin, the default values are as follows:

Credential Value Notes
Username or Email root or Can be changed with the ADMIN_EMAIL environment variable
Password root Uses the same value as the DB_PASS environment variable

Default Database Credentials

Credential Value Notes
Hostname db Can be changed with the DB_HOST environment variable NOTE:: Must match database service name
Username root
Password Must be set using the DB_PASS environment variable
Database Name wordpress Can be changed with the DB_NAME environment variable
Admin Email admin@${DB_NAME}.com

Service Environment Variables


  • Variables marked with are required
  • Single quotes must surround boolean environment variables


Variable Default Value Description
DB_USER root Username for both the database and the WordPress installation (if not importing existing)
DB_PASS Password for the database. Value must match MYSQL_ROOT_PASSWORD set in the db service
DB_HOST db Hostname for the database
DB_NAME wordpress Name of the database
DB_PREFIX wp_ Prefix for the database
DB_CHARSET utf8 Select a charset for the wordpress database (legacy versions might not be utf8)
SERVER_NAME localhost Set this to <your-domain-name>.<your-top-level-domain> if you plan on obtaining SSL certificates
ADMIN_EMAIL admin@${DB_NAME}.com Administrator email address
WP_LOCALE en_US Set the site language
WP_DEBUG 'false' Click here for more information
WP_DEBUG_DISPLAY 'false' Click here for more information
WP_DEBUG_LOG 'false' Click here for more information
WP_VERSION latest Specify the WordPress version to install. Accepts any valid semver number, latest, or nightly for beta builds.
THEMES Space-separated list of themes you want to install in either of the following forms
  • theme-slug: Used when installing theme direct from
  • [theme-slug] Used when installing theme from URL
PLUGINS Space-separated list of plugins you want to install in either of the following forms:
  • plugin-slug: Used when installing plugin direct from
  • [plugin-slug] Used when installing plugin from URL.
MULTISITE 'false' Set to 'true' to enable multisite
PERMALINKS /%year%/%monthnum%/%postname%/ A valid WordPress permalink structure tag

Value must be a full replacement URL to use in development environments if importing a database for development use.

Example: If your live site's URL is and you intend to use the database on port 8080 of localhost, this value should be set to http://localhost:8080.

Note: If you are running Docker using Docker Machine, your replacement url MUST be the output of the following command: echo $(docker-machine ip <your-machine-name>):8080


Extra PHP code to add to wp-config.php. Click here for more information.

IMPORTANT NOTE: All $ symbols must be escaped by prepending an extra $, otherwise it will be interpreted by docker as an environment variable. In other words, $variable must be $$variable.


Variable Default Value Description
MYSQL_ROOT_PASSWORD Must match DB_PASS of the wordpress service

Workflow Tips

Using wp-cli

You can access wp-cli by running npm run wp .... Here are some examples:

npm run wp plugin install <some-plugin>
npm run wp db import /data/database.sql

Working with Databases

If you have an exported .sql file from an existing website, drop the file into the data/ folder. The first time you run the container, it will detect the SQL dump and use it as a database. If it doesn't find one, it will create a fresh database.

If the SQL dump changes for some reason, you can reload the database by running:

docker-compose exec wordpress /bin/bash "wp db import $(find /data/*.sql | head -n 1) --allow-root"

If you want to create a dump of your development database, you can run:

docker-compose exec wordpress /bin/bash -c 'wp db export /data/dump.sql --allow-root'

Finally, sometimes your development environment runs on a different domain than your live one. The live will be and the development localhost:8080. This project does a search and replace for you. You can set the URL_REPLACE: localhost:8080 environment variable in the docker-compose.yml.

Using in Production

Adjustments to docker-compose.yml

# If something isn't shown, assume it's the same as the examples above
version: "3"
            - 80:80
            - 443:443
        restart: always
            DB_PASS: ${SECURE_PASSWORD} # Stored in .env file
            - ./letsencrypt:/etc/letsencrypt
            - ./data:/data
            # anything else you'd like to be able to back up
        restart: always
            MYSQL_ROOT_PASSWORD: ${SECURE_PASSWORD} # Stored in .env file

SSL Certificates

We highly recommend securing your site with SSL encryption. The Let's Encrypt and Certbot projects have made doing this both free (as in beer) and painless. We've incorporated these projects into this project.

Assuming your site is running on your production host, follow the below steps to obtain and renew SSL certificates.

Obtaining Certificates

You should first set SERVER_NAME to <your-domain-name>.<your-top-level-domain> in your docker-compose.yml

$ docker-compose ps
Name                   Command                        State
project_db_1  mysqld     Up
project_wordpress_1    docker-php-entrypoint /   Up

$ docker-compose exec wordpress /bin/bash
root@4e16c7fe4a10:/app# certbot --apache

Renewing Certificates

$ docker-compose ps
Name                   Command                        State
project_db_1  mysqld     Up
project_wordpress_1    docker-php-entrypoint /   Up

$ docker-compose exec wordpress /bin/bash
root@4e16c7fe4a10:/app# certbot renew


You can find Development instructions in the Wiki.

You can’t perform that action at this time.