WordPress with MySQL
Last updated
Was this helpful?
Last updated
Was this helpful?
In this tutorial, you'll learn how to deploy WordPress and MySQL on Release.
Using Docker Compose during WordPress theme or plugin development ensures that your development and build environments can be recreated easily on your team's workstations and staging servers.
By adding your WordPress repository to Release, you can create environments per branch, create staging environments, test contributors' pull requests, and share demo links with clients.
For this tutorial, we'll start with the example from . To simplify getting started, we've created a repository with only the wordpress-mysql
folder from the Awesome Compose repository: .
and (GitHub, Bitbucket, or GitLab) account.
Besides a web browser, you won't need anything specific installed on your computer for this guide.
wordpress-mysql
example repositoryFork the repository to a private or public repository in your version control hosting service.
The docker-compose.yaml
file lists two services for this application: db
and wordpress
.
The service called db
runs a specific mysql
Docker image, while the wordpress
service runs the latest wordpress
Docker image.
Release can import applications based on Docker Compose, so we won't need to change anything in the repository to add this application to Release.
Firstly, log into Release, and create an application by clicking on Create new app.
Enter a unique name for your application, and pick the forked repository you created earlier, then click Next step.
Pick Analyze the repository, so Release can create services from docker-compose.yaml
.
Select the branch from your repository you'd like to track in this application.
Select the docker-compose.yaml
file.
Click Start analysis.
Release will read your Docker Compose file, and list the services found.
Click Next step.
Release will generate a template based on the services from your docker-compose.yaml
file.
Release will use this template to create new environments later on, and the defaults should work as expected for most Docker Compose applications.
For this example application, we'll make one important change to the template to make sure the db
service exposes two ports for MySQL.
Find the db
service in the application template YAML, and add two container ports by making the following changes:
Release supports two different port types: node_port
and container_port
. We're adding a container port to the db
service because this port should only be accessible on your application's private network. This enables the wordpress
service to connect to the db
service without exposing your MySQL database to the internet.
After editing the template, click Next step.
The docker-compose.yaml
file from our repo lists the environment variables for each service.
To see how each service's container will use these environment variables, we can consult the Docker images documentation.
MYSQL_ROOT_PASSWORD
Specifies the root
MySQL user's password. On a production server, this should be treated as secret.
MYSQL_DATABASE
If this variable is set, MySQL will create a database with this variable's value as a name. For our example, we'll set this to wordpress
.
We can expect the MySQL server to create a database called wordpress
on startup.
MYSQL_USER
and MYSQL_PASSWORD
MySQL uses these two variables together to set a username and password for a new MySQL user on startup. This user will be granted superuser privileges (GRANT ALL
) on the database specified by MYSQL_DATABASE
.
For the example application, we'll set both to wordpress
.
On startup, we can expect MySQL to create a new user called wordpress
with the password wordpress
, and grant the user all privileges on the wordpress
database.
WordPress uses a wp-config.php
file to set database access strings and other settings. Usually, you would edit wp-config.php
manually and set the database hostname, username, and password as PHP variables.
Let's take a look at the four environment variables in our example application.
WORDPRESS_DB_HOST
The WordPress Docker image uses this variable to set the database hostname. For our example, we'll set this to db
.
Release creates a private network for your application, and by default, any service in your application can discover any other service in the application by querying a service's name.
This means the wordpress
service can reach the db
service's container on the private network by querying the db
hostname.
WORDPRESS_DB_USER
, WORDPRESS_DB_PASSWORD
, and WORDPRESS_DB_NAME
The WordPress Docker image uses these three variables to know which database to use and to authenticate with the MySQL database server.
For this example, we'll set all three to wordpress
so that they match the equivalent variables set for the db
service.
Edit the YAML environment variables in Release to look like this:
You'll notice that we marked the MYSQL_ROOT_PASSWORD
, MYSQL_PASSWORD
, and WORDPRESS_DB_PASSWORD
variables as secret by setting the secret
flag to true for each of them.
Click Next step to save your environment variables.
This application does not use any build arguments, so we can click Next step.
Click Deploy your app to create your application.
Release will now pull two Docker images, mysql
and wordpress
, then start two services, db
and wordpress
.
Your browser should redirect to a deployment status page, showing the progress of the setup workflow.
After Release's set-up and deployment workflow completes, navigate to your new environment and click on the URL for the wordpress
service.
You should now see the WordPress setup screen.
Select your language and click Continue.
Create a user and install WordPress by following these steps:
Enter a site title.
Enter a username, which you'll use later to log into WordPress.
Copy and save the recommended password. You'll use this later to log into WordPress.
Enter your email address.
Tick the search engine visibility checkbox. We recommend this to discourage search engines from crawling websites in development.
Click Install WordPress.
Your WordPress service will now run WordPress's installation script, which connects to your MySQL database and adds the required tables and configuration. WordPress also creates an admin user based on the username and password you entered.
Click log in.
Enter your username and password, then click Log in.
On the WordPress dashboard, hover over your site's name and click visit site.
You should see a sample page on your WordPress site now.
If you don't see the WordPress language selector after the deployment workflow above, you can view the logs for each service in your environment to see whether either service logged any errors.
To view a service's logs, navigate to your environment's details page, scroll down to the list of services, and click on logs.
The most common problem when first installing WordPress is a database connection error.
On Release, this error can be solved by working through the following steps:
Make sure the corresponding environment variables from both services match.
Values for the variables in each row below should match:
db
service
wordpress
service
MYSQL_DATABASE
WORDPRESS_DB_NAME
MYSQL_USER
WORDPRESS_DB_USER
MYSQL_PASSWORD
WORDPRESS_DB_PASSWORD
Make sure the WORDPRESS_DB_HOST
environment variable matches the name of your database service.
Make sure your database service exposes the correct ports. MySQL on Docker uses ports 3306
and 33060
.
Docker is most useful when developing WordPress plugins and themes, rather than just configuring a WordPress site.
We recommend pre-installing your themes and plugins if you're using Docker for WordPress development.
In the example above, only the database service mounts a persistent volume. This means that the database data for each environment will remain after the application restarts or re-deploys.
The WordPress service does not use a persistent volume.
Images and other files uploaded to your WordPress site will be deleted when you re-deploy your application.
Release does not currently convert expose
directives when importing services from Docker Compose. Add a container_port
for each port in your Docker Compose file. Read more about in our template schema.
In Docker, we do this differently. The WordPress Docker image uses a that enables you to configure WordPress through environment variables.
For more information about the benefits of using environment variables for configuration (not just in Docker), we recommend reading .
Release saves in an encrypted vault, and exposes these secrets to your running containers at startup.
To learn more about how you can pre-install WordPress plugins using Docker Compose, we recommend reading from the WordPress Docker image documentation.
To learn about how to mount a persistent volume for WordPress using Docker Compose, we recommend reading .
To learn how to mount a persistent volume on a Release service, see the section in our template schema documentation.