为啥 Ubuntu docker 映像不是 VM [重复]
Posted
技术标签:
【中文标题】为啥 Ubuntu docker 映像不是 VM [重复]【英文标题】:Why is the Ubuntu docker image not a VM [duplicate]为什么 Ubuntu docker 映像不是 VM [重复] 【发布时间】:2019-05-27 01:55:13 【问题描述】:我明白虚拟机和容器之间的巨大差异。但这让我对 Ubuntu 容器如何存在感到困惑。由于 Ubuntu 是一个操作系统,我觉得这很矛盾。
https://hub.docker.com/_/ubuntu
这不是一个完整的客户操作系统吗?那么是什么让它成为虚拟机上的容器呢?还是容器和虚拟机之间的界限模糊了?
我试过用谷歌搜索,但我发现的唯一结果是经典的虚拟机与容器的答案,这并不是我真正想问的。
编辑 - 我已更新以尝试进一步澄清我的问题。
【问题讨论】:
简短回答:Docker 共享主机的内核和物理设备; VM 具有重复的内核和仿真硬件。 Docker 容器通常也不会运行捆绑到用户空间中的所有内容,而只会运行一些具有该用户空间可用的目标应用程序。 (它“看起来像” Ubuntu,但没有运行 systemd、cron、sshd……) 我更新了我的问题以尝试澄清。我不是在问虚拟机和容器之间的区别。但更何况像 Ubuntu 这样的整个操作系统怎么能成为一个容器呢,为什么不把它称为虚拟机呢。 “Ubuntu 的 docker 容器”不是“整个操作系统”;它不运行自己的内核。当然,它是整个操作系统的用户空间——但是,不管它是运行自己的 ring-0 还是仅仅作为其他人内核中的一堆命名空间,这正是区别所在。 @CharlesDuffy 回答了我的问题,谢谢。这是我在 Sack Overflow 上的第一篇文章,我不确定它为什么被否决。我认为链接的问题与我要问的问题不同。 @WinstonHenke,问题不在于编写代码,并且不能/不能合理地期望答案会改变 如何 你编写代码(也就是你如何进行软件开发的实践,这对于使其成为关于软件开发的“实用”问题至关重要),所以这里是题外话。 Stack Exchange 网络中还有其他站点可以很好地适应它,但它并不完全符合 SO 的准则。 【参考方案1】:Docker 是一种在隔离的轻量级容器中运行应用程序的新方式。即使它们是孤立的,它们也可以与其他组件集成。
效率并不是唯一的收获。当您打包应用程序以在 Docker 中运行时,您将获得可移植性。您可以在笔记本电脑上的 Docker 容器中运行您的应用,它在数据中心的服务器和任何云中的虚拟机 (VM) 上的行为方式完全相同。
另一个重要的动力是安全性。容器增加了应用程序之间的安全隔离,因此您可以确信,如果一个应用程序受到攻击,攻击者将无法继续攻击同一主机上的其他应用程序。
当您将应用程序打包为 Docker 映像时,它们都具有相同的形状 — 您可以以相同的方式部署、管理、保护和升级它们。
回答你的问题:
每个 docker 容器都运行自己的轻量级虚拟机,因此普通虚拟机之间的界限很模糊,除了 docker 容器不像普通虚拟机那样适用于 GUI 应用程序这一事实。
你猜错了。您需要在 Dockerfile 中包含一个操作系统,然后是应用程序代码。但是,根据您的应用程序,如果您只想运行一个简单的控制台应用程序,Docker Hub 上存在不同大小的 OS 映像,例如 windows nanoserver。那么您就不需要具有完整操作系统的 VM。您可以做的另一件事是在您的 dockerfile 中运行分阶段构建,这将编译您的应用程序并仅在您的映像中包含运行时环境,从而有效地减小其大小。
Docker 主要用于 dockerrize 新旧应用程序,这意味着将它们拆分为逻辑分离的容器。当应用程序被 dockerrized 时,它会获得诸如安全性、依赖关系分离、零停机维护、持续集成管道、可移植性、效率等好处。您无法使用常规 VM 将应用程序容器化。 docker 容器和常规 VM 的用途和构建是不同的。
如果您正在使用 Windows 容器以更好地了解 docker 的用途,我可以推荐以下书籍: https://www.packtpub.com/virtualization-and-cloud/docker-windows
如果没有,那么 packt 为 linux 上的 docker 提供其他书籍。
我希望这能回答你的问题:)
【讨论】:
我编辑了我的问题。我并不是真的在问 VM 和容器之间有什么区别,我明白了。我不明白的是,像 Ubuntu 这样的整个操作系统如何成为一个容器……那不就是一个虚拟机吗? Ubuntu 映像不包含整个操作系统,而仅包含使其轻量级的必要元素。正如 Ken Cochrane 在***.com/questions/16047306/… 中解释的那样:“一个完整的虚拟化系统会分配给它自己的一组资源,并进行最少的共享。您会获得更多的隔离,但它会更重。使用 Docker,您可以获得更少的隔离,但容器是轻量级的。因此您可以轻松地在主机上运行数千个容器,并且它甚至不会闪烁“所以是的,它只是一个没有 GUI 的 VM。 我找不到任何文档。您说“Ubuntu 映像不包含整个操作系统”。但我假设它具有部分或大部分 Linux 内核,使其成为一个完整的操作系统。这基本上是我问题的核心。 一个 (Linux) 容器不包含它自己的内核。这是一个非常显着的差异。 @DavidMaze 谢谢你回答了我的问题以上是关于为啥 Ubuntu docker 映像不是 VM [重复]的主要内容,如果未能解决你的问题,请参考以下文章
将在 Ubuntu VM 内运行的 docker 容器端口与 VM 的主机网络连接 [关闭]
Docker 无法在新添加的 VM/节点上下载现有服务的映像
在 Ubuntu 16.04 中设置 PYTHONPATH 以使 Docker 映像正常运行
为啥我的 Play Framework for Scala 应用程序的 Docker 映像没有以 AccessDeniedException 开头?