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

时间:2015-10-13 20:35:07

标签: docker

一直在尝试学习Docker,让我感到困惑的一件事是Linux(主机操作系统)的不同风格实际上是如何在Docker容器中运行的。

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

  • 从逻辑上讲,如果Ubuntu映像占用空间大约为550MB,那么Doc​​ker Daemon是否会实际下载(从映像注册表中)550MB的Ubuntu映像以创建容器?
  • 是在容器中运行的Ubuntu实例,与我手动下载并安装相同版本的情况基本没什么不同?

我知道Docker容器共享主机操作系统使用的相同内核,Docker的一个基本点是使用底层操作系统的容器效率提升。所以我对启动从不同于主机的Linux版本创建的Container时实际发生的事情感到有些困惑。

2 个答案:

答案 0 :(得分:54)

我认为上一篇文章可能会帮助您更多地了解它 - Docker container isolation, does it care about underlying Linux OS?

问题的关键在于,如果主机操作系统是RedHat,那么它就是RedHat内核,它将被您在Docker容器中运行的任何Linux版本所使用,即。你的例子中的Ubuntu。

这归结为了解Linux OS 与Linux Image 之间的区别。您不会在Docker Container中运行完整的Ubuntu操作系统,而是Ubuntu的映像。

出于你的问题的目的思考: -

操作系统 =内核+文件系统/库
图片 =文件系统/库

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

答案 1 :(得分:0)

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