Docker - DokuWiki (with docker volume host directory for portability and direct access to data)
The main objective is to have:
- Easy to backup / restore data from DokuWiki a.k.a. sleeping with mind at ease.
- Easy portability a.k.a. I can have the Wiki run from my own Laptop in case of a major failure
- 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 Example | Pratical 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
Command | Purpose |
---|---|
docker-compose up -d | Starts the Container and dettach (so you have your bash prompt back) |
docker-compose down | Stops the Container |
docker-compose ps | Checks 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"