赞
踩
Curt J. Samp..
16
Docker从不使用其他内核:内核始终是您的宿主内核。
如果您的主机内核与您要运行的容器中的软件“足够兼容”,则它将起作用。否则就不会。
“容器”只是过程配置
要了解的关键是,Docker容器不是虚拟机:它不会创建新的虚拟机来运行该软件。取而代之的是,Docker只是在您现有的OS中运行进程,就像您从命令行启动进程一样。
容器化过程与普通过程之间的区别在于对容器化过程的限制以及对容器化过程的看法的变化。(这些将传递给由容器化进程启动的任何子进程。)典型的限制和更改包括:
而不是使用主机的根文件系统,而是在其上挂载不同的文件系统/(通常是随容器映像提供的文件系统)。主机文件系统的某些部分可以安装在新进程的根文件系统下,例如通过使用,docker run -v /u/myprogram-data:/var/data/myprogram以便在容器化进程读取或/var/data/myprogram/file写入/u/myprogram-data/file时在主机文件系统中进行读/写。
为容器化进程创建一个单独的进程空间,以便它只能看到自身及其子级(使用ps或类似的命令),而看不到主机上正在运行的其他进程。
创建一个单独的用户名称空间,以使容器中的用户与主机中的用户不同:例如,容器化过程中的UID 1234与非容器化过程中的UID 1234将不同
通常使用“虚拟路由器”并使用其自己的IP地址创建一组单独的网络接口,并在其与主机网络接口之间进行地址转换。(例如,主机在端口8080上收到数据包时,会将其转发到容器进程的虚拟网络接口上的端口80。)
所有这些都是通过内核中内置的功能来完成的。如果编写程序进行适当的设置并在启动新进程时设置适当的参数,则无需Docker就可以自己执行任何操作。
兼容性
那么“足够兼容”是什么意思呢?它取决于程序对内核提出的请求(系统调用)以及期望内核支持的功能。有些程序发出的请求会使事情中断。其他人没有。例如,在Ubuntu 18.04(内核4.19)或类似主机上:
docker run centos:7 bash 工作正常。
docker run centos:6 bash失败,退出代码为139,表示它以分段违规信号终止;这是因为4.19内核不支持bash尝试构建的功能。
docker run centos:6 ls可以正常工作,因为它不会像bash以前那样发出内核无法处理的请求。
如果您尝试docker run centos:6 bash使用较旧的内核(例如4.9或更早版本),则会发现它可以正常工作。(至少就我测试而言。)
很好的解释。为我澄清了有关Docker工作原理的许多事情。 (4认同)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。