Contanerd 随笔

容器是特殊的进程,runc则是他们的直接管理工具,contanerd则是提供对runc的管理。contanerd通过shim(垫片代理)屏蔽底层runtime实现(如runc),管理本机所有的runc和他的容器进程实例。一个容器进程实例对应一个task。

contanerd 可以完成镜像下载unpack到容器启动的整个过程,并管理容器的整个生命周期。容器的元数据实际会存储在boltdb(golang版本地kv db)中。contanerd完成容器的信息存储和状态存储,是容器的虚拟世界管理映射。

Container为容器的数据结构标识,可被存储在boltdb中,task是执行容器的运行时对象,相当于类和对象的关系。task实际会调用绑定的runtime,Containerd默认采用runc作为runtime,其他容器运行时如(runtime)也可以通过对接shim接口来接入Containerd。

runc相当于一个命令行工具通过命令将container启动起来就不管了,containerd则是一个守护进程。

shim service负责直接和container接触,代理其IO并接收退出信号,提供统一运行接口(启动 删除 运行),在shim service 之上会有一个统一管理进程来对各个shim或者说各个task实例进行管理。

Shims实现了对bundle目录的rootfs系统的挂载,卸载,containerd的文件系统是由snapshoter管理的,containerd 为不同文件系统提供管理如ext4 overlay, 每种不同的文件系统对应各自的实现的Snapshotter, 用户可以在配置文件中指定Snapshotter。

containerd 中的service 都是通过plugin加grpc方式组织管理,实际就是将service封装成plugin形式,然后调用统一接口启动封装成plugin的所有服务。

// shim 启动入口 v2 "github.com/containerd/containerd/runtime/v2/runc/v2"
// v2 是一个实际的runc runtime shim service 管理runc的生命周期,提供实际的api 如创建 container 在容器中启动进程等 
func main() {
    shim.Run("io.containerd.runc.v2", v2.New)
}

// containerd/runtime/v2/shim/shim.go
// 初始化并启动shim server
func Run(id string, initFunc Init, opts ...BinaryOpts) {
    run(id, initFunc, config)
}

type Init func(context.Context, string, Publisher, func()) (Shim, error)

func run(id string, initFunc Init, config Config) error {
    service, err := initFunc(ctx, idFlag, publisher, cancel)
}
// containerd/client.go  Client为客户调用containerd接口,为taskService,
// diffService等提供一个统一的接口,通过grpc方式来调用。
type Client struct {
    services
    connMu    sync.Mutex
    conn      *grpc.ClientConn
    runtime   string
    defaultns string
    platform  platforms.MatchComparer
    connector func() (*grpc.ClientConn, error)
}

// 创建client
client, err := containerd.New("/run/containerd/containerd.sock")
// 实际通过unix socket来连接后端的grpc服务
func DialAddress(address string) string {
    return fmt.Sprintf("unix://%s", address)
}
// 通过init.go initial进程调用runc创建容器(调用runc cmd来实现)
func NewContainer(ctx context.Context, platform stdio.Platform, r *task.CreateTaskRequest) (_ *Container, retErr error) {
    p, err := newInit(
        ctx,
        r.Bundle,
        filepath.Join(r.Bundle, "work"),
        ns,
        platform,
        config,
        &opts,
        rootfs,
    )
    p.Create(ctx, config)
}

func (p *Init) Create(ctx context.Context, r *CreateConfig) error {
    // runtime为*runc.Runc, 实际是调用runc命令创建container
    p.runtime.Create(ctx, r.ID, r.Bundle, opts)
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • 我们为什么使用容器? 我们为什么使用虚拟机(云主机)? 为什么使用物理机? 这一系列的问题并没有一个统一的标准答案...
    永杰gg阅读 379评论 0 1
  • https://edu.aliyun.com/course/1651 第一章 云原生课 1.1 云原生技术发展历程...
    MichelleZm阅读 1,684评论 0 0
  • containerd简介 Containerd是一个工业标准的容器运行时,重点是它简洁,健壮,便携,在Linux和...
    流雨声阅读 5,995评论 0 6
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,456评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,041评论 0 4