我使用 Ubuntu 进行开发和部署,并且需要创建一个隔离的环境。
为此,我正在考虑使用 Vagrant 或 Docker。有什么优点和缺点,或者这些解决方案如何比较?
如果您的目的是隔离,我认为 Docker 就是您想要的。
Vagrant 是一个虚拟机管理器。它允许您编写虚拟机配置和配置脚本。但是,它仍然是一个依赖于VirtualBox(或其他)的虚拟机,开销很大。它要求您拥有一个可能很大的硬盘驱动器文件,需要大量内存,并且性能可能不是很好。
另一方面,Docker 通过LXC使用内核 cgroup 和命名空间。这意味着您使用与主机相同的内核和相同的文件系统。您可以将 Dockerfile 与docker build命令一起使用,以处理容器的供应和配置。您在docs.docker.com上有一个关于如何制作 Dockerfile 的示例;它非常直观。
docker build
你想要使用 Vagrant 的唯一原因是你需要在你的 Ubuntu 机器上进行 BSD、Windows 或其他非 Linux 开发。否则,请选择 Docker。
免责声明:我写了 Vagrant!但是因为我写了 Vagrant,所以我大部分时间都生活在 DevOps 世界中,其中包括像 Docker 这样的软件。我与许多使用 Vagrant 的公司合作,许多公司使用 Docker,我看到了两者是如何相互作用的。
在我说太多之前,直接回答:在您的特定场景中(您自己工作,在 Linux 上工作,在生产中使用 Docker),您可以单独使用 Docker 并简化事情。在许多其他情况下(我将进一步讨论),这并不容易。
直接将 Vagrant 与 Docker 进行比较是不正确的。在某些情况下,它们确实重叠,而在绝大多数情况下,它们不会重叠。实际上,更恰当的比较是 Vagrant 与 Boot2Docker(可以运行 Docker 的最小操作系统)之类的东西。Vagrant 在抽象方面比 Docker 高出一个级别,因此在大多数情况下它不是一个公平的比较。
Vagrant 启动事物以运行应用程序/服务以用于开发目的。这可以在 VirtualBox、VMware 上。它可以像 AWS、OpenStack 一样远程。其中,如果你使用容器,Vagrant 并不在意,并且接受它:例如,它可以自动安装、下拉、构建和运行 Docker 容器。在 Vagrant 1.6 中,Vagrant 拥有基于 docker 的开发环境,并支持在 Linux、Mac 和 Windows 上使用与 Vagrant 相同的工作流程的 Docker。Vagrant 并没有尝试在这里取代 Docker,它包含 Docker 实践。
Docker 专门运行 Docker 容器。如果您直接与 Vagrant 进行比较:它特别是一个更具体(只能运行 Docker 容器)、不太灵活(需要 Linux 或 Linux 主机)的解决方案。当然,如果您谈论的是生产或 CI,则无法与 Vagrant 相提并论!Vagrant 并不存在于这些环境中,因此应该使用 Docker。
如果你的组织只为他们的所有项目运行 Docker 容器,并且只有开发人员在 Linux 上运行,那么好吧,Docker 绝对可以为你工作!
否则,我看不出尝试单独使用 Docker 有什么好处,因为你会失去很多 Vagrant 所提供的东西,这些东西具有真正的业务/生产力优势:
为了解决我听到的支持使用 Docker 而不是 Vagrant 的具体反对论点:
我希望现在可以清楚地看到将 Docker 与 Vagrant 进行比较是非常困难的,而且我认为这是不正确的。对于开发环境,Vagrant 更抽象、更通用。Docker(以及使它表现得像 Vagrant 的各种方法)是 Vagrant 的一个特定用例,忽略了 Vagrant 必须提供的所有其他内容。
总之:在高度特定的用例中,Docker 无疑是 Vagrant 的可能替代品。在大多数用例中,它不是。Vagrant 不会妨碍您使用 Docker;它实际上尽其所能使这种体验更加顺畅。如果你发现这不是真的,我很乐意接受改进的建议,因为 Vagrant 的目标是在任何系统上都能很好地工作。
希望这可以解决问题!