容器是否有操作系统?

分享于 

7分钟阅读

互联网

  繁體 雙語

问题:

我知道容器使用主机内核和我所理解的,这就是我们不需要操作系统的原因。 我的问题是( 我在网上找不到任何好的解释):

1 ) 如果是这样的话,我们得到一个 shell 提示,如何在容器上使用 systemctl。服务等等。

2 ) 我们如何在Ubuntu主机上安装一个CentOS容器? 在这种情况下,容器在容器映像中安装了操作系统?


回答 1:

是的。每个容器都是基于一个操作系统镜像,比如 Alpine,CentOS或者 Ubuntu。

它们只共享主机内核,但是在特定的NAME 空间中运行每个用户空间进程。

查看 dockerfile示例 ( 由我改编) 以了解以下内容:


FROM ubuntu



MAINTAINER Kimbro Staken version: 0.1 



RUN apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf/var/lib/apt/lists/*



ENV APACHE_RUN_USER www-data


ENV APACHE_RUN_GROUP www-data


ENV APACHE_LOG_DIR/var/log/apache2



EXPOSE 80



CMD ["/usr/sbin/apache2","-D","FOREGROUND"]



这告诉 Docker 从Ubuntu基础映像( 如果未指定版本,则为最新版本) 创建容器,在其中安装并运行 Apache,并向主机操作系统公开端口 80.


回答 2:

什么是操作系统?

Linux内核本身满足了大多数要成为操作系统的关键需求。 它可以为CPU分片,管理控制台 IO,磁盘IO和网络,可以为图形输出提供硬件 agnosic。 在不加载库的情况下,无法编写运行在Linux内核上的程序并利用这些特性。

然而,谈到现代通用操作系统时,大多数人对操作系统的看法更广泛。 除了内核之外,它们还包含了许多其他的东西。 使用 shell 系统和X,可以将驱动程序模块安装到内核中,这样就无需构建驱动程序模块,安装其他文件系统的工具,安装其他文件系统,软件包管理器等。 我们将这些部分称为除内核以构建现代操作系统"用户"的这些部分。

Linux发行版的大多数标识都来自用户。 如果你有一个Centos运行在Ubuntu内核上,它会感觉更像Centos而不是 Ubuntu。

容器可以让单个内核假装是多个独立的内核。 每个都有自己的pid,它是自己的文件系统 heiracy,它是自己的网络接口和自己的用户帐户。

运行Linux内核的实际系统一样,你可以编写一个在容器中运行的程序,而。 实际上,容器比实际系统更容易,因为你不需要担心驱动器和容器管理器已经初始化。

但大多数时候人们想要从容器中取出的东西是"虚拟化但更便宜"。 他们想拆分服务器的逻辑功能,可以独立地备份。迁移。更新等。

因此容器通常最终包含一个普通的Linux发行版的整个客户端。 使用init系统。shell。ssh服务器完成。 这算不算一个操作系统? 这就是你如何定义操作系统的问题 !


回答 3:

它很大程度上取决于你对 O.S.的看法。

容器本质上是将正在运行的进程与机器上所有其他进程隔离的方法,以及来自主机 文件系统的二进制和所有依赖项。 这样就使得在任意数量的机器之间移动和运行变得微不足道。 因为你在问题中提到,所以在容器中运行的任何进程都在主机内运行。 从一些观点来看,操作系统本质上是内核。

平衡的是,大多数软件不是单独构建的,而是在编译时链接,与任意数量的共享库相关。 所以当你安装一个操作系统发行版,以及内核,你得到一系列的库和实用程序,你从 O.S. 仓库安装的所有程序都会根据操作系统发行版的库构建。

现在构建容器时,需要付出的代价是要运行的二进制文件,以及二进制文件所依赖的任何东西。 不需要打包完整的O.S. 发行版 文件系统。 如果你的二进制文件没有链接到任何它的他库,你几乎可以使用单一的二进制文件和它的他。 查看这个项目,它由与同一客户机合作的一个chap编写,它演示了构建功能容器所需的很少的时间。

所以在理想的世界中,最佳实践是构建一个运行单个进程的容器。 然而,在许多情况下,使用这个过程和耗费时间的过程是非常有用的。 因这里,现在已经成为一个非常常见的Pattern,只需将整个 文件系统 从容器中的一个操作系统包装出来。 它还增加了包管理工具将出现的便利性,这使得构建容器变得更加容易。 这也意味着,也存在诸如shell之类的工具,这使得调试容器( 在一些人心中,除非你在开发一个新的容器映像,如果你需要访问容器中的shell。) 变得更加容易。

我理解为什么 Pattern 变得如此流行,但我认为它有缺点。 你的问题首先展示了它使容器看起来像 virtualistation,因而产生了很多混乱。 更多的,作为一个刚刚完成了,服务器硬化的人,包括每个容器中包括厨房水槽的东西。

要扩展你的两个具体问题:

1 ) 我已经讨论了贝壳的主题。 比如 systemd,它们在容器中根本没有位置。 Dockefile定义启动容器时要运行的进程。 如果你试图在容器中运行服务管理器和多个服务,则可能会对它的进行错误的处理。

2 ) 这又回到了什么是 O.S.的问题? 在容器中安装给定发行版的唯一意义是,你获得了 文件系统 和二进制文件的发行版本。 这与虚拟化不同,在这里你有一个,的副本,在一个主机上运行的,Debian。


回答 4:

是,每个 Docker 图像都建立在基础图像之上。 dockerfile中的第一个语句定义了一个基础图像,用于构建新的Docker 映像。 假设你想建立在centOS操作系统之上。 然后使用下面

它指示 Docker 从 centos:latest 创建一个像基础图像的usign



Contain  容器  
相关文章