Linux kernel Docker如何使用不同的内核运行发行版?

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如何在Debian主机(可能是容器中的OpenSUSE)上运行?它使用不同的内核,具有不同的模块。旧的Debian版本也使用了旧的内核,那么如何在内核版本3.10+上运行它呢?旧内核只有旧的内置函数,旧发行版如何管理新功能? 其中的“诀窍”是什么

docker如何在Debian主机(可能是容器中的OpenSUSE)上运行

因为内核是相同的,并且将支持Docker引擎来运行所有这些容器映像:主机内核应该是3.10或更高版本,但是它相当稳定

见“”:

  • 应用程序包含业务逻辑,但依赖于系统调用
  • 编译应用程序后,应用程序使用(即依赖)的系统调用集将嵌入到二进制文件中(在更高级的语言中,这是解释器或JVM)
  • 容器不抽象用户空间和内核空间共享一组公共系统调用的需求
  • 在一个集装箱化的世界中,这个用户空间被捆绑起来并运送到不同的主机,从笔记本电脑到生产服务器
  • 在未来几年,这将带来挑战
  • 不时添加新的系统调用,不推荐使用旧的系统调用;在考虑容器基础结构的生命周期以及将在其中运行的应用程序时,应该考虑这一点

    另见“”:

    容器中没有内核。即使您安装了内核,在容器启动时也不会加载它。容器的目的就是隔离进程,而无需运行新内核


    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的情况下自己进行任何操作

    兼容性

    那么,“足够兼容”是什么意思呢?这取决于程序对内核的请求(系统调用)以及希望内核支持的功能。有些程序发出的请求会破坏一些东西;其他人则不然。例如,在Ubuntu 18.04(内核4.19)或类似主机上:

    • 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