WordPress im Docker Container

Trennung von Sourcode und Content

Mit jedem Deployment eines neuen WordPress-Containers geht auch der Content verloren. WordPress-Content (genauer: die Mediendateien) wird im Unterverzeichnis „wp-content/uploads“ gespeichert. Dieses befindet sich innerhalb des Containers. Wird der Container gestoppt und neu gestartet ist das unproblematisch, denn das Verzeichnis bleibt weiterhin bestehen. Entfernen und neu Erzeugen des Containerts funktionert jedoch nicht. Das Entfernen eines Containers vernichtet automatisch auch darin enthaltenen Verzeichnisse – den Content.

Die Lösung ist simpel, der Content muss von den Sourcen getrennt werden. Allerdings ist die Definition von Content schwammig. Medien sind sicher ganz klar Content. Sowie ein Beitrag oder eine Seite auch. Aber was sind Themes, Plugins oder Formulare? Auf der anderen Seite fällt die footer.php sicher unter Sourcen. Eine exakte Trennung zu finden ist schwierig.

Pragmatischer Ansatz:
Content ist, was im Verzeichnis ‚uploads‘ oder in der Datenbank gespeichert wird.“

 

Sourcen und Content getrennt
Sourcen und Content getrennt

 

Die Arbeitsverzeichnisse von WordPress und MariaDB werden auf Named-Volumes gemappt. So landet der oben definierte Content nicht in Container-Volumes, sondern auf separaten Named-Volumes. Werden die Container zerstört, hat dies keinen Einfluss auf diese. Neue Container können sich mit bestehenden Named-Volumes verbinden, Inhalte können zwischen Containern augetauscht werden.

Bei dem von mir genutzen Docker for Windows, läuft der Host in einer VirtualBox. Die Docker Volumes sind dort unter „mnt/sda1/var/lib/docker/volumes“ abgelegt und einsehbar.

docker-compose.yml:

version: '2'
services:
  mariadb:
    environment:
      - MYSQL_ROOT_PASSWORD=top_secret
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wp_user
      - MYSQL_PASSWORD=wp_password
    image: mariadb:10.1.13
    volumes:
      - volume_mariadb:/var/lib/mysql
  wordpress:
    environment:
      - WORDPRESS_DB_HOST=mariadb:3306
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_DB_USER=wp_user
      - WORDPRESS_DB_PASSWORD=wp_password
    image: userRepository/imageName:tag
    links:
      - mariadb
    ports:
      - 80:80
    volumes:
      - volume_wordpress:/var/www/html/wp-content/uploads
volumes:
  volume_mariadb:
    driver: local
  volume_wordpress:
    driver: local