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", }
在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。