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