加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 云计算 > 正文

运行容器其实不依靠Docker镜像

发布时间:2021-12-30 17:09:24 所属栏目:云计算 来源:互联网
导读:这个有点标题党的意思,但确实是事实:容器的镜像只是组织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 制作的更是无从感知。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读