Docker Compose and WordPress
Use WordPress locally with Docker using Docker compose
Contents
- A
Dockerfile
for extending a base image and using a custom Docker image with an automated build on Docker Hub - PHP 8.1
- Custom domain and HTTPS support. So you can use for example https://myapp.local
- Custom nginx config in
./nginx
- Custom PHP
php.ini
config in./config
- Volumes for
nginx
,wordpress
andmariadb
- Bedrock - modern development tools, easier configuration, and an improved secured folder structure for WordPress
- Composer
- WP-CLI - WP-CLI is the command-line interface for WordPress.
- MailHog - An email testing tool for developers. Configure your outgoing SMTP server and view your outgoing email in a web UI.
- PhpMyAdmin - free and open source administration tool for MySQL and MariaDB
- PhpMyAdmin config in
./config
- PhpMyAdmin config in
- CLI script to create a SSL certificate
Instructions
Requirements
Install mkcert:
brew install mkcert
brew install nss # if you use Firefox
Setup
Setup Environment variables
Both step 1. and 2. below are required:
1. For Docker and the CLI script (Required step)
Copy .env.example
in the project root to .env
and edit your preferences.
Example:
IP=127.0.0.1
APP_NAME=myapp
DOMAIN="myapp.local"
DB_HOST=mysql
DB_NAME=myapp
DB_ROOT_PASSWORD=password
DB_TABLE_PREFIX=wp_
2. For WordPress (Required step)
Edit ./src/.env.example
to your needs. During the composer create-project
command described below, an ./src/.env
will be created.
Example:
DB_NAME='myapp'
DB_USER='root'
DB_PASSWORD='password'
# Optionally, you can use a data source name (DSN)
# When using a DSN, you can remove the DB_NAME, DB_USER, DB_PASSWORD, and DB_HOST variables
# DATABASE_URL='mysql://database_user:database_password@database_host:database_port/database_name'
# Optional variables
DB_HOST='mysql'
# DB_PREFIX='wp_'
WP_ENV='development'
WP_HOME='https://myapp.local'
WP_SITEURL="${WP_HOME}/wp"
WP_DEBUG_LOG=/path/to/debug.log
# Generate your keys here: https://roots.io/salts.html
AUTH_KEY='generateme'
SECURE_AUTH_KEY='generateme'
LOGGED_IN_KEY='generateme'
NONCE_KEY='generateme'
AUTH_SALT='generateme'
SECURE_AUTH_SALT='generateme'
LOGGED_IN_SALT='generateme'
NONCE_SALT='generateme'
Option 1). Use HTTPS with a custom domain
- Create a SSL cert:
cd cli
./create-cert.sh
This script will create a locally-trusted development certificates. It requires no configuration.
mkcert needs to be installed like described in Requirements. Read more for Windows and Linux
1b. Make sure your /etc/hosts
file has a record for used domains. On Windows the hosts file can be find at C:\Windows\System32\drivers\etc
. Make sure to open it with admin rights.
sudo nano /etc/hosts
Add your selected domain like this:
127.0.0.1 myapp.local
- Continue on the Install step below
Option 2). Use a simple config
- Edit
nginx/default.conf.conf
to use this simpler config (without using a cert and HTTPS)
server {
listen 80;
root /var/www/html/web;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
client_max_body_size 100M;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
- Edit the nginx service in
docker-compose.yml
to use port 80. 443 is not needed now.
nginx:
image: nginx:latest
container_name: ${APP_NAME}-nginx
ports:
- '80:80'
- Continue on the Install step below
Install
docker-compose run composer create-project
Run
docker-compose up
Docker Compose will now start all the services for you:
Starting myapp-mysql ... done
Starting myapp-composer ... done
Starting myapp-phpmyadmin ... done
Starting myapp-wordpress ... done
Starting myapp-nginx ... done
Starting myapp-mailhog ... done
PhpMyAdmin
PhpMyAdmin comes installed as a service in docker-compose.
MailHog
MailHog comes installed as a service in docker-compose.
Tools
Update WordPress Core and Composer packages (plugins/themes)
docker-compose run composer update
Use WP-CLI
docker exec -it myapp-wordpress bash
Login to the container
wp search-replace https://olddomain.com https://newdomain.com --allow-root
Run a wp-cli command
You can use this command first after you've installed WordPress using Composer as the example above.
Update plugins and themes from wp-admin?
You can, but I recommend to use Composer for this only. But to enable this edit ./src/config/environments/development.php
(for example to use it in Dev)
Config::define('DISALLOW_FILE_EDIT', false);
Config::define('DISALLOW_FILE_MODS', false);
Useful Docker Commands
When making changes to the Dockerfile, use:
docker-compose up -d --force-recreate --build
Login to the docker container
docker exec -it myapp-wordpress bash
Stop
docker-compose stop
Down (stop and remove)
docker-compose down
Cleanup
docker-compose rm -v
Recreate
docker-compose up -d --force-recreate
Rebuild docker container when Dockerfile has changed
docker-compose up -d --force-recreate --build
Changelog
2022-05-28
- Use PHP 8.1 Dockerfile is updated.
2022-05-28
2022-05-28
- Updated the Docker image to use PHP 8
2021-08-04
- Updated to WordPress 5.8.0
2021-03-16
- Changed root
.env-example
to.env.example
to match the git ignore patterns. Thanks @scottnunemacher
2021-03-05
- Clarify steps in the readme
2021-03-02
- Fixed a misstake so instead of
./src/.env-example
, it should be./src/.env.example
. - Redirect HTTP to HTTPS. Thanks @humblecoder
2021-01-02
- Use
NGINX_ENVSUBST_TEMPLATE_SUFFIX
. Use a template and better substution of ENV variables in nginx config.
2020-10-04
- Added mariadb-client (Solves #54)
2020-09-15
- Updated Bedrock. Update WordPress to 5.5.1 and other composer updates.
2020-07-12
- Added Mailhog. Thanks @mortensassi
2020-05-03
- Added nginx gzip compression
2020-04-19
- Added Windows support for creating SSH cert, trusting it and setting up the host file entry. Thanks to @styssi
2020-04-12
- Remove port number from
DB_HOST
. Generated database connection error in macOS Catalina. Thanks to @nirvanadev - Add missing ENV variable from mariadb Thanks to @vonwa
2020-03-26
- Added phpMyAdmin config.Thanks to @titoffanton
2020-02-06
- Readme improvements. Explain
/etc/hosts
better
2020-01-30
- Use
Entrypoint
command in Docker Compose to replace the domain name in the nginx config. Removing the need to manually edit the domain name in the nginx conf. Now using the.env
valueDOMAIN
- Added APP_NAME in
.env-example
Thanks to @Dave3o3
2020-01-11
- Added
.env
support for specifying your own app name, domain etc in Docker and cli scripts. - Added phpMyAdmin. Visit http://127.0.0.1:8080/
2019-08-02
- Added Linux support. Thanks to @faysal-ishtiaq.