Set up WordPress With Docker for Local Development
There are a couple of things you need to set up before you can begin work on a WordPress project. The most common stack for running WordPress is called LAMP, which stands for Linux, Apache, MySQL and PHP.
But, what if you don’t want to install or manage the versions of each part of the stack on your development machine? Docker is the solution.
Using the official WordPress Docker image combined with Compose, you can set up the needed development environment for WordPress.
Setting up WordPress Locally With Docker
To set up a WordPress project locally using Docker, you will need to create a docker-compose.yml
file. In the file, you will set up two services — one for WordPress, and one for the MySQL database.
These are the steps to create a local WordPress setup:
-
Create your project folder and an empty
docker-compose.yml
file inside of itwp-project/ ├─ docker-compose.yml
-
Optionally, you can create a
.env
file next todocker-compose.yml
to store configuration variables. You can skip this if want to just type the configuration data right insidedocker-compose.yml
in step 3MYSQL_DATABASE=wp_db MYSQL_USER=wp_user MYSQL_PASSWORD=wp_user_password MYSQL_ROOT_PASSWORD=wp_root_password MYSQL_HOST=database:3306 # use the same name as database service
Use the same name as database service from step 3 for the host address of your database stored in
MYSQL_HOST
. -
Edit the
docker-compose.yml
file and add the following configurationservices: wordpress: depends_on: - database image: wordpress ports: - 80:80 environment: WORDPRESS_DB_HOST: '${MYSQL_HOST}' WORDPRESS_DB_NAME: '${MYSQL_DATABASE}' WORDPRESS_DB_USER: '${MYSQL_USER}' WORDPRESS_DB_PASSWORD: '${MYSQL_PASSWORD}' volumes: - ./wp-content:/var/www/html/wp-content database: image: mysql:latest ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: '${MYSQL_ROOT_PASSWORD}' MYSQL_DATABASE: '${MYSQL_DATABASE}' MYSQL_USER: '${MYSQL_USER}' MYSQL_PASSWORD: '${MYSQL_PASSWORD}' volumes: - mysql-data:/var/lib/mysql volumes: mysql-data:
If you set up a
.env
file, Compose will automatically use it. Otherwise, replace the variables starting with$
sign with actual config values.There are a couple of things happening in this
docker-compose.yml
file:database
service sets up a new database specified inMYSQL_DATABASE
and creates a user withMYSQL_USER
as name andMYSQL_PASSWORD
as passwordwordpress
serviceenvironment
variables contain the configuration used to connect to the MySQL database- the
environment
variable values can be changed to whatever you want, but they need to be the same forwordpress
anddatabase
mysql-data
volume is created to preserve data inside MySQL database between Docker restartsvolumes
inwordpress
create a mount ofwp-content
folder from the container to host, that way you can edit WordPress files locally
-
Run
docker compose up
from the project folder to start the WordPress and MySQL containers. The first time you run this command it can take a while to download both images.
Now you should be able to visit localhost
in your browser and install WordPress.
If you are not using the mysql:latest
image, but mysql:5.7
, your database service might be exiting. Most likely it’s due to the container’s lack of available memory. The solution is to allocate more memory.
You can allocate more memory to a service in docker-compose.yml
like this:
services:
database:
image: mysql:5.7
mem_limit: 2048m # allocate more memory as needed
Editing WordPress Files
If you have correctly mounted the wp-content
folder to your host machine, you can edit or create themes and plugins with ease.
Let’s say you want to edit the default Twenty Twenty-Three theme that WordPress comes with.
Open the twentytwentythree
folder inside your project/wp-content/themes/
folder with your code editor.
If you want to remove default WordPress styling, create a functions.php
in the root of the theme directory and add the following code:
<?php
function remove_global_styles(){
wp_dequeue_style('global-styles');
}
add_action('wp_enqueue_scripts', 'remove_global_styles');
If you can’t edit any files due to lack of permissions, you can fix that using chown
command.
sudo chown -R username:username /path/to/project
Substitute username
with the name of your user that you use in your terminal.
For example, if you have opened your project in terminal already, you can use current path (.
):
sudo chown -R john:john .
Now edit style.css
and add your custom CSS.
body {
background-color: #e9e9e9;
}
And edit functions.php
by adding the following code to load the CSS file in the theme.
function add_custom_styles() {
wp_enqueue_style('custom-styles', get_stylesheet_uri() );
}
add_action('wp_enqueue_scripts', 'add_custom_styles');
Congratulations, now you can work on your WordPress project running inside Docker.