It is very easy with Docker to have a working WordPress up in no time with the official WordPress Image on Docker Hub.

If you want to have an image which is backed up properly and that you can migrate w/o any problems on a different machine, you need to take care of the proper volumes mappings. Unfortunately I did not find the proper documentation and I needed to find out the hard way.

WordPress Startup Logic

The WordPress solution consists of two separate pieces which are managing state and therefore will need to be coordinated together:

  • the WordPress Application itself and
  • the Database (mariadb)

The following startup logic is used by the Official Image:

  • When the database is started with an empty instance it automatically creates a new inital database in ./var/lib/mysql
  • When WordPress is started from an empty instance it automatically copies the WordPress application from /usr/src/wordpress to /var/www/html and it creates a database with the name wordpress.

In order to prevent this initial setup logic, you need to make sure that these locations are mapped properly and that the complete data is available.

Backup Solutions

We see the following solution alternatives:

  • Do it the WordPress Way and install a Backup or Data Migration Plugin. In the case of data restore on a new environment you need to start from a new empty wordpress instance, install the plugin and the do the restore. From my point of view this is by for the easiest solution.

If you want do to it the Docker way, things are getting more difficult because you need to address each component seperalty.

  • Database
    • Make sure that you map the database volumes so that you can restore them. Please note that if you do only a regular file backup the database might not be in a consistent state.
    • Use a separate docker image which performs backups (e.g. zeenlym/mariadb-backup)
  • WordPress
    • Avoid state in volumes. Do not make any mappings and provide your full solution as custom image by putting your components into /usr/src/wordpress or /var/www/html. This approach only works if your side is stable and rarely changes. Google can help you to get quite some information on the topic of statless wordpress.
    • Or make sure that you map the proper file volume:/var/www/html. This is our selected solution which we have implemented below.

WordPress URL

The WordPress URL is stored in the database and it is not possible to address the WordPress instance with a different URL. You can find more details in the official documentation.: So you might need to have phpmyadmin available do that you can update the address.

Docker Compose

Here is our docker compose file for all components which provides the proper mappings.

version: '3'

services:
 wordpress:
 image: wordpress:latest
 container_name: wordpress
 ports:
 - 8005:80
 environment:
 - WORDPRESS_DB_PASSWORD=my-password
 - WORDPRESS_DB_HOST=wordpress-mysql
 restart: always
 dns: 8.8.8.8
 volumes:
 - /srv/wordpress:/var/www/html

wordpress-mysql:
 image: mariadb
 volumes:
 - /srv/wordpress-mysql:/var/lib/mysql
 - /backup:/backup
 environment:
 - MYSQL_ROOT_PASSWORD=my-password
 restart: always

wordpress-db-backup:
 image: zeenlym/mariadb-backup
 environment:
 - TIMEZONE=Europe/Berlin
 - SCHEDULE=0 0 * * *
 - BACKUP_METHOD=mysqldump
 - MYSQL_HOST=wordpress-mysql
 - MYSQL_DATABASE=wordpress
 - MYSQL_USER=root
 - MYSQL_PASSWORD=my-password
 volumes:
 - /backup/wordpress-mysql:/backup

phpmyadmin:
 image: phpmyadmin/phpmyadmin
 container_name: phpmyadmin
 environment:
 - PMA_ARBITRARY=1
 restart: always
 ports:
 - 8006:80
 volumes:
 - /sessions

In order to run the application on a different machine you just need to make sure that the mapped directories are available. Im my example this is:

  • /srv/wordpress-mysql
  • /srv/wordpress

Leave a Reply

Your email address will not be published. Required fields are marked *