Docker 学习总结之 Docker 与 Vagrant 之间的特点比较

发布于 2024-08-10 15:55:59 字数 5019 浏览 10 评论 0

以下内容均出自 Vagrant 作者( Mitchell Hashimoto) 与 Docker 作者( Solomon Hykes ) 在 stackoverflow 上面一个问题讨论。在这个问题中,双方阐述了 vagrant 和 docker 的特点和使用范围,对于深入理解 vagrant 和 docker 很有意义,因此笔者翻译出来,以供大家讨论学习。

Mitchell 作为 vagrant 的作者,其在 DevOps 的世界里面沉浸多年,接触了很多类似 docker 的虚拟化软件。他目前接触了很多使用 vagrant 和 docker 的场景,所以看到了两者是如何相互搭配发生作用的。

他认为如果单单是开发人员一个人单独使用主机,使用 docker 可以简化很多事情,这种场景下使用 docker 和 vagrant 都没有什么区别。所以他更多的讨论了一些复杂场景,在这些复杂场景中,docker 和 vagrant 就有一些区别了。

以下是他原文:

不分场景而直接比对 vagrant 和 docker 是不恰当的!在一些简单场景中,它们两款产品作用是重复的,但在更多场景中,它们两款产品无法相互替 代。事实上,vagrant 抽象度比 docker 更高,因此直接用 vagrant 同 docker 相比较是不恰当的。而把 vagrant 同 Boot2Docker(一款运行 docker 最小的内核) 进行比较似乎更加恰当。

vagrant 为了支持开发,在启动虚拟机环境时启动了很多的应用和服务。vagrant 可以在 VirtualBox, VMware 上面运行(docker 无法执行)。vagrant 也可以在 AWS, OpenStack 这些云环境中运行。即便你使用了 docker 的容器,vagrant 同样也没问题。vagrant 可以自动 install, pull down, build, run Docker containers。

比如在 vagrant V1.6 版本中,vagrant 集成了 docker-based development environments ,因此 Vagrant 可以在 windows,mac 和 linux 上面提供 docker 服务。

vagrant 没有想替代 docker 的想法,相反它还包含了 docker 的一些特性。

如果我们从逻辑层面来比较 vagrant 和 docker 的话,那么:

1、docker 只能执行 docker 所定义的容器。

2、docker 缺乏灵活的隔离方案(docker 只能运行在 Linux 主机环境中)。

如果我们从 Production 和 CI 层面来比较,那么 docker 就无法与 vagrant 相比了:Vagrant 没有上面的约束条件,而 docker 必须依赖它们。

如果你的项目必须使用 Docker 的容器,同时只能部署在 Linux 主机中。这个时候 Docker 的确是一个不错的选择。除此之外,我就看不到使用 docker 的优势了,相反你还浪费了 vagrant 很多的优点:

  • vagrant 可以支持多种虚拟环境,例如 VirtualBox, VMware, AWS, OpenStack 等等。无论你使用何种虚拟环境,vagrant 都可以顺利执行起来。如果你使用了 Docker,也可以在 vagrant 中顺利安装 docker。
  • vagrant 可以降低项目复杂度。或者换个说法:你只需要考虑如何执行你的项目就可以,而不论这个项目是用的 docker 还是什么别的。在未来,如果出现了 docker 的竞争者,那么 vagrant 也可以顺利执行它。
  • vagrant 可以运行在多个主机环境中,windows(XP 以上),MAC(10.5 以上),Linux(2.6 内核版本以上)。如果你使用了 docker,那么 vagrant 也可以在上面三种操作系统之上运行你的 docker。
  • vagrant 可以更好的配置网络和文件共享。比如:vagrant 可以给一个 VM 配置静态 IP 和端口数据转发。不论你使用的 VirtualBox 还是 VMware,vagrant 都可以很好的完成配置。对于文件共享来说,vagrant 提供了多种文件挂载方案供你考虑。如果你使用了 docker,那么 这些事情就都需要你亲自动手来做了。
  • vagrant 1.6 中集成了 docker-based development environments 。所以在 MAC 和 Windows 环境中,vagrant 会自动启动一个虚拟机来执行 docker,这样就达到了 docker 的跨平台化。而背后例如网络,文件等等操作都是 vagrant 默默完成的。

下面两点是我听到 docker 可以替代 vagrant 的声音:

  • "Docker 需要移动的数据很少"的确,Docker 有这个特点(应该指的是 Docker 采用的 UFS,导致 docker 每次变动所需的数据很少--笔者猜测)。但是 当你在每个项目都使用 docker,或者在每个项目的现在,将来都使用 docker 时,你就会发现 docker 所产生的数据并不少。而如果你使用 vagrant,那么只需要移动一次就可以完成。(原文:"It is less moving parts" - Yes, it can be, if you use Docker exclusively for every project. Even then, it is sacrificing flexibility for Docker lock-in. If you ever decide to not use Docker for any project, past, present, or future, then you'll have more moving parts. If you had used Vagrant, you have that one moving part that supports the rest).
  • "Docker 启动非常快",当使用 docker 启动容器时,它比其他虚拟机启动的都快。但是我要说的是,目前从产品化角度分析所有 vagrant 主机基本都是启动一次,然后不再停机。如果从快速部署开发环境来说,docker 这个特性真的是非常好。

所以,我们现在可以得知 vagrant 和 docker 是有很大区别的,直接比较这两个是不正确的。对于开发环境来说,vagrant 是一种更为抽象,更为通用的解决方案。Docker 所能提供的场景只是 vagrant 所支持的特殊场景之一。

在一些极端案例场景下,docker 完全可以替代 vagrant。但在更多的场景下,这是错误的。同时 vagrant 也不会封锁你使用 docker。

针对 Mitchell 的这些解释,Hykes 写出了下述的论点:

如果你仅仅是想管理虚拟机,那么你应该使用 vagrant。如果你想快速开发和部署应用,那么应该使用 docker。

vagrant 是一款管理虚拟机的工具,而 docker 是一款通过将应用打包到轻量级容器,而实现构建和部署的工具。两者适用范围不同。一个容器就是一个包含了应用执行所依赖的数据(包括 lib,配置文件等等)。它可以保证应用在一个可重复的环境中随时执行。

有了这个容器,就可以很简单的构建你的容器也可以随时随地的进行部署。

Docker 只能在 Linux 上面执行是一个很大的误区!事实上,Docker 可以在 MAC 和 Windows 上面安装。如果你在 MAC 上面安装 Docker,那么会有一个大概 25MB 的精简 Linux VM 来充当 MAC 和 docker 直接的交流者。一旦 Docker 安装完成后,就可以使用同样的命令进行操作了。这样,世界一下就美好了:你通过轻量级的容 器可以更好的测试和开发你的应用,并且很容易的将这些应用进行分发(比如通过 https://index.docker.io )。而你不需要了解如何管理这些虚拟机,而仅仅把虚拟机当做完成事情中的一个环节而已。

理论上,vagrant 可以作为 docker 一个抽象数据层。理由如下:

  • 首 先,vagrant 不是对 docker 更好的抽象。vagrant 设计使用来管理虚拟机的,而 docker 设计是用来管理应用的。这就意味着 docker 在设计之初就是为了可以通过多种方式来相互组合应用。在 docker 中 processes, log streams, environment variables ,network links between components 是最底层的原型。在 vagrant 中 machines, block devices, and ssh keys 是最底层的原型。vagrant 工作在系统底层,它同另外一个 vagrant 容器交互的方式只有把它当做一个可以"boot"和"log into"的机器。因此,你可以在 docker 上面安装插件后,执行"vagrant up"命令后等待美好的事情发生。
  • 其 次,可锁定的环境参数(the lock-in argument)。""If you use Vagrant as an abstraction, you will not be locked into Docker!"站在管理虚拟机的 vagrant 角度上面看,这句说没有错:Docker 不是另外一个独立的容器。像 EC2 和 VMware 一样,我们要避 免创造一个和其它工具相捆绑的东西。Docker 对宿主机没有任何要求,它允许你通过轻量级的容器在任意地方进行部署。在你部署应用时,不需要考虑应该部 署到什么环境中。比如说:你可以在其他人提供的主机(很可能上面已经部署了 EC2 或者 vagrant) 上面部署应用。

所以最后可以说:Vagrant 适合用来管理虚拟机,而 docker 适合用来管理应用环境。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

泪意

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

一梦浮鱼

文章 0 评论 0

mb_Z9jVigFL

文章 0 评论 0

伴随着你

文章 0 评论 0

耳钉梦

文章 0 评论 0

18618447101

文章 0 评论 0

蜗牛

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文