欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

docker官方源碼分析(docker官方鏡像)

林玟書1年前10瀏覽0評論

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作為市場上目前最強大,最流利的容器技術,它的源碼分析對于我們全面掌握容器技術有著不可替代的作用。