Configuring NFS and Docker as a service

NFS before docker

Making sure NFS boots before docker.

This guide will make sure docker won't start before NFS is mounted, to prevent corrupted data, or unwated behaviors

Disable Docker autostart

First we will disable docker from autostarting on your sistem. Executing the follwing command

 systemctl disable docker
 systemctl disable docker

Checker Script

We will create a script on

 vim /root/nfs-docker.sh
 vim /root/nfs-docker.sh

This script will check NFS and will execute firewall script before booting docker.

 #!/bin/bash #You can edit where the mount path of the folder. #Please make sure this folder is empty on your sistem, before mounting NFS NFSCheck=/media/emsites/ #Set this on 1, if you want to execute firewall script BOOTFIREWALL="0" # 1 = true FIREWALLSCRIPT=/root/firewall.sh LOG(){ date=`date`; echo "$date - $1" echo "$date - $1" >> /tmp/docker-start.log; } MountNFS() { if [ $NFSBOOTED -eq 0 ] && [ $NFSMOUNT -eq 0 ]; then LOG "Trying to mount nfs" mount -a NFSBOOTED="1" fi } BootFirewall() { if [ $BOOTFIREWALL -eq 1]; then LOG "Booting firewall" eval "$FIREWALLSCRIPT" fi } echo ""> /tmp/docker-start.log LOG "Checking NFS mount" FILES="0" NFSBOOTED="0" while [ $FILES -lt 1 ] do NFSMOUNT=`df -h | grep $NFSCheck | wc -l` FILES=`ls $NFSCheck | wc | awk '{print $1}'` if [ $FILES -gt 0 ] && [ $NFSMOUNT -gt 0 ]; then LOG "NFS mounted"; LOG "Booting Docker"; systemctl start docker; LOG "Docker started, Please check systemctl status docker"; else LOG "NFS NOT mounted"; MountNFS; fi sleep 1; done
 #!/bin/bash #You can edit where the mount path of the folder. #Please make sure this folder is empty on your sistem, before mounting NFS NFSCheck=/media/emsites/ #Set this on 1, if you want to execute firewall script BOOTFIREWALL="0" # 1 = true FIREWALLSCRIPT=/root/firewall.sh LOG(){ date=`date`; echo "$date - $1" echo "$date - $1" >> /tmp/docker-start.log; } MountNFS() { if [ $NFSBOOTED -eq 0 ] && [ $NFSMOUNT -eq 0 ]; then LOG "Trying to mount nfs" mount -a NFSBOOTED="1" fi } BootFirewall() { if [ $BOOTFIREWALL -eq 1]; then LOG "Booting firewall" eval "$FIREWALLSCRIPT" fi } echo ""> /tmp/docker-start.log LOG "Checking NFS mount" FILES="0" NFSBOOTED="0" while [ $FILES -lt 1 ] do NFSMOUNT=`df -h | grep $NFSCheck | wc -l` FILES=`ls $NFSCheck | wc | awk '{print $1}'` if [ $FILES -gt 0 ] && [ $NFSMOUNT -gt 0 ]; then LOG "NFS mounted"; LOG "Booting Docker"; systemctl start docker; LOG "Docker started, Please check systemctl status docker"; else LOG "NFS NOT mounted"; MountNFS; fi sleep 1; done

Create Unit for systemctl

Creating a Unit service in systemd for your script
Create File:

 vim cat /etc/systemd/system/nfs-docker.service
 vim cat /etc/systemd/system/nfs-docker.service

Copy content

 [Unit] Description=Launch NFS and Docker [Service] Type=simple #ExecStart= ExecStart=/root/nfs-docker.sh [Install] WantedBy=multi-user.target
 [Unit] Description=Launch NFS and Docker [Service] Type=simple #ExecStart= ExecStart=/root/nfs-docker.sh [Install] WantedBy=multi-user.target

enable script to autostart

Enabling script on startup

 systemctl enable nfs-docker
 systemctl enable nfs-docker