====== 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|https://hub.docker.com/u/mprasil]], found under [[https://hub.docker.com/r/mprasil/dokuwiki|https://hub.docker.com/r/mprasil/dokuwiki]]. A copy of the Documentation from the Docker Image can be found [[engineering:computer_science:docker:references:mprasil_dokuwiki|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://. 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"