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 ...
随机推荐
- AppCan可以视为Rexsee的存活版
今天看到地宝的几个APP用appcan做的,我顿时惊呆了. 1. 走的同样是中间件的模式,支持原生UI界面的访问: 2. 在线打包的方式,进行资源的限制,以便商业化支持:
- Oracle锁表与解锁
查看锁表语句:方法1: select sess.sid, sess.serial#, lo.oracle_username, lo.o ...
- 【iOS】Quartz2D截屏
一.简单说明 在程序开发中,有时候需要截取屏幕上的某一块内容,比如捕鱼达人游戏.如图: 完成截屏功能的核心代码:- (void)renderInContext:(CGContextRef)ctx;调用 ...
- 通过NameValuePairsValueProvider对象来获取指定前缀的Key
using System; using System.Collections.Generic; using System.Linq; using System.Web.Http.ValueProvid ...
- margin和padding对行内元素的影响
这个是在面试的时候,面试官问我的一个小问题 自己没有考虑过inline元素设置margin和padding的问题 学习的过程记录下来 1)inline元素的高度是由元素的内容决定的(字体的大小和行高) ...
- 奇怪的float
我在项目的实践中遇到了这样的一个问题 <div class="main"> <p>aaaa</p> <p>bbbb</p> ...
- 趣味问题:画图(c++实现)
描述:在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色.下图给出了一个画了两个矩形的例子.第一个矩形是(1, ...
- 微信公共平台开发4 .net
之前说了让微信发送给关注我们的粉丝普通的文本信息,下面我们来看看如何发送图文信息,需要注意的是这里说的是,让微信发给我们,而不是我们拍个图片发给微信处理,上传图片在以后的再讲.下面是发送图文消息的函数 ...
- SQL如何取得一个面的中心点
) .sdo_point.x x, sdo_geom.sdo_centroid(t.shape, ) .sdo_point.y y from gd_zy_region t SQL如何取得一个面的中心点 ...
- virtualbox虚拟机迁移出现"connot find device eth0"错误
我在自己的机器上面配置virtualbox虚拟机完毕以后,移植到另外一台机器上面,登陆页面总是在检查network,并且最后网络加载失败,不论我是用桥接还是NAT方式连接.登陆系统以后,我尝试连接网络 ...