你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
输入关键字进行搜索
搜索:
没有找到相关结果
xds2000 - 数人科技CTO
赞同来自: 田浩浩 、wangzi19870227 、azhai 、DaoCloud 、石海旭 、yaoguo 、尘泥更多 »
yingz - 80后it男。。。
赞同来自: quanquan 、用心阁
libc.so
scratch
pause
rootfs
/bin
busybox
ubuntu
centos
赞同来自: quanquan
run.sh
shell
要回复问题请先登录或注册
3 个回复
xds2000 - 数人科技CTO
赞同来自: 田浩浩 、wangzi19870227 、azhai 、DaoCloud 、石海旭 、yaoguo 、尘泥更多 »
这个问题可能只有我能回答了。请让我慢慢道来。
首先我来回答一下问题一,Container内需不需要OS?
Container不是一个VM技术,所以和OS没有关系。如果我没有理解错,这个Container应该指的是Docker Run出的运行环境,因为在里面我们可以运行一些命令,让使用者以为它就是一个完整的OS环境。这是不对的。其实Docker只是一个进程。当你使用docker exec登录进去的也只是一个Terminal的模拟环境。它不是真实的OS。正因为它不是OS,所以它是直接调用主机的Kernel的。而Container本身只是一个系统进程。
好了,我来回答第二个问题:为何需要OS的基础镜像?
首先,OS的问题上面已经解释过了,它不是一个OS,但为何需要OS的基础镜像?其实这里的基础镜像是一个包含rootfs的镜像。Kernel启动后是需要把启动文件解压到rootfs上的,然后kernel找到init文件启动就可以得到一个Linux环境了,Docker做的事情就是模拟这个过程,让kernel给出一个独立的隔离环境。
mkdir testfs
curl -sSL github.com/jpetazzo/docker-busybox/raw/buildroot-2014.02/rootfs.tar | tar -xC testfs
cd testfs
你可以看一下一个rootfs的解压后的目录就能大致了解我说的意思了。
yingz - 80后it男。。。
赞同来自: quanquan 、用心阁
补充一下,如果要启动的进程没有任何依赖,即:没有使用任何系统命令,静态链接的(没有使用
libc.so
等动态库)的程序,这样极端的情况是可以没有rootfs的。这样的例子请看(http://segmentfault.com/a/1190000000628247) 和 (http://blog.csdn.net/hazir/article/details/45111161) 这两篇文章,他们基于
scratch
,分别加入了一个静态编译的go程序和一个汇编的hello-world小程序,做了可能只有几kB的镜像。另一个例子是k8s的每个pod里都有的
pause
镜像,这里是(https://github.com/kubernetes/ ... erfile) ,也是一个静态链接的go程序。它的作用是创建一个网络栈,以便与pod中其它用户容器共享同一个网络栈。一般docker镜像中的程序都是要依赖一些
rootfs
中的文件的,最重要的就是libc.so
这些动态库了,像/bin
下面的系统命令一般不是必要的,但为了方便也都放到里面了(busybox
的镜像中大部分系统命令都是链接到了busybox
程序)。即便是大家熟悉的
ubuntu
,centos
这些镜像,也是做过精简的,跟我们自己从.iso一步步安装得到的不完全一样。yingz - 80后it男。。。
赞同来自: quanquan
再补充一下,在(http://linux.cn/article-5427-1.html) 这篇文章中,第二种方法也是从
scratch
来创建镜像的,只添加了一个run.sh
,但文章中没有给出这个脚本的内容。实际上这样很可能是行不通的,因为scratch
镜像里什么都没有,当然也没有shell
用来执行这个脚本。