Linux kernel Docker如何使用不同的内核运行发行版?
docker如何在Debian主机(可能是容器中的OpenSUSE)上运行?它使用不同的内核,具有不同的模块。旧的Debian版本也使用了旧的内核,那么如何在内核版本3.10+上运行它呢?旧内核只有旧的内置函数,旧发行版如何管理新功能? 其中的“诀窍”是什么 docker如何在Debian主机(可能是容器中的OpenSUSE)上运行 因为内核是相同的,并且将支持Docker引擎来运行所有这些容器映像:主机内核应该是3.10或更高版本,但是它相当稳定 见“”:Linux kernel Docker如何使用不同的内核运行发行版?,linux-kernel,docker,linux-distro,Linux Kernel,Docker,Linux Distro,docker如何在Debian主机(可能是容器中的OpenSUSE)上运行?它使用不同的内核,具有不同的模块。旧的Debian版本也使用了旧的内核,那么如何在内核版本3.10+上运行它呢?旧内核只有旧的内置函数,旧发行版如何管理新功能? 其中的“诀窍”是什么 docker如何在Debian主机(可能是容器中的OpenSUSE)上运行 因为内核是相同的,并且将支持Docker引擎来运行所有这些容器映像:主机内核应该是3.10或更高版本,但是它相当稳定 见“”: 应用程序包含业务逻辑,但依赖于系统调
Docker从不使用不同的内核:内核始终是您的主机内核 如果您的主机内核与您想要运行的容器中的软件“足够兼容”,那么它将正常工作;否则就不会了 “容器”只是流程配置 要理解的关键是Docker容器不是虚拟机:它不会创建新的虚拟计算机来运行软件。相反,Docker只是在现有操作系统中运行进程,就像从命令行启动进程一样 容器化流程与普通流程之间的区别在于对容器化流程的限制以及对其周围环境的看法的变化。(这些将传递给容器化进程启动的任何子进程。)典型的限制和更改包括:
- 不要使用主机的根文件系统,而是在
上装载不同的文件系统(通常是随容器映像提供的文件系统)。主机文件系统的一部分可以安装在新进程的根文件系统下,例如,通过使用/
,这样当容器化进程读取或写入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-runcentos:7bash运行良好
docker run centos:6 bash失败,退出代码为139,这意味着它以分段冲突信号终止;这是因为4.19内核不支持由
构建的东西bash
工作正常,因为它不会像docker-run-centos:6 ls
那样发出内核无法处理的请求bash
如果您尝试在较旧的内核(比如4.9或更早版本)上运行centos:6bash,您会发现它可以正常工作。(至少就我测试的情况而言。)我认为上述内容并不能完全回答这个问题。虽然我完全同意引用的链接提供了很好的解释,为什么容器没有生成它们自己的内核,但实际上我们可能希望生成一个可能依赖于特定内核版本的容器。我认为docker即使在linux主机上运行,也可能有一种模式,您可以在其中选择内核版本。容器配置更改内核响应系统调用的方式,例如,如果您
打开(“/etc/passwd”,O_RDONLY)
,那么内核已知的许多文件中哪一个实际打开了?从用户空间的角度来看,这个过程与“非集装箱化”过程没有什么不同。很好的解释。为我澄清了许多关于docker如何工作的事情。这是一个很好的答案!回答了我很多关于docker的问题。我最近听到了一个expressi