运行容器其实不需要Docker镜像

云计算 这个有点标题党的意思,但确实是事实:容器的镜像只是组织rootfs,如果我们提前准备好rootfs,那么就不需要容器的镜像。

这个有点标题党的意思,但确实是事实:容器的镜像只是组织rootfs,如果我们提前准备好rootfs,那么就不需要容器的镜像。

下面我们通过一个实战演示一下,如何直接通过runc启动容器。

  
 
 
  1. $ mkdir my_container && cd my_container
  2. $ runc spec

通过spec命令便可以生成一个config.json文件。文件的内容大概是下面这样的

  
 
 
  1. {
  2.     "ociVersion": "1.0.1-dev",
  3.     "process": {
  4.         "terminal": true,
  5.         "user": {
  6.             "uid": 0,
  7.             "gid": 0
  8.         },
  9.         "args": [
  10.             "sh"
  11.         ],
  12.         "cwd": "/",
  13.         "env": [ ... ],
  14.         "capabilities": { ... },
  15.         "rlimits": [ ... ]
  16.     },
  17.     "root": {
  18.         "path": "rootfs",
  19.         "readonly": true
  20.     },
  21.     "hostname": "runc",
  22.     "mounts": [ ... ],
  23.     "linux": {
  24.         "namespaces": [
  25.             { "type": "pid" },
  26.             { "type": "network" },
  27.             { "type": "ipc" },
  28.             { "type": "uts" },
  29.             { "type": "mount" }
  30.         ]
  31.     }
  32. }

里面就是标准的RUNC格式,主要是定义了启动命令、env、rootfs、主机名、mount挂载、namespace等。

然后我们创建一个rootfs目录

  
 
 
  1. $ mkdir rootfs

然后我们写一个打印主机名的Go程序,编译后并拷贝到rootfs里面。

  
 
 
  1. $ cat < main.go
  2. package main
  3. import "fmt"
  4. import "os"
  5. func main() {
  6.     fmt.Println(os.Hostname())
  7. }
  8. EOF
  9. $ GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o printme
  10. $ mv printme rootfs/

然后启动容器

  
 
 
  1. $ sudo runc create mycont1
  2. $ sudo runc start mycont1

便可以直接输出”runc“(因为上面spec定义的hostname就是runc)。

所以对应容器来说,只是需要一个rootfs,其实这个rootfs是怎么生成的,它其实并不关心。至于是不是用overlay 制作的更是无从感知。

网站栏目:运行容器其实不需要Docker镜像
网页网址:http://www.shufengxianlan.com/qtweb/news6/379306.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联