Use WordPress locally with Docker using Docker compose
- A
Dockerfilefor extending a base image and using a custom Docker image with an automated build on Docker Hub - PHP 7.4
- Custom domain for example
myapp.local - Custom nginx config in
./nginx - Custom PHP
php.iniconfig in./config - Volumes for
nginx,wordpressandmariadb - 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
Requirements
Install mkcert:
brew install mkcert
brew install nss # if you use Firefox
Setup
Both step 1. and 2. below are required:
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_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.shThis 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.
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.confto 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.ymlto 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-projectRun
docker-compose upDocker 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π Open https://myapp.local in your browser
PhpMyAdmin comes installed as a service in docker-compose.
π Open http://127.0.0.1:8082/ in your browser
MailHog comes installed as a service in docker-compose.
π Open http://0.0.0.0:8025/ in your browser
Tools
docker-compose run composer updatedocker exec -it myapp-wordpress bashLogin to the container
wp search-replace https://olddomain.com https://newdomain.com --allow-rootRun a wp-cli command
You can use this command first after you've installed WordPress using Composer as the example above.
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);When making changes to the Dockerfile, use:
docker-compose up -d --force-recreate --buildLogin to the docker container
docker exec -it myapp-wordpress bashStop
docker-compose stopDown (stop and remove)
docker-compose downCleanup
docker-compose rm -vRecreate
docker-compose up -d --force-recreateRebuild docker container when Dockerfile has changed
docker-compose up -d --force-recreate --buildChangelog
- Updated to WordPress 5.8.0
- Changed root
.env-exampleto.env.exampleto match the git ignore patterns. Thanks @scottnunemacher
- Clarify steps in the readme
- Fixed a misstake so instead of
./src/.env-example, it should be./src/.env.example. - Redirect HTTP to HTTPS. Thanks @humblecoder
- Use
NGINX_ENVSUBST_TEMPLATE_SUFFIX. Use a template and better substution of ENV variables in nginx config.
- Added mariadb-client (Solves #54)
- Updated Bedrock. Update WordPress to 5.5.1 and other composer updates.
- Added Mailhog. Thanks @mortensassi
- Added nginx gzip compression
- Added Windows support for creating SSH cert, trusting it and setting up the host file entry. Thanks to @styssi
- 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
- Added phpMyAdmin config.Thanks to @titoffanton
- Readme improvements. Explain
/etc/hostsbetter
- Use
Entrypointcommand 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.envvalueDOMAIN - Added APP_NAME in
.env-exampleThanks to @Dave3o3
- Added
.envsupport for specifying your own app name, domain etc in Docker and cli scripts. - Added phpMyAdmin. Visit http://127.0.0.1:8080/
- Added Linux support. Thanks to @faysal-ishtiaq.