文档章节

Docker GraphDriver

kellydestiny
 kellydestiny
发布于 2016/03/30 13:10
字数 585
阅读 35
收藏 0

graphdriver是镜像的存储的驱动环境,目前支持四种类型的driver,分别为aufs,btrfs,devicemapper,vfs。当然也可以按照用户的需求进行设置。

package graphdriver中,定义了一个“大环境”,如下所示:

type Driver interface {
    String() string
    Create(id, parent string) error
    Remove(id string) error
    Get(id, mountLabel string) (dir string, err error)
    Put(id string)
    Exists(id string) bool
    Status() [][2]string
    Cleanup() error
type Differ interface {
    Diff(id string) (archive.Archive, error)
    Changes(id string) ([]archive.Change, error)
    ApplyDiff(id string, diff archive.ArchiveReader) error
    DiffSize(id string) (bytes int64, err error)

package graphdriver中,定义了一个变量

drivers map[string]InitFunc

其中,key为字符串类型,代表驱动的类型(名字),value为:InitFunc

type InitFunc func(root string, options []string) (Driver, error)

InitFunc会返回一个具体的driver实例。


package graphdriver中,定义了一个驱动类型的优先级变量:

priority = []string{
    "aufs",
    "btrfs",
    "devicemapper",
    "vfs",
}



vfs:

package vfs中,定义了一个结构体类型,如下所示:

type Driver struct {
    home string
}

其中,vfs中的Driver结构体类型实现了package graphdriver中的接口Driver。

在vfs中的init()函数中会进行vfs类型的驱动的注册,如下所示:

func init() {
    graphdriver.Register("vfs", Init)
}

func Init(home string, options []string) (graphdriver.Driver, error) {
    d := &Driver{
        home: home,
    }
    return d, nil
}

其中,具体的注册函数的具体实现如下所示:

func Register(name string, initFunc InitFunc) error {
    if _, exists := drivers[name]; exists {
        return fmt.Errorf("Name already registered %s", name)
    }
    drivers[name] = initFunc
    return nil
}


其余几种类型的驱动也会以相似的方式被注册到package graphdriver中的变量drivers中。



回到docker daemon的创建过程中,有一个步骤是需要加载并配置grapgdriver,代码如下所示:

driver, err := graphdriver.New(config.Root, config.GraphOptions)

其中,

graphdriver.New()

函数的具体步骤如下所示:

func New(root string, options []string) (driver Driver, err error) {
    for _, name := range []string{os.Getenv("DOCKER_DRIVER"), DefaultDriver} {
        if name != "" {
            return GetDriver(name, root, options)
        }
     遍历数组选择grapgdriver,若数组内容不为空,则直接返回相应的Driver实例对象。
     
     for _, name := range priority {
         driver, err = GetDriver(name, root, options)
         if err != nil {
             if err == ErrNotSupported || err == ErrPrerequisites || err == ErrIncompatibleFS {
                 continue
             }
             return nil, err
         }
         return driver, nil
      }
      对优先级数组进行遍历,返回相应的Driver实例,其中,目前优先级最高的是aufs类型。
      
      for _, initFunc := range drivers {
          if driver, err = initFunc(root, options); err != nil {
              if err == ErrNotSupported || err == ErrPrerequisites || err == ErrIncompatibleFS {
              continue
           }
           return nil, err
       }
       return nil, fmt.Errorf("No supported storage backend found")
}

     在没有优先级数组的时候,同样可以通过注册的驱动来选择具体的graphdriver。



© 著作权归作者所有

下一篇: 八皇后
kellydestiny
粉丝 1
博文 25
码字总数 9730
作品 0
武汉
程序员
私信 提问
centos6.2 64 部署docker

centos6.2 64 部署docker 安装docker yum源: yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm [root@yz6245 yum.repos.d]# yum install docker-io Loaded......

Wilson9527
2016/09/23
0
0
Docker架构概览

Docker架构概览 Docker使用了传统的client-server架构模式,用户通过Docker client与Docker daemon建立通信,并将请求发送给后者。而Docker后端是松耦合结构,不同模块各司其职。 Docker dae...

yeit
2015/11/25
7
1
centos7.3 docker升级

#升级操作系统,centos7直接升级到7.3 yum clean all yum update #升级内核 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7......

Wilson9527
2017/09/29
0
0
centos6.5启动docker失败

步骤如官方文档:http://docs.docker.com/installation/centos/ 虚拟机centos6.5 2.6.32-431.el6.x86_64 步骤如下 yum update uname -r 2.6.32-431.el6.x86_64 curl -O -sSL https://get.doc......

noday
2015/07/15
11.4K
7
docker 1.13.1版本,dockerd怎么启动

命令如下: dockerd --log-driver=journald --graph=/home/docker_lib_path --storage-driver=overlay --bridge=br0 --pidfile=/var/run/docker.pid --containerd=/var/run/docker.sock 然后......

wangjq_en
2017/02/27
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

006-Docker中导出单个或多个tar包

docker中导出单个镜像和多个镜像的tar包 docker save [images] > [name.tar] docker save [images] [images] > [name.tar]...

伟大源于勇敢的开始
今天
6
0
Kotlin基础语法学习

安装好安卓studio,以及插件支持Kotlin 就可以在创建项目的时候选择 Kotlin语言了。 https://www.jianshu.com/p/4ab13691d681 参考手册: https://www.runoob.com/kotlin/otlin-android-setu...

T型人才追梦者
今天
4
0
java实现简单计算器

1.概述 之前作者写过一篇文章,也是关于计算器的,用的是C++与Qt,链接在这里 这次用java的swing写的(这差距好像有点大,好吧是qt太强了). 先上图: 2.UI 总体布局使用流布局. (1)文本框 文本框就...

Blueeeeeee
今天
4
0
纯CSS实现DIV悬浮(固定位置)

纯CSS实现的DIV悬浮效果(固定位置),兼容常用的浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗等。效果如下: 实现代码: <!DOCTYPE html> <html> <head> <meta ...

独钓渔
今天
6
0
OSChina 周二乱弹 —— 给我来个女菩萨

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐#分享XXXTENTACION/Travis Barker的单曲《Pain = BESTFRIEND》: 《Pain = BESTFRIEND》- XXXTENTACION/...

小小编辑
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部