原文作者 | Sébastien Han |
原文地址 | http://www.sebastien-han.fr/blog/categories/presentation/ |
发表时间 | 08/17/2015 |
译文作者 | Younger Liu |
翻译时间 | 06/26/2018 |
在一周前,Docker 1.8版本发布,随着这次发布,docker支持多个卷插件,但是这次我主要介绍关于Ceph RBD的插件(虽然有三个)
1. 获取Docker
首先,获取Docker1.8,可以参见如下命令:
$ curl -sSL https://get.docker.com/ | sh
$ docker --version
Docker version 1.8.1, build d12ea79
2. 配置卷插件
正如在前面所说,有三个Driver来做同样的事情:
- Yp engineering (我所测试的)
- AcalephStorage
- Volplugin
不得不承认,我选择从Yp engineering开始的方式是非常武断的。因此,我对其他人的了解不多,也不能给你提供更多的反馈。
首先安装依赖软件:
$ sudo apt-get install -y golang librados-dev librbd-dev ceph-common xfsprogs
$ export GOPATH=$HOME
$ export PATH=$PATH:$GOPATH/bin
$ go get github.com/yp-engineering/rbd-docker-plugin
$ sudo rbd-docker-plugin -h
Usage of rbd-docker-plugin:
-cluster="": Ceph cluster
-config="": Ceph cluster config
-create=false: Can auto Create RBD Images
-fs="xfs": FS type for the created RBD Image (must have mkfs.type)
-logdir="/var/log": Logfile directory
-mount="/var/lib/docker/volumes": Mount directory for volumes on host
-name="rbd": Docker plugin name for use on --volume-driver option
-plugins="/run/docker/plugins": Docker plugin directory for socket
-pool="rbd": Default Ceph Pool for RBD operations
-remove=false: Can Remove (destroy) RBD Images (default: false, volume will be renamed zz_name)
-size=20480: RBD Image size to Create (in MB) (default: 20480=20GB)
-user="admin": Ceph user
-version=false: Print version
正如您所看到的,RBD卷插件支持几个选项,包括群集名称、用户,卷插件有2种不同的方法来调配卷:
- 手动地:您必须创建RBD映像,并由您自己将文件系统置于其上,当您知道每个卷的大小可以变化时,这是很有趣的。如果不是,您可能应该为您配置插件来为您做。
- 自动地:其中插件将为您创建映像和文件系统。
该服务是通过systemd来管理的,为了本教程的目的,我将通过STDOUT运行它。
3. 运行
在启动service之前,先来配置ceph集群
$ sudo ceph osd pool create docker 128
pool 'docker' created
$ sudo ceph auth get-or-create client.docker mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=docker' -o /etc/ceph/ceph.client.docker.keyring
Driver通过写/run/docker/plugins/rbd.sock来完成RBD的通信,Docker在执行与ceph RBD相关的操作时会用到这个Socket(比如,创建卷、或者绑定挂载)
4. 应用
接下俩,将通说bash启动一个docker
$ sudo docker run -it --volume-driver=rbd --volume foo:/mnt/foo ceph/base bash
root@712e78060cfb:/#
root@712e78060cfb:/# df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 158G 13G 139G 9% /
none 158G 13G 139G 9% /
tmpfs 2.0G 0 2.0G 0% /dev
shm 64M 0 64M 0% /dev/shm
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/rbd1 20G 33M 20G 1% /mnt/foo
/dev/disk/by-label/cloudimg-rootfs 158G 13G 139G 9% /etc/hosts
tmpfs 2.0G 0 2.0G 0% /proc/kcore
tmpfs 2.0G 0 2.0G 0% /proc/latency_stats
tmpfs 2.0G 0 2.0G 0% /proc/timer_stats
root@712e78060cfb:/# touch /mnt/foo/bar
那么发生了什么哪?
Driver做了如下事情:
1. 创建了一个20GB的镜像
2. 在20G镜像之上创建了一个XFS文件系统
3. 映射并且将文件系统挂载了容器上
当关闭容器后,数据会持久化,并且可以在下一个容器中继续使用