データの永続化を行うため、Dockerのストレージドライバ兼バックアッププラグインConvoyを導入しています。
DockerホストにGitHubからConvoyをインストールします。
DockerホストはCoreOSで稼働していますので、下記はcoreユーザーでの実行になります。
<html>
$ CONVOY_VER=0.5.0 …(1)
$ CONVOY_URL=https://github.com/rancher/convoy/releases/download/v$CONVOY_VER
$ CONVOY_FILE=convoy.tar.gz
$ pushd /tmp
$ wget $CONVOY_URL/$CONVOY_FILE
$ tar xvf $CONVOY_FILE
$ sudo cp -v convoy/convoy* /opt/bin …(2)
$ popd
(1) 2017/11/07執筆時のバージョンです。最新バージョンは</html>GitHub<html>で確認してください。<br>
(2) /opt/binは事前に作成済のディレクトリです。
</html>
インターネット上では、ループバックデバイスを作成しストレージ・バックエンドにdevicemapperを利用した記事が多いのですが、Dockerコンテナのフェイルオーバーを想定し、NFS上でのディレクトリ共有で行うことにします。
下記の起動/停止スクリプトを作成し、start/stopで起動/停止を行います。
(例)
/opt/systemd/docker/convoy.shに作成し、/opt/systemd/docker/convoy.sh startで起動します。
<html>
#!/bin/sh
CONVOY_DIR=/var/docker/volume …(1)
PROG=convoy
CONVOY=/opt/bin/$PROG
CONVOY_LOG=/var/log/$PROG.log
CONVOY_PID=/var/run/$PROG.pid
CONVOY_SOCKET=/var/run/convoy/convoy.sock
CONVOY_OPTS=“–drivers vfs –driver-opts vfs.path=$CONVOY_DIR” …(2)
PLUGIN_DIR=/etc/docker/plugins
PLUGIN_SPEC=$PLUGIN_DIR/convoy.spec …(3)
[ ! -e $PLUGIN_DIR ] && mkdir $PLUGIN_DIR
case “$1” in
start)
[ -e $CONVOY_PID ] && exit echo -e "\n*\n*** Start $PROG $(date) ***\n*\n" >> $CONVOY_LOG mkdir -p /var/run/$PROG echo "unix://${CONVOY_SOCKET}" > $PLUGIN_SPEC …(4) $CONVOY daemon $CONVOY_OPTS >> $CONVOY_LOG 2>&1 & echo $(pidof $CONVOY) > $CONVOY_PID ;;
stop)
[ ! -e $CONVOY_PID ] && exit kill $(cat $CONVOY_PID) rm -f $CONVOY_PID rm -f $PLUGIN_SPEC echo -e "\n*\n*** Stop $PROG $(date) ***\n*\n" >> $CONVOY_LOG ;;
esac
(1) Convoyボリュームを配置するNFS上のディレクトリです。実際はシンボリックリンクを作成しています。<br>
(2) NFSを使用する場合の起動パラメータです。<br>
(3) DockerエンジンにConvoyを組み込む先のディレクトリです。<br>
(4) DockerエンジンとUnixドメインソケットで連携させます。
</html>
作成するボリューム名をwebdataとした場合の作成方法は下記になります。
<html>
$ sudo /opt/bin/convoy create webdata
$ sudo /opt/bin/convoy mount webdata
# 作成したボリュームを確認してみます
$ sudo /opt/bin/convoy list
</html>
Systemd用の起動サービス定義ファイルは下記になります。
<html>
[Unit]
Description = Docker Volume Plugin - Convoy
Before = docker.service
[Service]
Type = oneshot
ExecStart = /opt/systemd/docker/convoy.sh start
ExecStop = /opt/systemd/docker/convoy.sh stop
RemainAfterExit = yes
[Install]
WantedBy = default.target
</html>