DockerのVolume PluginにDRBDが追加されていたので試してみました。
この記事の内容は、2016年7月10日の時点で試したものです。
構成
- OS: Ubuntu 16.04
- kernel: 4.4.0-28-generic
- Docker: 1.12-rc3
- DRBD: 9.0.2-1
drbdmanage: 0.96.1
-
仮想マシン2台を使用
- docker-master: 10.255.10.11
- docker-node01: 10.255.10.12
docker1.12-rc3のインストール
- docker1.12-rc3のexperimental版をインストールします
# curl -fsSL https://experimental.docker.com/ | sh
# docker --version
Docker version 1.12.0-rc3, build 91e29e8, experimental
DRBDのインストール
- DRBDをインストールします
$ sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
$ sudo apt update
$ sudo apt install -y drbd-dkms drbd-utils python-drbdmanage
DRBDのセットアップ
DRBD Manage Docker Volume Pluginは、あらかじめDRBDクラスタを作成する必要があります
DRBD用のディスクとしてsdbを用意します
sdbに対して、volume group であるdrbdpoolを作成します
$ sudo fdisk /dev/sdb
$ sudo pvcreate /dev/sdb1
$ sudo vgcreate drbdpool /dev/sdb1
- docker-masterでクラスタの初期化を行います
$ sudo drbdmanage 10.255.10.11
- docker-masterでdocker-node01をクラスタに追加します
- add-node時に出てきたコマンドを docker-node01で実行します
docker-master:~$ sudo drbdmanage add-node docker-node01 10.255.10.12
Operation completed successfully
Operation completed successfully
Host key verification failed.
Join command for node docker-node01:
drbdmanage join -p 6999 10.255.10.12 1 docker-master 10.255.10.11 0 9z+4ULb0ijWfq5xL3nVH
docker-node01:~$ sudo drbdmanage join -p 6999 10.255.10.12 1 docker-master 10.255.10.11 0 9z+4ULb0ijWfq5xL3nVH
DRBD Manage Docker Volume Plugin をインストール
apt でインストールする(ダメ)
- apt でインストールできるらしいが、おそらく依存関係のせいでインストールできず…
$ sudo apt install -y drbdmanage-docker-volume
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
drbdmanage-docker-volume : Depends: docker.io (>= 1.8.0) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
aptがダメなのでソースからmakeする
- githubからソースをクローンする
$ git clone --recursive http://git.drbd.org/drbdmanage-docker-volume.git
-
make
は通るが、make install
は通らない…- drbdmanage-docker-volume.8.gzが存在しないのが原因
$ cd ~/drbdmanage-docker-volume/
$ make
python2 setup.py build
running build
$ sudo make install
python2 setup.py install --record .installfiles
running install
running build
running install_data
copying systemd/docker-drbdmanage-plugin.service -> /lib/systemd/system/
copying systemd/docker-drbdmanage-plugin.socket -> /lib/systemd/system/
creating /usr/libexec
creating /usr/libexec/docker
copying drbdmanage-docker-volume -> /usr/libexec/docker/
error: can't copy 'drbdmanage-docker-volume.8.gz': doesn't exist or not a regular file
Makefile:18: recipe for target 'install' failed
make: *** [install] Error 1
2016/07/25 追記
- Makefileを見ると
make doc
でdrbdmanage-docker-volume.8.gz
が作成できる- 実行時には
pandoc
が必要なのでapt
でインストールしておく
- 実行時には
$ sudo apt install pandoc
$ make doc
pandoc -s -t man README -o drbdmanage-docker-volume.8
gzip -f drbdmanage-docker-volume.8
$ ls
COPYING drbdmanage-docker-volume MANIFEST.in setup.py
debian drbdmanage-docker-volume.8.gz README systemd
docker-check-rpm.sh Makefile setup.cfg
投稿時、以下の「強硬手段」は勘違いで行っており実際の構築時には必要ありません。
すみませんでした。
強硬手段 (飛ばしてください)
意地でも1.12rcでDRBD Manage Docker Volume Pluginを動かしたい
apt で依存関係が解消できないため、DRBD Manage Docker Volume Pluginがインストールできない
でも、drbdmanage-docker-volume.8.gzが存在しないせいでビルドできない
-> 依存関係が解消できるDockerのバージョンでインストールして、drbdmanage-docker-volume.8.gzを持って来る
-
解決法Docker上にubuntuコンテナ立てるDockerはaptからインストールして、依存関係をaptに何とかしてもらうめでたく、DRBD Manage Docker Volume Pluginがコンテナ内に入ったらdrbdmanage-docker-volume.8.gz
だけホストマシン上にコピーする
手順 (飛ばしてください)
software-properties-common
はadd-apt-repository
を使用したいので入れました
$ sudo docker run -it ubuntu
ここからコンテナ内
root@0667f85e7f32:/# apt update
root@0667f85e7f32:/# apt install -y docker.io docker-compose
root@0667f85e7f32:/# docker --version
Docker version 1.10.3, build 20f81dd
root@0667f85e7f32:/# apt install software-properties-common
root@0667f85e7f32:/# add-apt-repository ppa:linbit/linbit-drbd9-stack
root@0667f85e7f32:/# apt update
root@0667f85e7f32:/# apt install -y drbd-dkms drbd-utils python-drbdmanage drbdmanage-docker-volume
root@0667f85e7f32:/# Ctrl-p Ctrl-q
コンテナから抜ける
コンテナ内からdrbdmanage-docker-volume.8.gz
をコピー
$ cd ~/drbdmanage-docker-volume/
$ cat setup.py | grep .gz
('/usr/share/man/man8/', ['drbdmanage-docker-volume.8.gz']),
$ sudo docker cp 0667f85e7f32:/usr/share/man/man8/drbdmanage-docker-volume.8.gz .
$ ls
COPYING drbdmanage-docker-volume Makefile README setup.py
debian drbdmanage-docker-volume.8.gz MANIFEST.in setup.cfg systemd
make installを実行する
$ sudo make install
python2 setup.py install --record .installfiles
running install
running build
running install_data
copying drbdmanage-docker-volume.8.gz -> /usr/share/man/man8/
running install_egg_info
Writing /usr/local/lib/python2.7/dist-packages/drbdmanage_docker_volume-0.7.egg-info
writing list of installed files to '.installfiles'
やりました、インストールできました
- Pluginの起動
$ sudo systemctl enable docker-drbdmanage-plugin.socket
$ sudo systemctl start docker-drbdmanage-plugin.socket
DRBDにDocker Volume を作成する
- ファイルシステムはext4、ボリュームサイズは200MBでDocker Volumeを作成します
$ sudo drbdmanage n
+------------------------------------------------------------------------------+
| Name | Pool Size | Pool Free | | State |
|------------------------------------------------------------------------------|
| docker-master | 16380 | 16372 | | ok |
| docker-node01 | 16380 | 16372 | | ok |
+------------------------------------------------------------------------------+
$ sudo drbdmanage v
No resources defined
$ sudo drbdmanage r
No resources defined
$ sudo docker volume ls
DRIVER VOLUME NAME
$ sudo docker volume create -d drbdmanage --name=dmvol --opt fs=ext4 --opt size=200
dmvol
- 確認
$ sudo docker volume ls DRIVER VOLUME NAME
drbdmanage dmvol
$ sudo drbdmanage r
+------------------------------------------------------------------------------+
| Name | | State |
|------------------------------------------------------------------------------|
| dmvol | | ok |
+------------------------------------------------------------------------------+
$ sudo drbdmanage v
+------------------------------------------------------------------------------+
| Name | Vol ID | Size | Minor | | State |
|------------------------------------------------------------------------------|
| dmvol | 0 | 200 MiB | 100 | | ok |
+------------------------------------------------------------------------------+
複数ノード間で共有できているか確認
- docker-masterで立ち上げたコンテナからdmvolに書き込み
docker-master:~$ sudo docker run -ti --name=cont -v dmvol:/data --volume-driver=drbdmanage busybox sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
8ddc19f16526: Pull complete
Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6
Status: Downloaded newer image for busybox:latest
/ # echo "foo" > /data/test.txt
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # cat /data/
lost+found/ test.txt
/ # cat /data/test.txt
foo
/ # exit
docker-master:~$
- docker-node01で立ち上げたコンテナをdmvolにマウントして先ほど作成したtest.txtがあるか確認する
docker-node01:~$ sudo docker run -ti --name=cont -v dmvol:/data --volume-driver=drbdmanage busybox sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
8ddc19f16526: Pull complete
Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6
Status: Downloaded newer image for busybox:latest
/ # cat /data/
lost+found/ test.txt
/ # cat /data/test.txt
foo
/ #
終わりに
DRBD Manage Docker Volume PluginのReadmeを見るとオプションで細かい設定ができるようなので、時間があればそちらも試してみようと思います。