Need help with wordpress-nginx-docker-compose?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

urre
564 Stars 235 Forks 182 Commits 3 Opened issues

Description

Run WordPress with nginx using Docker Compose.

Services available

!
?

Need anything else?

Contributors list

# 48,132
React
CSS
PHP
wp-cli
139 commits
# 224,283
PHP
wp-cli
WordPre...
nginx
5 commits
# 301,382
PHP
phpmyad...
WordPre...
nginx
2 commits
# 301,732
PHP
phpmyad...
bedrock
WordPre...
2 commits
# 359,508
PHP
phpmyad...
bedrock
WordPre...
1 commit
# 102,650
ionic
cordova...
TypeScr...
nginx
1 commit
# 364,128
PHP
phpmyad...
bedrock
WordPre...
1 commit
# 275,871
PHP
WordPre...
phpmyad...
bedrock
1 commit
# 350,384
phpmyad...
WordPre...
nginx
C++
1 commit

Docker Compose and WordPress

Build Status

Donate

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 7.4
  • Custom domain for example
    myapp.local
  • Custom nginx config in
    ./nginx
  • Custom PHP
    php.ini
    config in
    ./config
  • Volumes for
    nginx
    ,
    wordpress
    and
    mariadb
  • 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
  • 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:[email protected]_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
  1. 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.

sudo nano /etc/hosts

Add your selected domain like this:

127.0.0.1 myapp.local
  1. Continue on the Install step below
Option 2). Use a simple config
  1. 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;
    }
}
  1. 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'
  1. 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

🚀 Open https://myapp.local in your browser

PhpMyAdmin

PhpMyAdmin comes installed as a service in docker-compose.

🚀 Open http://127.0.0.1:8082/ in your browser

MailHog

MailHog comes installed as a service in docker-compose.

🚀 Open http://0.0.0.0:8025/ in your browser

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

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 value DOMAIN
  • 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

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.