docker containerd 中的create 容器操作
containerd的create container的API如下所示:
type CreateContainerRequest struct {
Id string
BundlePath string
Checkpoint string
Stdin string
Stdout string
Stderr string
Labels []string
NoPivotRoot bool
Runtime string
RuntimeArgs []string
CheckpointDir string
}
StartTask结构如下所示:
type StartTask struct {
baseTask
ID string
BundlePath string
Stdout string
Stderr string
Stdin string
StartResponse chan StartResponse
Labels []string
NoPivotRoot bool
Checkpoint *runtime.Checkpoint
CheckpointDir string
Runtime string
RuntimeArgs []string
}
1、containerd/api/grpc/server/server.go
func (s *apiServer) CreateContainer(ctx context.Context, c *types.CreateContainerRequest) (*types.CreateContainerResponse, error)
(1)、根据c填充获得e := &supervisor.StartTask{},并调用s.sv.SendTask(e)
(2)、调用 r := <-e.StartResponse,再调用apiC ,err := createAPIContainer(r.Container, false)获取创建的容器实例
(3)、return &types.CreateContainerResponse{Container: apiC,}
2、containerd/supervisor/create.go
func (s *Supervisor) start(t *StartTask) error
(1)、根据t的内容创建容器,runtime.New主要根据ContainerOpts填充结构container获得容器实例,再将创建state并写入状态文件中。
container, err := runtime.New(runtime.ContainerOpts{
Root: s.stateDir,
ID: t.ID,
Bundle: t.BundlePath,
Runtime: rt,
RuntimeArgs: rtArgs,
Shim: s.shim,
Labels: t.Labels,
NoPivotRoot: t.NoPivotRoot,
Timeout: s.timeout
})
(2)、注册新增加的容器,调用s.containers[t.ID] = &containerInfo{container: container,}
(3)、根据新获得的container实例和t的内容,填充获得startTask,再调用s.startTask <- task 交由worker处理
task := &startTask{
Err: t.ErrorCh(),
Container: container,
StartResponse: t.StartResponse,
Stdin: t.Stdin,
Stdout: t.Stdout,
Stderr: t.Stderr
}
3、containerd/supervisor/worker.go
// Start runs a loop in charge of starting new containers
func (w *Worker) Start()
containerd在刚创建时,就启动了10个goroutine,用于处理startTasks,这里的Start函数就是从startTasks这个channel中获取任务,并处理
(1)、调用process, err := t.Container.Start(t.checkpointPath, runtime.NewStdio(t.Stdin, t.Stdout, t.Stderr))启动容器,NewStdio()仅仅只是将参数封装到一个统一的Stdio结构中
(2)、分别调用w.s.monitor.MonitorOOM(t.Container),w.s.monitorProcess(process)对容器进行监控,调用t.StartResponse <- StartResponse{Container: t.Container}返回创建成功的容器实例
4、containerd/runtime/container.go
func (c *container) Start(checkpointPath string, s Stdio) (Process, error)
(1)、创建processRoot := filepath.Join(c.root, c.id, InitProcessID)目录
(2)、容器创建命令 cmd := exec.Command(c.shim, c.id, c.bundle, c.runtime),配置cmd目录为processRoot,spec, err := c.readSpec()
(3)、生成config如下:
config := &processConfig {
checkpoint: checkpointPath,
root: processRoot,
id: InitProcessID,
c: c,
stdio: s,
spec: spec,
processSpec: specs.ProcessSpec(spec.Process),
}
(4)、根据config,调用p, err := newProcess(config),生成process实例
(5)、最后调用c.createCmd(InitProcessID, cmd, p),并返回 return p, nil
5、containerd/runtime/process.go
func newProcess(config *processConfig) (*process, error)
(1)、根据config生成process实例,p := &process{root: config.root, id: config.id, container: config.c, ....., cmdDoneCh: make(chan struct{}), state: Running,}
(2)、创建状态文件os.Create(filepath.Join(config.root, "process.config")),生成ps := ProcessState{...},并将ps的内容写入状态文件中
(3)、调用exit, err := getExitPipe(filepath.Join(config.root, ExitFile))和control ,err := getControlPipe(filepath.Join(config.root, ControlFile))生成两个pipe文件,并分别将exit和control赋值给p.exitPipe和p.controlPipe,最后 return p
6、containerd/runtime/process.go
getExitPipe和getControlPipe生成两个FIFO文件,其中Exit函数中的FIFO是只读的,而Control函数中的FIFO是读写的
7、containerd/runtime/container.go
func (c *container) createCmd(pid string, cmd *exec.Cmd, p *process)
(1)、p.cmd = cmd, 再调用 cmd.Start()
(2)、构建defer函数,其中生成一个goroutine,其中调用p.cmd.Wait(),再调用same, err := p.isSameProcess(),如果same为true并且p.pid > 0则再进行一些处理
(3)、调用c.waitForCreate(p, cmd),c.processes[pid] = p
8、containerd/runtime/container.go
func (c *container) waitForCreate(p *process, cmd *exec.Cmd) error
(1)、该函数先启动一个goroutine用于从pidfile中读取pid
(2)、select,从(1)中的goroutine接收结果,或者超时,当超时时,调用cmd.Process.Kill()和cmd.Wait()
docker containerd 中的create 容器操作的更多相关文章
- JAVA中的集合容器操作类
目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...
- docker学习笔记2:容器操作
一.列出主机上已经创建的容器 docker ps -a 二.创建交互式容器 命令: docker run -i -t ubuntu /bin/bash 其中-i -t 表示创建一个提供交互式shell ...
- docker containerd中的容器操作
containerd的中的各种操作都是通过Task来进行的,因此对于容器的create, start, delete等等操作其实都是一个个的Task而已. Task的数据结构如下所示: type Ta ...
- 实例解析Docker数据卷+数据卷容器+flocker数据共享+DockerHub操作
Docker内部数据管理和Docker之间的数据共享为数据卷和数据卷容器,实例解析1.将本地的文件作为容器的数据卷,2.数据卷flocker插件实现容器集群(或者Docker Swarm)的数据共享3 ...
- docker的安装和基本的docker命令、镜像和容器的操作
1.yum 包更新到最新 yum update 2.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum insta ...
- centos7下安装docker(11容器操作总结)
这段时间主要是学习了对容器的操作,包括:容器的状态:start,stop,restart,rename,pause,unpause,rm,attach,exec,kill,logs:还学习了对容器的资 ...
- 【Docker】容器操作(转)
来自:https://www.cnblogs.com/zydev/p/5803461.html 列出主机上的容器 列出正在运行的容器: docker ps 列出所有容器: docker ps - ...
- docker 容器操作( 以 tomcat 为例 )
一.容器操作 一个镜像可以启动多个容器.比如一个 tomcat 镜像,可以启动多个tomcat 容器,启动后的这些 tomcat 都是各自独立的 二.步骤 1.搜索镜像 [root@localhost ...
- Docker.[4].容器操作.
Docker.[4].容器操作. 熟悉的指令: 启动容器 docker run 交互式启动容器 docker run -i -t IMAGENAME /bin/bash 停止容器 exit 停止容器 ...
随机推荐
- JPA学习(3)JPA API
在我们的jpa的helloworld中,我们看到了简单的一个jpa保存操作,下面就来好好学习一下,JPA最主要的几个类 1.基本的几个类: ①:Persistence 类是用于获取 EntityMan ...
- c语言笔试题(带答案)
填空: 1,short int a[10]={123, 456, 789}; sizeof(a)= 对于64位机来说,指针为8字节表示.其中 sizeof是一运算符,返回编译器为其分配的数组空间大小, ...
- HDU 2159---FATE---带限制的完全背包
HDU 2159 Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一 ...
- HDU 1028(母函数)
Online Judge Online Exercise Online Teaching Online Contests Exercise Author F.A.QHand In HandOnline ...
- 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...
- ArrayList实现源码分析
本文将以以下几个问题来探讨ArrayList的源码实现 1.ArrayList的大小是如何自动增加的 2.什么情况下你会使用ArrayList?什么时候你会选择LinkedList? 3.如何复制某个 ...
- 「C语言」Windows+EclipseCDT下的C语言开发环境准备
之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Cl ...
- C# 循环语句 for循环
循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变.for(初始条件;循环条件;状态改变){ 循环体} 给出初始条件,先判断是否满足循环条件,如果不满足条件则跳过for语句,如 ...
- [Xamarin.Android] Support Library Tips
[Xamarin.Android] Support Library Tips Support Library支持内容 Xamarin Support Library每个版本支持.那些组件,可以参考这份 ...
- XML的约束(dtd)
DTD(Document Type Definition),文档类型定义,DTD文件应使用UTF-8或Unicode 1.XML中有多少个元素,就在dtd文件中写几个 <!ELEMENT&g ...