为什么Ubuntu的Docker镜像不是虚拟机

21
我很清楚虚拟机和容器之间的区别。但这让我对Ubuntu容器如何存在感到困惑。因为Ubuntu是一个操作系统,所以这似乎是矛盾的。

https://hub.docker.com/_/ubuntu

这不是完整的客户操作系统吗?那么什么使它成为容器而不是虚拟机?或者容器和虚拟机之间的界限模糊了吗?
我尝试过谷歌搜索,但我发现的唯一结果是经典的虚拟机与容器的比较,这并不是我想问的问题。
编辑 - 我已更新以进一步澄清我的问题。

1
简短回答:Docker共享主机的内核和物理设备;虚拟机具有重复的内核和模拟的硬件。 Docker容器通常也不运行捆绑到用户空间的所有内容,而是只运行一些目标应用程序,该用户空间可用。(它“看起来像”Ubuntu,但不运行systemd、cron、sshd等) - David Maze
4
“Ubuntu的Docker容器”并不是“完整的操作系统”,它不运行自己的内核。它确实是一个完整的操作系统用户空间,但是,它是否在自己的ring-0中运行,还是只作为其他人内核中的一堆命名空间,这正是区别所在。 - Charles Duffy
@CharlesDuffy,谢谢您回答我的问题。这是我在Sack Overflow上的第一篇帖子,我不确定为什么它被投票下降。我认为链接的问题并不是我所问的东西。 - Winston Henke
坦白说,与链接的重复问题的答案 确实 明确表明在 Docker 容器中,内核与主机是共享的。 - Charles Duffy
@CharlesDuffy 关于为什么这个问题不适合在SO上讨论,这是可以理解的。我同意链接重复的答案已经完全明确了,在Docker容器中内核与主机是共享的。但这正是导致我的困惑的部分。对我来说,这个陈述在Ubuntu容器的概念中毫无意义,直到澄清它实际上不是一个带有Linux内核的完整Ubuntu,而且我认为链接的文章没有解释清楚。也许我的问题表述不够好:(但还是谢谢你的时间。 - Winston Henke
显示剩余4条评论
1个回答

6
Docker是一种以隔离轻量级容器运行应用程序的新方式。尽管它们是隔离的,但它们可以与其他组件集成。
效率不是唯一的收益。当您将应用程序打包到Docker中运行时,您可以获得可移植性。您可以在笔记本电脑上的Docker容器中运行应用程序,并且它在数据中心的服务器和任何云中的虚拟机(VM)上都可以表现出完全相同的方式。
另一个重要驱动因素是安全性。容器在应用程序之间添加了安全隔离,因此,如果一个应用程序被攻击者攻击,攻击者无法继续攻击同一主机上的其他应用程序。
当您将应用程序打包为Docker镜像时,它们都具有相同的形状 - 您可以以相同的方式部署、管理、保护和升级它们。
回答您的问题:
  • 每个 Docker 容器都运行在自己的轻量级虚拟机中,因此常规虚拟机和 Docker 容器之间的界限变得模糊,除了 Docker 容器不适用于像常规虚拟机那样的 GUI 应用程序。

  • 你的假设是错误的。你需要在 Dockerfile 中包含操作系统,然后再加入应用程序代码。但是,根据你的应用程序不同,在 Docker Hub 上存在不同大小的操作系统映像,例如 Windows nanoserver,如果你只想运行一个简单的控制台应用程序,则不需要完整规模的操作系统虚拟机。另一件事情是在 Dockerfile 中运行分阶段构建,这将编译你的应用程序,并仅在映像中包含运行时环境,从而有效地减小其大小。

  • Docker 主要用于将新的和遗留的应用程序容器化,即将它们分割成逻辑上分离的容器。当应用程序被容器化时,它会获得安全性、依赖关系的分离、零停机维护、持续集成流水线、可移植性、效率等优点。你不能使用常规虚拟机来容器化应用程序。Docker 容器和常规虚拟机的目的和构建是不同的。

如果你正在使用Windows容器,并想更好地了解Docker的用途,我可以推荐以下书籍:https://www.packtpub.com/virtualization-and-cloud/docker-windows 如果不是,则Packt还提供其他关于Linux上Docker的书籍。
希望这能回答你的问题 :)

1
我修改了我的问题。我并不是真的在问虚拟机和容器之间有什么区别,我明白这个。我不明白的是一个完整的操作系统如Ubuntu怎么可能成为一个容器...那不就变成虚拟机了吗? - Winston Henke
1
Ubuntu镜像并不包含整个操作系统,而只包含使其轻量化所需的必要元素。正如Ken Cochrane在https://dev59.com/9mQo5IYBdhLWcg3wdPAa中所解释的那样: “完全虚拟化的系统会分配自己的一组资源,并进行最小共享。您可以获得更多的隔离,但它会更加沉重。使用Docker,您可以获得较少的隔离,但容器很轻便。因此,您可以在主机上轻松运行数千个容器,而它甚至不会闪烁。”所以,是一个没有GUI的虚拟机。 - hatati
我找不到任何关于那个的文档。你说“Ubuntu镜像不包含整个操作系统”。但我假设它有一些或大部分Linux内核,使其成为完整的操作系统。这基本上是我的问题的核心。 - Winston Henke
3
(Linux)容器不包含自己的内核。这是一个非常重要的区别。 - David Maze
1
@DavidMaze 谢谢,这回答了我的问题。 - Winston Henke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接