百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

为啥docker需要shim?

bigegpt 2024-08-28 12:28 6 浏览

这个问题有点历史渊源了,其实如果玩过早期的docker的话,可能会记得,docker 最开始的时候是没有shim 进程的。那时候所有的容器进程都挂在dockerd进程下面,也就是说,如果dockerd 重启了,那么所有的容器都得跟着挂了。

还是IT 界那句俗话,没有什么东西是加一层不能解决的。那么为了解决这个问题,就得容器进程找个”爹“,这个爹就是shim。shim 会调用runc 启动容器,容器的进程的父ID 就是shim进程。

我们可以通过一个Demo 演示一下shim的作用。之前的文章已经单独分享过 runc了,感兴趣的可以翻看一下。我们通过runc 启动容器。启动前我们简单介绍一下容器里面的运行的脚本

#!/bin/sh

function report_sigpipe() {
    echo "got SIGPIPE, exiting..." > /var/trap.log;
    exit 1;
}

trap report_sigpipe SIGPIPE;

while sleep 1
do
    echo "time is $(date)";
done

代码非常简单,就是死循环,输出时间,然后sleep 1s。如果接到 SIGPIPE 信号则退出。

初始化rootfs
$ mkdir -p container1/rootfs
$ cd container1
$ sudo bash -c 'docker export $(docker create busybox) | tar -C rootfs -xvf -'
$ runc spec
修改启动命令为上面的脚本,直接粘贴规律
$ cat > rootfs/entrypoint.sh <<EOF
#!/bin/sh

function report_sigpipe() {
    echo "got SIGPIPE, exiting..." > /var/trap.log;
    exit 1;
}

trap report_sigpipe SIGPIPE;

while sleep 1
do
    echo "time is $(date)";
done
EOF

$ sed -i 's/"sh"/"sh", "entrypoint.sh"/' config.json
$ sed -i 's/"terminal": true/"terminal": false/' config.json
通过 detach 方式启动容器
$ sudo runc run --detach cont1-detached

上面是最后一行是通过命令行方式启动,接下来我们模仿docker 通过一个简单go 程序调用runc 命令启动容器。

package main

import (
    "fmt"
    "os"
    "os/exec"
    "strings"
)

func main() {
    // 创建一个管道
    rd, wr, err := os.Pipe()
    if err != nil {
        panic(err)
    }
    defer rd.Close()
    defer wr.Close()

    // 启动runc
    fmt.Println("Launching runc")
    cmd := exec.Command("runc", "run", "--detach", os.Args[1])
    cmd.Stdout = wr 
    if err := cmd.Run(); err != nil {
        panic(err)
    }

    // 读标准输出
    buf := make([]byte, 1024)
    for i := 0; i < 10; i++ {
        n, err := rd.Read(buf)
        if err != nil {
            panic(err)
        }
        output := strings.TrimSuffix(string(buf[:n]), "\n")
        fmt.Printf("Container produced: [%s]\n", output)

    }

    // 退出
    fmt.Println("We are done, exiting...")
}

运行程序可以看到如下输出

$ sudo `which go` run main.go cont2
Launching runc
Container produced: [time is Sun Dec 15 16:34:25 UTC 2019]
Container produced: [time is Sun Dec 15 16:34:25 UTC 2019]
Container produced: [time is Sun Dec 15 16:34:25 UTC 2019]
Container produced: [time is Sun Dec 15 16:34:25 UTC 2019]
Container produced: [time is Sun Dec 15 16:34:25 UTC 2019]
Container produced: [time is Sun Dec 15 16:34:25 UTC 2019]
Container produced: [time is Sun Dec 15 16:34:25 UTC 2019]
Container produced: [time is Sun Dec 15 16:34:25 UTC 2019]
Container produced: [time is Sun Dec 15 16:34:25 UTC 2019]
Container produced: [time is Sun Dec 15 16:34:25 UTC 2019]
We are done, exiting...

很奇怪吧,当我们读IO 程序退出后,即便是通过 --detach 的方式启动的runc 容器也跟着退出了。所以为了让这个容器一直运行,我们就得保证我们的shim 一直运行,并且接收容器的标准输出,并写到一个文件里面。这样后续的 docker log 或者 kubectl log 才能正常读取这些标准输出。

除此之外shim 还承担着 docker exec启动进程,以及回收子进程的功能,避免产生僵尸进程。

相关推荐

一条命令搞定pip国内镜像源设置(pip install 指定镜像)

玩python的同学想必没有不用pip的吧,pip是python包管理工具,和Nodejs的npm、Java的maven类似,这些依靠开源力量建立起的庞大软件库极大提高了开发的效率,不过默认pytho...

Cadence Allegro在PCB中手动或者自动添加差分对属性

设计PCB过程中,若设计中有差分对信号,则需要将是差分的2个信号设置为差分对,设置差分对有2种方式:手动添加及自动添加一、手动添加差分对:1、点击Setup-Constraints-Constrain...

合亿 Gutab 三防|车载工业平板功能介绍,车载工业平板厂家推荐

在商用车队管理迈向智能化、特种车辆作业追求高效化的今天,车载工业平板早已突破传统“车载导航”的单一功能,成为连接车辆、司机与云端管理的核心枢纽。从物流运输的实时调度中枢,到矿山开采的无人驾驶控制器,再...

「探长分享-黑匣子」本田冠道 2020款

【品牌】探长360汽车黑匣子【产品型号】2TPro【安装车型】本田冠道2020款【功能特点】360全景安全辅助,行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,震动监控,一步标...

「探长分享-黑匣子」奥迪A6L 2019款

【品牌】探长360汽车黑匣子【产品型号】2TPro【安装车型】奥迪A6L2019款【功能特点】360全景安全辅助,行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,震动监控,一步...

探长360全景案例分享:奥迪Q7 2011款360全景效果展示

【品牌】DCT360汽车黑匣子【产品型号】3TPro【安装车型】奥迪Q72011款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,24小时停...

「探长分享-黑匣子」保时捷Cayenne 2015款

【品牌】探长360汽车黑匣子【产品型号】4TPro【安装车型】保时捷Cayenne2015款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,...

苍蝇再小也是肉,变态电路的大阳巧客S2差点难死大神

这台大阳巧客S2电动四轮车是我家第二台四轮俱全的篷车!哈哈!大阳巧客S2配置4.5Kw永磁同步电机,SVPWM矢量控制正弦波系统,车辆在加速、爬坡上性能有提升,效率高,操控灵敏。这台车前段时间刚更换了...

「探长分享-黑匣子」奥迪Q5L 2020款

360汽车黑匣子【产品型号】4TPro【安装车型】奥迪Q5L2020款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,24小时停车监控,一秒一...

「探长分享-黑匣子」丰田兰德酷路泽 2016款

【品牌】探长360汽车黑匣子【产品型号】3TPro【安装车型】丰田兰德酷路泽2016款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,24小...

驾驶室盲区是酿成重卡事故主因?后视系统:这个锅我不背

小时候家中长辈常常提醒:离大货车远一点!司机根本看不到你!早期的货车可能真的存在驾驶盲区,比如车辆正下方,因驾驶座过高,恰好是司机看不到的视野盲区。而如今的重卡在环视系统上已经非常完善,是否还存在驾驶...

前后双录,360 G580行车记录仪(360行车记录仪g580s)

相信每一位车主都会为爱车安装行车记录仪,行车记录仪的作用不仅能为交通事故还原证据,还能防止碰瓷。传统的单镜头行车记录仪只能拍摄车头方向的行车画面,如果遇到后方车辆故意碰瓷的事故时,没有监控和后摄画面则...

海康威视同轴录像机怎么使用,海康XVR配置说明

海康威视同轴录像机支持模拟、同轴以及数字IP摄像机接入,因此在使用多种类型摄像机、老久监控项目改造等场景广泛使用。首先,新录像机第一次使用需要设置管理密码激活,密码需由8-16位数字、小写字母、大写...

亿道三防2代工业级车载平板电脑震撼登场,农机矿车专用

亿道三防近日推出2024年全新2代车载平板电脑V12R,引领多项技术创新和升级,为农机、矿车等车载领域带来了超越期待与想象的震撼体验。V12R是一款从里到外,性能、功能全线拉满的工业级车载平板电脑!拥...

分析神州十八号返回舱内的摄像机最有可能是什么类型的摄像头

有没有发现,神州十八号返回舱内摄像机的图像虽然清晰度不是很高,但是画面非常干净,没有一点干扰,几乎看不到噪点。图像清晰度不高不太可能是镜头原因,很可能是图像传感器的分辨率比较低的原因,图像传感器分辨率...