Docker GraphDriver

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

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中,定义了一个变量app

drivers map[string]InitFunc

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

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

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


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

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



vfs:

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

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。
相关文章
相关标签/搜索