Docker Compose and WordPress
Use WordPress locally with Docker using Docker compose
This setup comes shipped with:
- A
Dockerfile
for extending a base image and using a custom Docker image with an automated build on Docker Hub - Custom domain for example
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.
- PhpMyAdmin - free and open source administration tool for MySQL and MariaDB
- CLI scripts
- Create a self signed SSL certificate for using https
- Trust certs in macOS System Keychain
- Setup the local domain in your in
/etc/hosts
Setup
Requirements
- Docker
- Openssl for creatng the SSL cert. Install using Homebrew
brew install openssl
Setup environment variables
Easily set your own local domain, db settings and more. Start by creating .env
files, like the examples below.
For Docker and the cli scripts
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_
For WordPress
Copy .env-example
in the src
folder to .env
and edit your preferences.
Use the following database settings:
DB_HOST=mysql:3306
DB_NAME=myapp
DB_USER=root
DB_PASSWORD=password
Create SSL cert
cd cli
./create-cert.sh
Note: OpenSSL needs to be installed.
Trust the cert in macOS Keychain
Chrome and Safari will trust the certs using this script.
In Firefox: Select Advanced, Select the Encryption tab, Click View Certificates. Navigate to where you stored the certificate and click Open, Click Import.
cd cli
./trust-cert.sh
Add the local domain in /etc/hosts
To be able to use for example https://myapp.local
in our browser, we need to modify the /etc/hosts
file on our local machine to point the custom domain name. The /etc/hosts
file contains a mapping of IP addresses to URLs.
cd cli
./setup-hosts-file.sh
The helper script can both add or remove a entry from /etc/hosts. First enter the domain name, then press "a" for add, or "r" to remove. Follow the instructions on the screen.
Install WordPress and Composer dependencies
cd src
docker-compose run composer install
If you have Composer installed on your computer you can also use
cd src && composer install
Run
docker-compose up -d
Docker Compose will 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
🚀 Open https://myapp.local in your browser
PhpMyAdmin
PhpMyAdmin comes installed as a service in docker-compose.
🚀 Open http://127.0.0.1:8080/ in your browser
Notes:
When making changes to the Dockerfile, use:
docker-compose up -d --force-recreate --build
Tools
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 like this
You can use this command first after you've installed WordPress using Composer as the example above.
Changelog
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.
Useful Docker Commands
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