選單

執行容器其實不需要Docker映象

這個有點標題黨的意思,但確實是事實:容器的映象只是組織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 < main。gopackage mainimport “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 製作的更是無從感知。