Docker是目前最流行的容器化技術之一,也是開源的。那么,分析Docker的官方源碼可以為我們解析Docker內部的工作原理,提高我們對Docker的理解。
在官方源碼分析之前,需要先了解Docker的主要架構:
Docker Client Docker Daemon +---------------------------+ +---------------------------+ | CLI Tooling | | Docker REST API | +---------------------------+ +---------------------------+ | Docker API Client | | Docker API Server (Engine) | +---------------------------+ +---------------------------+ | SDK | | Docker Containerd | +---------------------------+ +---------------------------+ | Docker Compose (Optional)| | Docker Swarm Mode | +---------------------------+ +---------------------------+
在以上架構中,Docker Client和Docker Daemon是我們最需要關注的部分。下面,我們看一下Docker Daemon的源碼:
daemon/ ├── container/ ├── execdriver/ ├── graph/ ├── images/ ├── network/ ├── plugins/ ├── swarm/ ├── sysinit/ ├── volumes/ ├── api.go ├── daemon.go └── integration/
容器與鏡像是Docker最核心的概念,因此,Docker Daemon的核心代碼集中在docker/container和docker/image文件夾下。
在Docker Daemon的啟動過程中,會調用daemon.Init函數,該函數會通過plugins.LoadPlugins來加載Daemon的插件。
func Init(rootDirectory string, options *InitializationOptions) (err error) { // Load required plugins err = plugins.LoadPlugins("", []string{"authz", "log", "ipam", "volumes", "network", "graphdriver"}) if err != nil { return fmt.Errorf("Error starting daemon: %v", err) } }
同時,在daemon.Start函數中啟動Docker REST API服務和Plugin API服務
func Start(host string) error { // Listen on the given socket or use the default unix socket l, err := getListener(host) if err != nil { return err } log.Info("API listen on %s", host) defer l.Close() if err := register.Init(); err != nil { return fmt.Errorf("Unable to initialize registry: %v", err) } if err := api.Run(api.Config{ SocketGroup: options.SocketGroup, EnableCors: options.EnableCors, EnableSelinuxSupport: options.EnableSelinuxSupport, Authorizer: authz.NewLegacyAuthorizer(registry.GetAuthzOptions()), DockerVersion: dockerversion.Version, CgroupRun: options.CgroupRun, CgroupDriver: options.CgroupDriver, ClusterStoreOptions: options.ClusterStoreOptions, Snapshotter: snapshotter, ServiceDiscoveryConfig: options.ServiceDiscoveryConfig, }); err != nil { return fmt.Errorf("Unable to run api: %v", err) } return nil }
通過對Docker Daemon的源碼分析,我們可以清晰地看到容器技術的內部原理。Docker作為市場上目前最強大,最流利的容器技術,它的源碼分析對于我們全面掌握容器技術有著不可替代的作用。
上一篇java 和的優先級