gpt4 book ai didi

linux-kernel - Docker 如何运行具有不同内核的发行版?

转载 作者:IT老高 更新时间:2023-10-28 12:35:52 25 4
gpt4 key购买 nike

docker 如何在 Debian 主机上运行,​​或者在容器中的 OpenSUSE 上运行?它使用不同的内核,具有独立的模块。旧的 Debian 版本也使用了旧的内核,那么如何在内核版本 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 地址创建一组单独的网络接口(interface),通常使用“虚拟路由器”并在这些网络接口(interface)和主机网络接口(interface)之间进行地址转换。 (例如,主机在 8080 端口收到数据包时,会将其转发到容器进程的虚拟网络接口(interface)上的 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 那样发出内核无法处理的请求。

如果您在较旧的内核(例如 4.9 或更早版本)上尝试 docker run centos:6 bash,您会发现它可以正常工作。 (至少就我的测试而言。)

关于linux-kernel - Docker 如何运行具有不同内核的发行版?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32841982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com