Docker is a great tool for developing WordPress locally. Don’t worry if the code below looks confusing. I’ll go through it line by line.
Before we begin, if you just looking for quick a boilerplate, go to the tl;dr section at the bottom of the page.
First of all, create a new folder.
cd ~/Code && mkdir wpdocker
Create a file called docker-compose.yml in the folder.
cd wpdocker && touch docker-compose.yml
Go ahead and create a couple folders which we’ll need later on.
cd ~/Code/wpdocker
mkdir -p docker/data/mysql
Here’s the whole docker-compose.yml file.
version: "3.5" services: db: image: mysql:8.0 command: --default-authentication-plugin=mysql_native_password volumes: - "./docker/data/db/mysql:/var/lib/mysql" environment: MYSQL_DATABASE: wordpressdb MYSQL_ROOT_PASSWORD: wordpress MYSQL_PASSWORD: wordpress MYSQL_USER: wordpress ports: - 33061:3306 wordpress: depends_on: - db image: wordpress:latest volumes: - ./:/var/www/html/wp-content ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpressdb
version: "3.5"
This is the version of Docker that we’re using.
services:
Docker calls these services, but they are also the containers.
db: image: mysql:8.0 command: --default-authentication-plugin=mysql_native_password volumes: - "./docker/data/db/mysql:/var/lib/mysql" environment: MYSQL_DATABASE: somewordpress MYSQL_ROOT_PASSWORD: wordpress MYSQL_PASSWORD: wordpress MYSQL_USER: wordpress ports: - 33061:3306
The db container is the database that WordPress will use.
image: mysql:8.0
For the database container, we’ll use version 8.0 of MySQL.
command: --default-authentication-plugin=mysql_native_password
This part is necessary for MySQL 8.0. The WordPress container won’t be able to access the database without this line.
volumes:
By default, Docker doesn’t persist any data. We have to explicitly tell Docker where to store files and data using volumes.
- "./docker/data/db/mysql:/var/lib/mysql"
We want to persist the data in our database. We’re going to persist the data (/var/lib/mysql) in a folder on our host machine (./docker/data/db/mysql). We created those folders earlier.
environment:
The MySQL image will use these variables in the container. They are pretty self-explanatory. You’ll also use these variables to connect to the database using a local client like Sequel Pro or TablePlus.
ports:
Normally, we wouldn’t be able to access ports that the container is using. We can tell Docker that we want to access a port in a container through a port from the host.
– 33061:3306
Port 33061 is the port in the host, and 3306 is the port in the container.
wordpress: depends_on: - db image: wordpress:latest volumes: - ./:/var/www/html/wp-content ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: somewordpress
The WordPress container is where all of the WordPress files come from. It depends on the db container and connects our wpdocker folder to the wp-content folder. We can see the WordPress site by visiting localhost:8000 in the browser. Under the environment, we specify what variables to use to connect to the database we set up earlier.
tl;dr
If you’re just looking for the boilerplate, download the git repo and spin up the containers.
https://github.com/paircodegroup/wpdocker
cd ~/Code && git clone https://github.com/paircodegroup/wpdocker.git mysite
cd mysite && docker-compose up -d –build
Now, visit localhost:8000/wp-admin to get the installation started.