我在我的GUEST操作系统上运行了一个Docker守护进程,它是CentOS。我想以一种孤立的方式安装软件服务,我不需要在我的Docker容器中使用另一个操作系统映像。
我想拥有一个Docker容器,其中只包含我要安装的软件应用程序的其他二进制文件和库。
我可以使用Docker中的“whiteglove / blank”基本图像吗?我想要一个非常精简的容器,它作为我的GUEST操作系统提供的起点。这可能吗?
答案 0 :(得分:26)
您要求的东西不可能与Docker一起开箱即用。每个Docker镜像都有自己的根文件系统,需要安装某种操作系统。
您的选择是:
使用最小基本图片,例如the BusyBox image。这将为您提供运行容器所需的绝对最小值。
使用the CentOS base image ,在这种情况下,您的容器将运行相同或非常相似的操作系统。
Docker镜像的原因是因为它们是可移植的。无论操作系统如何,任何Docker镜像都可以在Docker运行的任何地方运行。这意味着Docker镜像必须包含完整的根文件系统和操作系统安装。
如果您需要来自主机操作系统的内容,您可以执行的操作是share a directory using Docker volumes。但是,这通常用于安装数据目录,并且仍然需要具有操作系统的Docker映像。
也就是说,如果你有一个完全没有依赖关系的静态链接二进制文件,那么创建一个非常小的图像变得很容易。这被称为“微容器”,尤其是Go非常适合生产这些产品。这是some further reading on microcontainers and how to produce them。
如果您想要的只是容器的资源管理部分using lxc-execute
, as described in this answer,您可以查看另一个选项。但是你也失去了所有其他漂亮的Docker功能。不幸的是,你要做的不仅仅是Docker的构建。
答案 1 :(得分:5)
来自Docker的best practices:
尽可能使用当前的官方存储库作为图像的基础。我们建议使用 Debian图像,因为它受到严格控制并保持极小(目前低于100 mb),同时仍然是完整版本。
您所要求的完全违背了使用Docker容器的想法。您不希望对您的GUEST操作系统有任何可靠性。如果你做Docker不会是便携式的。
创建容器时,您希望它在运行 Docker的任何计算机上运行。无论是CentoOS,Ubuntu,Mac还是Microsoft Azure:)
理想情况下,基本容器操作系统不需要对主机操作系统执行任何操作。
答案 2 :(得分:1)
对于任何容器,您至少需要一个根文件系统。这就是您需要使用具有根文件系统的基本映像的原因。你的想法并不完全违背容器的使用范式;与虚拟机相反,我们希望容器最小化而没有太多可以从底层操作系统中利用的重复元素。
答案 3 :(得分:1)
根据我对docker的了解,当您使用基本映像时,您实际上不要安装其他操作系统。
它只是带有预装程序的目录结构,或者可以说是实际基础映像OS的文件系统。
在大多数情况下,[click this link for the exception],当在Mac和Windows上使用时,docker本身[docker引擎]可以在linux VM上运行。
如果您对虚拟化感到困惑,则Docker Container中没有虚拟化。容器在主机操作系统内核顶部的用户空间中运行。因此,容器和主机操作系统将共享同一内核。
因此,总结一下:
结论: 在docker内部安装基本映像时,容器内没有安装其他操作系统,而仅创建了具有最少程序和工具的文件系统副本。
答案 4 :(得分:0)
通过Rohan Singh的链接,我发现了一些相关信息,这些信息通常并不矛盾,但与问题的核心思想有关:
所有Docker映像的基本映像都是scratch映像。它基本上没有任何内容。听起来可能没什么用,但是如果您可以像Go或C一样将应用程序编译为零依赖性的静态二进制文件,则可以实际使用它为应用程序创建最小的映像。