【问题标题】:Docker container isolation, does it care about underlying Linux OS?Docker容器隔离,它关心底层Linux OS吗?
【发布时间】:2015-04-29 18:01:42
【问题描述】:

如果我在一组不同的 Linux 发行版上运行 Docker Engine 和同一个容器,容器会以相同的方式运行吗?我之所以问,是因为在许多情况下,应用程序依赖于特定的 Linux 发行版来获取某些资源,例如字体。如果我在 Docker 容器中运行的应用程序依赖于 Ubuntu 中使用的字体(并且可能还有许多其他依赖项),这是如何管理的?我是否需要在容器内安装字体,是否需要在运行应用程序的容器内运行 Ubuntu,或者应用程序是否使用运行容器的底层操作系统的字体?

【问题讨论】:

  • 字体是如何使用的?例如。您的程序通过 X 或通过 Web 浏览器中的 HTML/CSS 或其他方式使用它们?

标签: docker


【解决方案1】:

任何缺少的资源都应安装在 Docker 镜像中(可以从 ubuntu 镜像开始)。
它不应该依赖主机的依赖关系。

这个想法是能够在每次从图像运行容器时重现环境。

容器看不到主机资源(除了挂载的卷),因为它在容器和主机之间有Docker引擎,为了配置cgroupsnamespaces来控制容器可以看到哪些资源和访问。

"fedora" image referenced in jboss/basebase image

在 Docker 术语中,只读层称为镜像。图像永远不会改变。

由于 Docker 使用联合文件系统,进程认为整个文件系统都是以读写方式挂载的。但是所有的更改都转到最顶层的可写层,而在下面,只读图像中的原始文件没有改变。
由于图像不会改变,所以图像没有状态。

见“What is the relationship between the docker host OS and the container base image OS?”:

主机操作系统和容器之间的唯一关系是内核。

由于内核仍然是主机的内核,因此您不会有任何发行版提供的特定内核模块/补丁。

【讨论】:

  • 没错,Docker 进程唯一应该与宿主 OS 共享的就是内核。其他一切都应该在容器镜像本身(或定义良好的外部服务,如数据库服务器)中。
  • 谢谢。 docker 引擎是否带有默认的 linux,或者你总是在你的 dockerfile 中定义它?我看到了,例如Jboss Wildfly 使用从下载 Fedora 开始的“基础”映像。
  • @user1340582 没有在 Linux 主机上安装 docker 引擎,这就是为什么说主机应该有一个 3.10+ 内核(为了提供 Docker 依赖的 lxc、cgroups 和其他功能)跨度>
  • @user1340582 jboss Wildfly (registry.hub.docker.com/u/jboss/wildfly/dockerfile) 的 Dockerfile 使用镜像(jboss base,registry.hub.docker.com/u/jboss/base/dockerfile,基于 fedora 镜像)。这与主机无关(我可以在我的 Tiny core boot2docker VM 上运行它,一个 27 MB 的 Linux 主机)
  • 它下载的不是fedora“操作系统”,而是一个fedora镜像(见我上面编辑过的答案),它是一个包含fedora文件的文件系统。要成为一个功能齐全的操作系统,它需要其 Linux 主机的内核:参见stackoverflow.com/q/18786209/6309
【解决方案2】:

你需要注意的是

  • 内核依赖,
  • 以及一些强制访问控制(SELinux、Apparmor)配置,这些配置依赖于发行版,可能会影响 Docker 容器的工作方式。

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    相关资源
    最近更新 更多