A Docker Wordpress development environment by the team at Visible and some awesome contributors. Our goal is to make Wordpress development slightly less frustrating.
- Introduction
- Example
- Requirements
- Getting Started
- Available Images
- Default Wordpress Admin Credentials
- Default Database Credentials
- Service Environment Variables
- Workflow Tips
- Using in Production
- Contributing
We wrote a series of articles explaining in depth the philosophy behind this project:
- Intro: A slightly less shitty WordPress developer workflow
- Part 1: Setup a local development environment for WordPress with Docker
- Part 2: Setup an asset pipeline for WordPress theme development
- Part 3: Optimize your wordpress theme assets and deploy to S3
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.
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 https://github.com/visiblevc/wordpress-starter.git
# navigate to example directory
cd wordpress-starter/example
# start the website at localhost:8080
docker-compose up -d && docker-compose logs -f wordpress
# stop the website
docker-compose stop
# ssh in to running wordpress site
docker exec -it example_wordpress_1 /bin/bash
(where example_wordpress_1 matches the services in your docker-compose.yml)
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,127.0.0.1,8080,,8080"
. If you use
another port than 8080
, change it in the command.
PHP Version | Tags |
---|---|
7.1 | latest 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
To access the Wordpress Admin at /wp-admin
, the default values are as follows:
Credential | Value | Notes |
---|---|---|
Username or Email | root or admin@wordpress.com |
Can be changed with the ADMIN_EMAIL environment variable |
Password | root |
Uses the same value as the DB_PASS environment variable |
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 |
Notes:
- 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 |
SERVER_NAME |
localhost |
Set this to <your-domain-name>.<your-domain-extension> if you plan on obtaining SSL certificates |
ADMIN_EMAIL |
admin@${DB_NAME}.com |
Administrator email address |
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 |
Comma-separated list of themes you want to install in either of the following forms
|
|
PLUGINS |
Comma-separated list of plugins you want to install in either of the following forms:
|
|
MULTISITE |
'false' |
Set to 'true' to enable multisite |
PERMALINKS |
/%year%/%monthnum%/%postname%/ |
A valid WordPress permalink structure tag |
URL_REPLACE |
Comma-separated string in the form of current-url,replacement-url
|
Variable | Default Value | Description |
---|---|---|
MYSQL_ROOT_PASSWORD ✅ |
Must match DB_PASS of the wordpress service |
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
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 'wp db export /data --allow-root'
Finally, sometimes your development environment runs on a different domain than your live one. The
live will be example.com
and the development localhost:8080
. This project does a search and
replace for you. You can set the URL_REPLACE: example.com,localhost:8080
environment variable in
the docker-compose.yml
.
# If something isn't shown, assume it's the same as the examples above
version: '3'
services:
wordpress:
ports:
- 80:80
- 443:443
restart: always
environment:
SERVER_NAME: mysite.com
DB_PASS: ${SECURE_PASSWORD} # Stored in .env file
volumes:
- ./letsencrypt:/etc/letsencrypt
- ./data:/data
# anything else you'd like to be able to back up
db:
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${SECURE_PASSWORD} # Stored in .env file
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.
$ docker-compose ps
Name Command State
---------------------------------------------------------
project_db_1 docker-entrypoint.sh mysqld Up
project_wordpress_1 docker-php-entrypoint /run.sh Up
$ docker-compose exec wordpress /bin/bash
root@4e16c7fe4a10:/app# certbot --apache
$ docker-compose ps
Name Command State
---------------------------------------------------------
project_db_1 docker-entrypoint.sh mysqld Up
project_wordpress_1 docker-php-entrypoint /run.sh Up
$ docker-compose exec wordpress /bin/bash
root@4e16c7fe4a10:/app# certbot renew
You can find Development instructions in the Wiki.