本次分析介绍Docker是如何初始化容器网络的。本次将分析libnetwork以外的内容,主要包含两个方面:
我们知道,以现在dockerd的架构,起容器需要有containerd,containerd-shim和容器进程(即容器主进程)三个进程。那么,这三个进程的依存关系如何?本次分析将介绍这方面的内容。
需要说明的是,由于不同shell中的内容并不是连贯执行的,所以进程号可能会不一致。
containerd-shim的代码位于containerd的/containerd-shim目录下,独立编译成二进制。containerd-shim是一个常驻进程,负责容器中进程的启动,是容器进程的父进程。有了containerd-shim之后,容器进程与containerd有了父子联系。
上次介绍了containerd的执行流程,其中容器相关的工作都是调用containerd中的container或process完成的。所以本次分析就介绍containerd的container和process,看这两者是如何和containerd-shim或runc打交道的。
container定义在/runtime/container.go中:
containerd的main()函数定义在/containerd/main.go中:
Docker通过gRPC调用Containerd。Containerd主要由三部分组成: containerd-ctr,containerd-shim和containerd。其中container-ctr提供了操作containerd的命令行。所以,本次分析将介绍container-ctr命令行的使用。