Flocker浅析与Docker插件(3)

来源:互联网 发布:芒果tv有Mac 版吗 编辑:程序博客网 时间:2024/06/06 21:05

..
声明:
本博客欢迎转发,但请保留原作者信息!
博客地址:http://blog.csdn.net/halcyonbaby
新浪微博:@寻觅神迹

内容系本人学习、研究和总结,如有雷同,实属荣幸!


写一个简单的docker volume Plugin

该插件只是个例子,卷实际上是host上的目录,但是由插件进行管理。
代码中使用了calavera写的docker volume plugin框架。
需要完成的只是上章所说的docker volume plugin的5个接口。
样例代码-创建一个叫fakeVol的plugin

package mainimport (        "flag"        "fmt"        "log"        "os"        "path/filepath"        "sync"        "github.com/calavera/dkvolume")var (        root = flag.String("root", "/var/lib/docker/fakevol", "fake volumes root directory"))type fakeVolDriver struct {        root    string        m       *sync.Mutex        volumes map[string]string}func newFakeVolDriver(root string) fakeVolDriver {        d := fakeVolDriver{                root:    root,                volumes: map[string]string{},                m:       &sync.Mutex{},        }        return d}func (d fakeVolDriver) Create(r dkvolume.Request) dkvolume.Response {        log.Printf("Creating volume %s\n", r.Name)        d.m.Lock()        defer d.m.Unlock()        volPath := filepath.Join(d.root, r.Name)        if _, err := os.Stat(volPath); os.IsNotExist(err) {                os.Mkdir(volPath, 0755)                d.volumes[r.Name] = volPath        }        return dkvolume.Response{}}func (d fakeVolDriver) Remove(r dkvolume.Request) dkvolume.Response {        log.Printf("Removing volume %s\n", r.Name)        d.m.Lock()        defer d.m.Unlock()        if _, err := os.Stat(d.volumes[r.Name]); os.IsNotExist(err) {                os.Remove(d.volumes[r.Name])                delete(d.volumes, r.Name)        }        return dkvolume.Response{}}func (d fakeVolDriver) Path(r dkvolume.Request) dkvolume.Response {        return dkvolume.Response{Mountpoint: d.volumes[r.Name]}}func (d fakeVolDriver) Mount(r dkvolume.Request) dkvolume.Response {        return dkvolume.Response{Mountpoint: d.volumes[r.Name]}}func (d fakeVolDriver) Unmount(r dkvolume.Request) dkvolume.Response {        return dkvolume.Response{}}func main() {        flag.Parse()        d := newFakeVolDriver(*root)        h := dkvolume.NewHandler(d)        fmt.Println(h.ServeUnix("root", "fakeVol"))}

运行、使用plugin管理容器的volume

备注:
由于volume plugin是docker的实验特性。因此正式的release中并未包含。需要使用编译了实验特性的版本。
可以在https://experimental.docker.com/builds/Linux/x86_64/docker-latest下载。

[root@localhost fake-volume]# ./fake-volume[root@localhost fake-volume]# ls /run/docker/plugins/fakeVol.sock/run/docker/plugins/fakeVol.sock[root@localhost temp]# docker run -it --rm  -v test:/test --volume-driver=fakeVol busybox:latest /bin/sh/ # ls /test// # touch /test/a.txt/ # echo "hello docker plugin" > /test/a.txt[root@localhost calavera]# cat /var/lib/docker/fakevol/test/a.txthello docker plugin
0 0