CentOS Docker 映像的目的是啥? [复制]

Posted

技术标签:

【中文标题】CentOS Docker 映像的目的是啥? [复制]【英文标题】:What is the purpose of a CentOS Docker image? [duplicate]CentOS Docker 映像的目的是什么? [复制] 【发布时间】:2019-09-03 18:01:53 【问题描述】:

从我读过和听说过的关于 Docker 的所有内容来看,它的全部意义在于封装一个应用程序,以便它可以在任何机器上运行。它通过将所需的环境(工具/依赖项)包装到 docker 映像中来实现这一点。容器是图像的一个实例。 docker 容器中没有运行操作系统。

现在,如果这一切都是真的,那么为什么会存在:CentOS official docker image?我认为 docker 映像仅适用于应用程序,而不是整个操作系统。

每当我实例化该映像时,我都会得到一个容器,当附加到它时,它似乎是一个正常运行的 CentOS shell。

你可以自己动手看看我的意思:

Dockerfile 内容:FROM centos:centos7 构建镜像:docker build centos-img . 运行容器:docker run -ti centos-img 分离:ctrl+p, ctrl+q 重新附加:docker attach <container id>

这看起来和感觉都像虚拟机。

如果我运行 cat /etc/os-release,它甚至会说我运行的是 CentOS。

这究竟是什么?我可以像使用虚拟机一样使用 CentOS docker 映像吗?有什么限制?

(让我感到困惑的是docker containers != VMs,然而,通过探索,我创建了一个看起来和感觉都像 VM 的 docker 映像。如果我可以运行一个轻量级的 docker 映像,我为什么还要再次运行 VM就像虚拟机一样?)


这个 centOS docker 映像是否只是一个起点,我应该构建它(即,放入我的应用程序),以便它充当我的应用程序的主机?我阅读和深入研究 Dockerfile 示例的次数越多,我就越相信这个假设是正确的。


我真正想做的事:

我有一堆小的应用程序/服务,它们一起作为一个系统组成一个大型应用程序。我目前在 centOS 机器上运行这个系统。我希望能够轻松地运行这个大型应用程序的多个实例,每个实例都在自己的环境中/而不会互相干扰。是否可以通过使用centOS docker image + all of the small applications/services needed 来执行此操作,从而产生large application image?有了这个图像,我可以启动多个容器,每个容器都运行一个单独的大型应用程序实例?这对 Docker 来说是合理/可实现的吗?


我的某些理解可能不正确,或者我可能建议以不适合使用的方式使用 Docker。如果是这样,请随时指出。谢谢!

【问题讨论】:

“行为与虚拟机完全一样”——除了如果有人管理内核级漏洞,他们会侵入您的主机,而不需要弄清楚如何从虚拟机本身逃逸。安全模型的增量很大。 同样,有很多地方需要将容器设置为“特权”才能完全赋予功能;调用具有特权的 Docker 容器可以轻松地逃到外部世界。而理想的虚拟机是安全的,即使攻击者在其中加载恶意内核模块也是如此。 也就是说,这个问题在这里是题外话(上面链接的建议副本也是如此,这就是它被关闭的原因)。 *** 独家回答有关编写软件的问题。有关系统管理的问题不在范围内;通用操作系统或计算问题也是如此。 过去在 Docker 中带有 systemd 的 CentOS 需要一个特权容器,从而抵消了大部分(如果不是全部)安全优势。我不确定是否仍然如此。 @CharlesDuffy 请原谅我的幼稚;如果码头工人的问题是题外话,为什么有一个“码头工人”标签可用?我去 Meta 问问 ;-) 【参考方案1】:

这是一个多方面的问题,我不太可能对这个回复做出公正的回答,但我会尝试回答你的核心问题。我建议您阅读现有的许多涵盖容器基础知识的文章。

从根本上说,容器共享一个内核(通常是 Linux)而不是一个操作系统(CentOS、Debian、Ubuntu 等)。

最简单的 Linux 容器映像称为 scratch,它是空的,因此有效地为您提供了 Linux 内核。

在另一个极端,完整的 Linux 操作系统映像包括 CentOS。这些是成熟的操作系统映像,为用户和应用程序提供了与在“裸机”或 VM 上运行此类操作系统几乎相当的体验。

最好的容器实践是尝试更接近“scratch”而不是更接近例如centos。从根本上说,操作系统是大量代码,您的应用程序可能不需要其中的大部分代码。虽然拥有所有这些额外功能可能很好,但这意味着您必须维护(并保护)多余的(!)代码,这意味着您的图像也必须拖动所有这些内容。

您的应用程序不太可能在scratch 上运行,因为它们可能依赖于其他应用程序和共享库。如果您已经对这些依赖关系有了很好的了解,则应该从“scratch”之类的图像开始,然后添加您的应用所需的内容。

如果您查看网络上的 Dockerfile,您会看到许多最佳示例从较小的基础映像开始,添加必要的包,最后添加相关的二进制文件。

Apache Python 3.7 Golang 1.12 Busybox

见:

Microcontainers -- Tiny, Portable Docker Containers "Distroless" Docker Images(完全披露:我是 Google 员工)

HTH!

【讨论】:

在How to Answer 中,请参阅“回答正确提出的问题”部分,以及其中有关“与编程无关as defined in the help center”的问题的项目符号。 (关于“之前已经被多次询问和回答”的问题的要点也适用)。【参考方案2】:

CentOS(和其他完整操作系统发行版)在 Docker 中的一个常见用途是,当开发人员需要在本地运行完整系统以进行开发/测试/调试目的,但它不在生产环境中的 Docker 中运行。在 VM 甚至裸机上运行不适合 docker 的单体应用程序并不少见。

一个示例可能是将应用程序作为 AMI 部署到 AWS;这是在 Mac 或 Windows 机器上重现的重要内容,并且直接安装到 Linux 主机上是不干净的(委婉地说),可能成本过高,并且不适合离线使用以启动更多云托管实例.

Docker 的一大优势在于,它能够运行所需的最小系统或完整的操作系统安装,即使这不是最佳的。它当然有它的这种能力。

【讨论】:

以上是关于CentOS Docker 映像的目的是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在未配置的 Docker 上为 centos 7 删除/安装 docker 映像

gnome-desktop docker 映像适用于 Linux Mint 主机但不适用于 CentOS?

重新创建和扩展 centos6-i386 Docker 基础映像时出现“cp: Command not found”

Docker,它是啥,目的是啥

查找每个 Docker 映像的层和层大小

docker build 输出的目的是啥?