运行容器其实不依靠Docker镜像
发布时间:2021-12-30 09:57:45 所属栏目:云计算 来源:互联网
导读:这个有点标题党的意思,但确实是事实:容器的镜像只是组织rootfs,如果我们提前准备好rootfs,那么就不需要容器的镜像。 下面我们通过一个实战演示一下,如何直接通过runc启动容器。 $ mkdir my_container cd my_container $ runc spec 通过spec命令便可以生
这个有点标题党的意思,但确实是事实:容器的镜像只是组织rootfs,如果我们提前准备好rootfs,那么就不需要容器的镜像。 下面我们通过一个实战演示一下,如何直接通过runc启动容器。 $ mkdir my_container && cd my_container $ runc spec 通过spec命令便可以生成一个config.json文件。文件的内容大概是下面这样的 { "ociVersion": "1.0.1-dev", "process": { "terminal": true, "user": { "uid": 0, "gid": 0 }, "args": [ "sh" ], "cwd": "/", "env": [ ... ], "capabilities": { ... }, "rlimits": [ ... ] }, "root": { "path": "rootfs", "readonly": true }, "hostname": "runc", "mounts": [ ... ], "linux": { "namespaces": [ { "type": "pid" }, { "type": "network" }, { "type": "ipc" }, { "type": "uts" }, { "type": "mount" } ] } } 里面就是标准的RUNC格式,主要是定义了启动命令、env、rootfs、主机名、mount挂载、namespace等。 然后我们创建一个rootfs目录 $ mkdir rootfs 然后我们写一个打印主机名的Go程序,编译后并拷贝到rootfs里面。 $ cat <<EOF > main.go package main import "fmt" import "os" func main() { fmt.Println(os.Hostname()) } EOF $ GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o printme $ mv printme rootfs/ 然后启动容器 $ sudo runc create mycont1 $ sudo runc start mycont1 便可以直接输出”runc“(因为上面spec定义的hostname就是runc)。 所以对应容器来说,只是需要一个rootfs,其实这个rootfs是怎么生成的,它其实并不关心。至于是不是用overlay 制作的更是无从感知。 (编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |