libnetwork源码分析(一)-controller(1)-v1.12.3

controller

controller是libnetwork的核心,本次将对controller展开分析。分析将从controller的功能展开:

阅读全文

libnetwork基本概念-v1.12.3

需长期完善修改:

Controller:

Controller通过暴露给用户创建和管理网络的API,以便用户对libnetwork进行调用。

阅读全文

Docker容器网络初始化源码分析-v1.12.3

本次分析介绍Docker是如何初始化容器网络的。本次将分析libnetwork以外的内容,主要包含两个方面:

  1. Daemon如何调用libnetwork初始化网络;
  2. runc如何调用libnetwork-setkey。

阅读全文

Docker-reexec机制分析-v1.12.3

什么是reexec机制

通常,我们在定义命令行对应的函数时,通常使用第三方包进行。所以这就要求预先规划好该可执行文件支持多少子命令。但在Docker中,有一种需要动态注册子命令机制供第三方包或docker本身使用,这些子命令通常不是面向用户。
Docker提供的注册机制就是reexec机制。

阅读全文

containerd,containerd-shim和runc的依存关系

我们知道,以现在dockerd的架构,起容器需要有containerd,containerd-shim和容器进程(即容器主进程)三个进程。那么,这三个进程的依存关系如何?本次分析将介绍这方面的内容。
需要说明的是,由于不同shell中的内容并不是连贯执行的,所以进程号可能会不一致。

阅读全文

runc源码分析(一)-create和start流程-v1.0.0-rc2

流程简述

先简要地描述create和start的流程,以方便后面的代码分析。
我们使用runc create创建容器,使用runc start启动容器。主要流程如下:

阅读全文

containerd-shim源码分析-v0.2.4

containerd-shim的代码位于containerd的/containerd-shim目录下,独立编译成二进制。containerd-shim是一个常驻进程,负责容器中进程的启动,是容器进程的父进程。有了containerd-shim之后,容器进程与containerd有了父子联系。

阅读全文

containerd-container和process-v0.2.4

上次介绍了containerd的执行流程,其中容器相关的工作都是调用containerd中的container或process完成的。所以本次分析就介绍containerd的container和process,看这两者是如何和containerd-shim或runc打交道的。

container

container定义在/runtime/container.go中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type container struct {
// path to store runtime state information
root string
id string
bundle string
runtime string
runtimeArgs []string
shim string
processes map[string]*process
labels []string
oomFds []int
noPivotRoot bool
timeout time.Duration
}

阅读全文

containerd执行流程分析-v0.2.4

启动过程

containerd的main()函数定义在/containerd/main.go中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
func main() {
logrus.SetFormatter(&logrus.TextFormatter{TimestampFormat: time.RFC3339Nano})
app := cli.NewApp()
app.Name = "containerd"
if containerd.GitCommit != "" {
app.Version = fmt.Sprintf("%s commit: %s", containerd.Version, containerd.GitCommit)
} else {
app.Version = containerd.Version
}
app.Usage = usage
app.Flags = daemonFlags
app.Before = func(context *cli.Context) error {
setupDumpStacksTrap()
if context.GlobalBool("debug") {
logrus.SetLevel(logrus.DebugLevel)
if context.GlobalDuration("metrics-interval") > 0 {
if err := debugMetrics(context.GlobalDuration("metrics-interval"), context.GlobalString("graphite-address")); err != nil {
return err
}
}
}
if p := context.GlobalString("pprof-address"); len(p) > 0 {
pprof.Enable(p)
}
if err := checkLimits(); err != nil {
return err
}
return nil
}
app.Action = func(context *cli.Context) {
if err := daemon(context); err != nil {
logrus.Fatal(err)
}
}
if err := app.Run(os.Args); err != nil {
logrus.Fatal(err)
}
}

阅读全文

containerd-crt命令行使用-v0.2.4

Docker通过gRPC调用Containerd。Containerd主要由三部分组成: containerd-ctr,containerd-shim和containerd。其中container-ctr提供了操作containerd的命令行。所以,本次分析将介绍container-ctr命令行的使用。

阅读全文