您现在的位置是:首页 > 文章详情

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

日期:2021-12-12点击:430

WOT全球技术创新大会2022,门票6折抢购中!购票立减2320元!

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

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

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

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

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

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

然后我们创建一个rootfs目录

 
  1. $ mkdir rootfs 

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

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

然后启动容器

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

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

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

原文链接:http://cloud.51cto.com/art/202112/694903.htm
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章