Table of Contents

Docker - DokuWiki (with docker volume host directory for portability and direct access to data)

The main objective is to have:

  1. Easy to backup / restore data from DokuWiki a.k.a. sleeping with mind at ease.
  2. Easy portability a.k.a. I can have the Wiki run from my own Laptop in case of a major failure
  3. Small footprint a.k.a. A VM would take something between 10-20 GB to take with me. This way I can take the Docker Image and it's data in less then 2 GB.

This documentation was done using Ubuntu Server 20.04 LTS as a VirtualMachine, virtualized via VirtualBox 6.1.8. Ubuntu was configured to use LVM.

This documentation was also used successfully to deploy to a VPS.

I will be using a pre-made image from https://hub.docker.com/u/mprasil, found under https://hub.docker.com/r/mprasil/dokuwiki. A copy of the Documentation from the Docker Image can be found here.

I'm assuming you already have Docker and Docker-Compose installed.

If not, go ahead and install them:

sudo apt install docker -y && sudo apt install docker-compose -y

Preparations due to LVM

First, after installing Ubuntu, we should expand the LVM to use the entire Free Space available. This is/was an issue at the time of writing (17/07/2020)

sudo lvm
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
exit
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv

Confirm with:

df -h

Avoiding "sudo docker command"

Let's add ourselfs to the Docker Group so we don't have to prefix every Docker command with 'sudo'

sudo gpasswd -a $USER docker

Creating the Volumes for Data

Now we need to create the docker volumes, which points to a local folder, so we can manipulate / migrate / backup the data easily if needed.

General ExamplePratical Example
docker volume create \
--driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
docker volume create \
--driver local \
--opt type=none \
--opt device=/media/docker-user/dokuwiki/storage/data \
--opt o=bind dokuwiki_data

We can either create all volumes and directories necessary manually, or use this script - create_volumes.sh - to create the folders and volumes in one go:

#!/bin/bash
STORAGE_PATH="/home/docker-user/dokuwiki"
mkdir -p "$STORAGE_PATH"/storage/{data,conf,lib/plugins,lib/tpl,logs}
docker volume create --driver local --opt type=none --opt device="$STORAGE_PATH"/storage/data --opt o=bind dokuwiki_data
docker volume create --driver local --opt type=none --opt device="$STORAGE_PATH"/storage/conf --opt o=bind dokuwiki_conf
docker volume create --driver local --opt type=none --opt device="$STORAGE_PATH"/storage/lib/plugins --opt o=bind dokuwiki_lib-plugins
docker volume create --driver local --opt type=none --opt device="$STORAGE_PATH"/storage/lib/tpl --opt o=bind dokuwiki_lib-tpl
docker volume create --driver local --opt type=none --opt device="$STORAGE_PATH"/storage/logs --opt o=bind dokuwiki_logs

Creating the docker-compose.yml file

After that we can create our docker-compose.yml which will be used to manage our container:

version: '2'
 
volumes:
    dokuwiki_data:
        external: true
    dokuwiki_conf:
        external: true
    dokuwiki_lib-plugins:
        external: true
    dokuwiki_lib-tpl:
        external: true
    dokuwiki_logs:
        external: true
 
services:
  dokuwiki:
    image: 'mprasil/dokuwiki'
    ports:
      - '80:80'
    volumes:
        - dokuwiki_data:/dokuwiki/data
        - dokuwiki_conf:/dokuwiki/conf
        - dokuwiki_lib-plugins:/dokuwiki/lib/plugins
        - dokuwiki_lib-tpl:/dokuwiki/lib/tpl
        - dokuwiki_logs:/var/log

Starting the Container

Finally, if you already have Data from your previous DokuWiki, you can just copy/paste them in those previous created folders. Else you will just start a new DokuWiki once you start up the container. A few usefull commands to manage the container with docker-compose

CommandPurpose
docker-compose up -dStarts the Container and dettach (so you have your bash prompt back)
docker-compose downStops the Container
docker-compose psChecks the status of the Container

Your container should now be accessible via http://<VM/HOST_IP>.

Do note that https: isn't available, since the container isn't listening on port 443.


Backing Up / Migrating the Data

We can easily migrate the data by grabbing everything in the mounted volumes and collecting them into a tar(ball).

To do that we can create a file called backtup_to_tar.sh which when run will grab everything from SOURCE_PATH and output it into BACKUP_PATH with the name “dokuwiki_backup-date-time.tar” ex.: dokuwiki_backup-2020-07-24-13-21.tar

#!/bin/bash
SOURCE_PATH="/home/docker-user/dokuwiki"
BACKUP_PATH="/home/docker-user/backups"
BACKUP_NAME="dokuwiki_backup"
tar cvf "$BACKUP_PATH"/"$BACKUP_NAME"-$(date +"%Y-%m-%d-%H-%M").tar -C "$SOURCE_PATH"