在Docker容器中运行不同的Linux操作系统?

在Docker容器中运行不同的Linux操作系统?,docker,Docker,我一直在努力学习Docker,有一件事让我困惑,那就是不同风格的Linux(对于主机操作系统)是如何在Docker容器中运行的 如果我们假设我的Docker主机正在运行RedHat,并且我从Ubuntu映像启动了一个容器,那么以下是真的吗 从逻辑上讲,如果Ubuntu映像占用大约550MB,那么Docker守护进程是否会下载(从映像注册表)550MB的Ubuntu映像来创建容器 在容器中运行的Ubuntu实例与我手动下载并安装相同版本的Ubuntu实例基本上没有什么不同吗 我知道Docker

我一直在努力学习Docker,有一件事让我困惑,那就是不同风格的Linux(对于主机操作系统)是如何在Docker容器中运行的

如果我们假设我的Docker主机正在运行RedHat,并且我从Ubuntu映像启动了一个容器,那么以下是真的吗

  • 从逻辑上讲,如果Ubuntu映像占用大约550MB,那么Docker守护进程是否会下载(从映像注册表)550MB的Ubuntu映像来创建容器
  • 在容器中运行的Ubuntu实例与我手动下载并安装相同版本的Ubuntu实例基本上没有什么不同吗

我知道Docker容器与主机操作系统使用的内核是相同的,Docker的一个基本点是它在使用底层操作系统时提高了容器的效率。因此,当您启动一个从不同于主机的Linux版本创建的容器时,我对实际发生的情况感到有点困惑。

我认为前一篇文章可能会帮助您更好地理解它-

问题的关键在于,如果主机操作系统是RedHat,那么无论您在Docker容器(例如,Ubuntu)中运行什么版本的Linux,都将使用RedHat内核

这归结为理解Linux操作系统和Linux映像之间的区别。您将不会在Docker容器中运行完整的Ubuntu操作系统,而是运行Ubuntu的一个映像

为了回答你的问题,请思考:-

OS=内核+文件系统/库
映像=文件系统/库


运行在Docker容器中的Ubuntu映像只是Ubuntu文件系统/库,它不包含Ubuntu内核。这部分解释了Docker容器的效率,它利用底层主机的内核(除其他外)。

运行在Docker容器内的Ubuntu映像运行在该容器的用户空间中。此映像可以对RedHat主机OS内核进行内核系统调用(作为将某些用户操作的控制权从用户空间转移到内核空间的一部分)。由于核心内核是通用技术,因此即使从Ubuntu用户空间代码调用Redhat内核代码,系统调用也应该兼容。这种兼容性使我们能够跨可能都有不同基本操作系统映像的容器共享内核。

投票否决应该有一个强制性的匿名评论,这样至少像我这样的新手可以判断出为什么这个问题不好。这样做不对吗?谢谢你的解释。这让事情变得明朗了一点。我想你需要更多地了解Linux。你有使用RHEL6(或Centos6)映像的容器运行RHEL7(或Centos7)操作系统的经验吗?您认为在这方面可能存在问题吗?^^[例如,我怀疑RHEL7和RHEL6之间的3.10.x和2.6.x内核之间可能存在ABI兼容性问题]