docker containerd中的容器操作
containerd的中的各种操作都是通过Task来进行的,因此对于容器的create, start, delete等等操作其实都是一个个的Task而已。
Task的数据结构如下所示:
type Task interface {
Errorch() chan error
}
type baseTask struct {
errCh chan error
mu sync.Mutex
}
container的数据结构如下所示,而container对外暴露的interface是Container,其中包含了对container的各种操作,包括ID(), Delete()等等。
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
}
容器的delete操作
DeleteTask的数据结构如下所示:
// DeleteTask holds needed paramaters to remove a container
type DeleteTask struct {
baseTask
ID string
Status uint32
PID string
NoEvent bool
Process runtime.Process
}
-2、containerd/supervisor/monitor_linux.go
func (m *Monitor) start()对获取到的syscall.EpollEvent进行处理,当获取的event的id指向的是一个runtime.Process并且event的Events类型为syscall.EPOLLHUP时,先对该process从events中删除,进行epoll相关的清理操作,最后调用m.exits <- t
-1、containerd/supervisor/supervisor.go
func (s *Supervisor) exitHandler()
(1)、在启动daemon的时候,启动过一个exitHandler的goroutine,该函数主要的作用就是从s.monitor.exits这个runtime.Process类型的channel中获取退出的process。
(2)、对于每个退出的process,创建 e := &ExitTask{Process: p,},最后s.SendTask(e),最终经过taskHandler的调度,最终会在exit()函数进行处理
0、containerd/supervisor/exit.go
func (s *Supervisor) exit(t *ExitTask)
(1)、调用`proc := t.Process `, `status, err := proc.ExitStatus()`获取进程的退出码
(2)、如果proc.ID()不是runtime.InitProcessID,则说明只是一个exec的进程退出,则创建一个ne := &ExecExitTask{},再调用s.execExit()进行处理
(3)、若为退出的是init进程,则创建一个ne := &DeleteTask{},再调用s.delete(ne)进行处理
1、containerd/supervisor/delete.go
func (s *Supervisor) delete(t *DeleteTask) error
(1)、调用i, ok := s.containers[t.ID]获取容器实例,再调用s.deleteContainer(i.container)
(2)、当t.Process 不为nil 时,调用t.Process.Wait()
(3)、当t.NoEvent为false时,则调用s.notifySubscribers(Event{Type: StateExit, Timestamp: time.Now(), ID: t.ID, Status: t.status, PID: t.PID,})
(4)、更新supervisor的container信息,调用ContainersCounter.Dec(1)和ContainerDeleteTimer.UpdateSince(start)
2、containerd/supervisor/delete.go
func (s *Supervisor) deleteContainer(container runtime.Container) error
该函数很简单,先调用delete(s.containers, container.ID()),再调用return container.Delete()
3、containerd/runtime/container.go
首先调用os.RemoveAll(filepath.Join(c.root, c.id)),删除目录/var/run/docker/libcontainerd/containerd/container-id,接着利用exec.Command直接调用调用命令行`docker-runc delete contain-id。
容器的kill操作
1、containerd/api/grpc/server/server.go
func (s *apiServer) Signal(ctx context.Context, r *types.SignalRequest) (*types.SignalResponse)
这个函数就是根据r中的内容对supervisor.SignalTask进行填充,最后调用s.sv.SendTask(e),再返回return &types.SignalResponse{}, nil
2、containerd/supervisor/signal.go
func (s *Supervisor) signal(t *SignalTask) error
(1)、首先调用i, ok := s.containers[t.ID]获取container实例
(2)、再调用processes, err := i.container.Processes()获取容器中所有的process实例
(3)、最后遍历processes,找到t.PID对应的process,调用return p.Signal(t.Signal)
3、containerd/runtime/process.go
func (p *process) Signal(s os.Signal) error
该函数只是简单地调用return syscall.Kill(p.pid, s.(syscall.Signal)),给相应的进程发送信号。
docker containerd中的容器操作的更多相关文章
- docker containerd 中的create 容器操作
containerd的create container的API如下所示: type CreateContainerRequest struct { Id string BundlePath strin ...
- 理解Docker(6):若干企业生产环境中的容器网络方案
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- docker学习笔记2:容器操作
一.列出主机上已经创建的容器 docker ps -a 二.创建交互式容器 命令: docker run -i -t ubuntu /bin/bash 其中-i -t 表示创建一个提供交互式shell ...
- Docker Swarm 中最重要的概念- 每天5分钟玩转 Docker 容器技术(94)
从主机的层面来看,Docker Swarm 管理的是 Docker Host 集群.所以先来讨论一个重要的概念 - 集群化(Clustering). 服务器集群由一组网络上相互连接的服务器组成,它们一 ...
- 【Docker】容器操作(转)
来自:https://www.cnblogs.com/zydev/p/5803461.html 列出主机上的容器 列出正在运行的容器: docker ps 列出所有容器: docker ps - ...
- Docker基础-容器操作
1.创建容器 1.新建容器 可以使用docker create命令新建一个容器. [root@linux-node1 ~]# docker create -it ubuntu:latest ffc90 ...
- Docker学习(四): 操作容器
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- Docker学习(三)docker容器操作
上一篇:Docker学习(二)docker镜像操作 容器是基于镜像创建的,说白了把一个镜像运行起来就是容器 查看容器 docker ps 上面什么也没有,因为我们没有正在运行的容器,下面我门启动一个容 ...
- docker 容器操作( 以 tomcat 为例 )
一.容器操作 一个镜像可以启动多个容器.比如一个 tomcat 镜像,可以启动多个tomcat 容器,启动后的这些 tomcat 都是各自独立的 二.步骤 1.搜索镜像 [root@localhost ...
随机推荐
- 雷军V5,米3横空出世
小米3 下午两点,小米CEO:雷军(也是一个传奇人物),虽然没购买门票,只是自己一个人看微博,看新闻,还是了解到了小米3的面貌,这次雷哥还给大家带来了MITV,售价¥2999!(无法相信)顶配.这次我 ...
- csharp: 百度语音合成
public string API_id = "3333"; //你的ID public string API_record = null; public string API_r ...
- 整合spring,springmvc和mybatis
我创建的是maven项目,使用到的依赖架包有下面这些: <dependencies> <dependency> <groupId>org.springframewo ...
- struts2进阶篇(5)
一.OGNL简介 OGNL (Object-Graph Navigation Language)的缩写,简称对象图导航语言. OGNL表达式的特特点: >能够取对象的属性,也能调用对象的方法. ...
- 推荐轻量友好的.NET测试断言工具Shouldly
Shouldly是一个轻量的断言(Assertion)框架,用于补充.NET框架下的测试工具.Shouldly将焦点放在当断言失败时如何简单精准的给出很好的错误信息. Shouldly在GitHub的 ...
- 导入myeclipse项目出现的问题及解决方案
1.myeclipse 方法上加上@Override就报错 在有@Override方法上面会报错如下: The method oncreate(Bundle) of type HelloWorld m ...
- Python连接MySQL数据库
连接MySQL数据库 源码: import MySQLdb #导入MySQLdb模块 print '连接数据库</br>' #连接MySQL数据库 connect the database ...
- jQuery $.extend()用法总结
Query开发插件的两个方法 1.jQuery.extend(object);为扩展jQuery类本身.为类添加新的方法. 2.jQuery.fn.extend(object);给jQuery对象添加 ...
- “连不上 ArcGIS License Manager ”的一点常用诊断方法
在 ArcGIS Desktop 的问题库中,有一类不算做核心技术问题,但却可能会位列“最常见的问题”之一.简言之一句话,”许可服务器连不上怎么办?!“ 下面就来演绎下问题的诊断过程. 本文仅适用于客 ...
- AE用线来分割线面(C#2010+AE10.0… .
希望指正. 在 ITools 类中,部分方法如下: public override void OnMouseDown(int Button, int Shift, int X, int Y) { if ...