我应该使用 Vagrant 还是 Docker 来创建隔离环境? [关闭]

     2023-02-19     168

关键词:

【中文标题】我应该使用 Vagrant 还是 Docker 来创建隔离环境? [关闭]【英文标题】:Should I use Vagrant or Docker for creating an isolated environment? [closed] 【发布时间】:2013-05-14 20:47:40 【问题描述】:

我使用 Ubuntu 进行开发和部署,并且需要创建一个隔离的环境。

为此,我正在考虑使用 Vagrant 或 Docker。优缺点是什么,或者这些解决方案的比较如何?

【问题讨论】:

现在两者都可以组合了:docs.vagrantup.com/v2/provisioning/docker.html 你的问题很幸运得到了两位作者对这两个服务的回答:Mitchell 和 Solomon Hykes 我想给出一个新的总结——这个问题大多是错误的。正确的问题是:我应该使用 Vagrant 还是 docker-compose 来创建隔离环境?答案是 Vagrant 和 docker-compose 执行相同的描述环境的任务,您应该将 Docker 与 Virtualbox 进行比较。不同之处在于 Vagrant 可以使用任何虚拟化,例如 Windows、Linux 或 OSX 上的 Docker、VMWare、Virtualbox,但 docker-compose 只能使用基于 Linux 的 Docker 镜像。 对我来说,答案是“在日常工作活动中,速度对您来说有多重要”。我发现 Vagrant 比 Docker 慢。在 docker 上,尤其是在初始拉取之后,docker 的缓存和层方法使我作为开发人员使用它最容易和最快 【参考方案1】:

免责声明:我写了 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-based development environments,并支持在 Linux、Mac 和 Windows 上使用与 Vagrant 相同的工作流程的 Docker。 Vagrant 并没有尝试在这里取代 Docker,它包含 Docker 实践。

Docker 专门运行 Docker 容器。如果您直接与 Vagrant 进行比较:它特别是一个更具体的(只能运行 Docker 容器)、不太灵活(需要 Linux 或 Linux 主机)的解决方案。当然,如果您谈论的是生产或 CI,则无法与 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 的机器(VM 或远程)。

Vagrant 知道如何配置一些高级或重要的东西,例如网络和同步文件夹。例如:Vagrant 知道如何将静态 IP 附加到机器或转发端口,并且无论您使用什么系统(VirtualBox、VMware 等),配置都是相同的。对于同步文件夹,Vagrant 提供了多种机制来获取您的本地文件传输到远程机器(VirtualBox 共享文件夹、NFS、rsync、Samba [插件] 等)。如果您使用的是 Docker,即使是带有没有 Vagrant 的 VM 的 Docker,您也必须手动执行此操作,否则在这种情况下他们将不得不重新发明 Vagrant。

Vagrant 1.6 对docker-based development environments 具有一流的支持。这不会在 Linux 上启动虚拟机,而是在 Mac 和 Windows 上自动启动虚拟机。最终结果是在所有平台上使用 Docker 是统一的,而 Vagrant 仍然处理诸如网络、同步文件夹等繁琐的细节。

为了解决我听到的支持使用 Docker 而不是 Vagrant 的具体反对论点:

“它是更少的活动部件” - 是的,如果您专门为每个项目使用 Docker,它可以是。即便如此,它还是牺牲了 Docker 锁定的灵活性。如果您决定不将 Docker 用于过去、现在或未来的任何项目,那么您将拥有更多可动部分。如果您使用过 Vagrant,那么您将拥有一个支持其余部分的活动部件。

“它更快!” - 一旦你拥有可以运行 Linux 容器的主机,Docker 运行容器的速度肯定比任何虚拟机都快。但是启动虚拟机(或远程机器)是一次性成本。在一天中,大多数 Vagrant 用户从未真正销毁他们的 VM。这是对开发环境的一种奇怪的优化。在 Docker 真正大放异彩的生产环境中,我理解快速启动/关闭容器的必要性。

我希望现在可以清楚地看到将 Docker 与 Vagrant 进行比较是非常困难的,而且我认为这是不正确的。对于开发环境,Vagrant 更抽象、更通用。 Docker(以及你可以让它表现得像 Vagrant 的各种方法)是 Vagrant 的一个特定用例,忽略了 Vagrant 必须提供的所有其他东西。

总结:在高度特定的用例中,Docker 无疑是 Vagrant 的可能替代品。在大多数用例中,它不是。 Vagrant 不会妨碍您使用 Docker;它实际上尽其所能使这种体验更加顺畅。如果您发现这不是真的,我很乐意接受改进的建议,因为 Vagrant 的目标是与任何系统都同样出色地工作。

希望这能解决问题!

【讨论】:

@JaredMarkell 我想他可能正在寻找一种基于 Web 的服务,可以让他管理他的 Vagrant 机器,例如 Protobox。 @Mitchell 我只是想说谢谢你如此详细地解释这一点。显然,您不可能完全客观,因此我感谢您花时间解释细微差别和可以使用它们的各种情况。我认为今天围绕各种工具的很多困惑在于它们重叠很多,很多人想要一个万能的解决方案,有人只是告诉他们该做什么,然后他们就可以实施它。您的回答的美妙之处在于它回答了基本问题:我如何创建一个孤立的环境? (与工具无关)。 @JaredMarkell Docker 有一个 REST API docs.docker.com/reference/api/docker_remote_api @OğuzÇelikdemir Vagrant 可以做的远不止这些。当然,如果你为每个项目准备一个特定的虚拟机,这将持续下去。但是在开发过程中,我经常会添加更多的服务/守护进程/设置(例如,当我决定在开发过程中将 RabbitMQ 用于项目时)。纯 VM 方法将要求您准备一个新映像,安装和配置 RabbitMQ,并强制开发人员将他们的 VM 更改为这个新的。对于 Vagrant - 我在 vagrant 配置中添加了适当的行,所有开发人员都可以轻松升级他们的虚拟机(使用 vagrant provision)。 (你的意思是“披露”,透露一些重要的事情,而不是“免责声明”,否认责任:english.stackexchange.com/q/115850)【参考方案2】:

我是 Docker 的作者。

简短的回答是,如果你想管理机器,你应该使用 Vagrant。如果你想构建和运行应用环境,你应该使用 Docker。

Vagrant 是一个管理虚拟机的工具。 Docker 是一种通过将应用程序打包到轻量级容器中来构建和部署应用程序的工具。容器可以容纳几乎任何软件组件及其依赖项(可执行文件、库、配置文件等),并在有保证且可重复的运行时环境中执行它。这使得构建您的应用程序并在任何地方部署它变得非常容易 - 在您的笔记本电脑上进行测试,然后在不同的服务器上进行实时部署等。

您只能在 Linux 上使用 Docker 是一个常见的误解。这是不正确的;你也可以在 Mac 和 Windows 上安装 Docker。在 Mac 上安装时,Docker 捆绑了一个微型 Linux VM(磁盘上 25 MB!),它充当容器的包装器。一旦安装,这是完全透明的;您可以以完全相同的方式使用 Docker 命令行。这为您提供了两全其美:您可以使用容器测试和开发您的应用程序,这些容器非常轻量级、易于测试且易于移动(参见 https://hub.docker.com 与 Docker 社区共享可重用容器),以及您无需担心管理虚拟机的具体细节,反正这只是达到目的的一种手段。

理论上,可以将 Vagrant 用作 Docker 的抽象层。我不建议这样做有两个原因:

首先,对于 Docker,Vagrant 不是一个好的抽象。 Vagrant 旨在管理虚拟机。 Docker 旨在管理应用程序运行时。这意味着 Docker 在设计上可以以更丰富的方式与应用程序交互,并拥有更多关于应用程序运行时的信息。 Docker 中的原语是进程、日志流、环境变量和组件之间的网络链接。 Vagrant 中的原语是机器、块设备和 ssh 密钥。 Vagrant 只是在堆栈中处于较低位置,它可以与容器交互的唯一方法是假装它只是另一种机器,您可以“启动”和“登录”。因此,当然,您可以使用 Docker 插件键入“vagrant up”,并且会发生一些漂亮的事情。它可以替代 Docker 的全部功能吗?尝试原生 Docker 几天,自己看看 :)

其次,锁定参数。 “如果你使用 Vagrant 作为抽象,你就不会被锁在 Docker 中!”。从旨在管理机器的 Vagrant 的角度来看,这是完全有道理的:容器不只是另一种机器吗?就像 Amazon EC2 和 VMware 一样,我们必须小心不要将我们的配置工具绑定到任何特定的供应商!这会造成锁定——最好用 Vagrant 将其全部抽象出来。除了这完全忽略了 Docker 的重点。 Docker 不提供机器;它将您的应用程序包装在一个轻量级的可移植运行时中,该运行时可以放在任何地方。

您为应用程序选择的运行时与您配置机器的方式无关!例如,将应用程序部署到由其他人配置的机器(例如由您的系统管理员部署的 EC2 实例,可能使用 Vagrant)或 Vagrant 根本无法配置的裸机机器上是很常见的。相反,您可以使用 Vagrant 来配置与开发应用程序无关的机器——例如一个现成的 Windows IIS 框或其他东西。或者,您可以使用 Vagrant 为不使用 Docker 的项目配置机器 - 例如,它们可能使用 ruby​​gems 和 rvm 的组合来进行依赖管理和沙箱。

综上所述:Vagrant 用于管理机器,Docker 用于构建和运行应用环境。

【讨论】:

只是想指出这个答案的流浪方面是不正确的。 Vagrant 不是用来管理机器的,Vagrant 是用来管理开发环境的。 Vagrant 旋转机器的事实大多具有历史意义。 Vagrant 的下一个版本具有一流的支持,可以直接在主机或任何 VM(Mac、Win)上使用 Docker 作为提供程序来启动开发环境。如果那是某人想要的(同样,在主机或 VM 上),它也可以启动原始 LXC。 Vagrant 有兴趣做最好的事情来创建一个可移植的开发环境,无论这是否意味着创建一个 VM。 @Davide 这将更详细地介绍它:vagrantup.com/blog/… “你只能在 Linux 上使用 Docker 是一个常见的误解”虽然这是真的,但准确地说你只能在 Docker 上使用 Linux。如果我想设置一个测试运行器,在各种环境配置(不同的数据库、php 版本、缓存后端等)中运行我的应用程序,那么我可以使用 docker 容器轻松地做到这一点。但我看不到我的应用程序是否能在 Windows IIS 环境、BSD 或 OSX 上正常运行。 你的第一点已经过时了,因为 Vagrant 内置了对 docker 的提供程序支持:docs.vagrantup.com/v2/provisioning/docker.html 帖子已过时。 Vagrant 现在支持 Docker 作为提供者。还有一些视频演示了如何在他们的blog 上同时使用 Vagrant 和 Docker。【参考方案3】:

如果你的目的是隔离,我认为 Docker 就是你想要的。

Vagrant 是一个虚拟机管理器。它允许您编写虚拟机配置和配置脚本。但是,它仍然是一个依赖于VirtualBox(或其他)的虚拟机,开销很大。它要求你有一个可能很大的硬盘驱动器文件,它需要很多内存,性能可能不是很好。

另一方面,Docker 通过LXC 使用内核 cgroup 和命名空间。这意味着您使用与主机相同的内核和相同的文件系统。 您可以将 Dockerfile 与 docker build 命令一起使用,以处理容器的供应和配置。 docs.docker.com 有一个关于如何制作 Dockerfile 的示例;它非常直观。

您想要使用 Vagrant 的唯一原因是您需要在 Ubuntu 机器上进行 BSD、Windows 或其他非 Linux 开发。否则,请使用 Docker。

【讨论】:

不幸的是,还没有。如果您在 32 位系统中,则需要具有 64 位来宾系统的 VM 才能运行 docker。然而,随着 go1.1 对 32 位的支持变得更好,docker 可能很快就会支持 32 位拱 这适用于 Mac 和 Windows,但从 docker 0.7 开始,任何 linux 发行版都可以正常工作。如果你知道一个非工作的,请告诉我。此外,除非您有 Mac 或 Windows 堆栈(这不太可能但可能发生),否则您不希望在 linux 之外的任何地方运行 Docker。 docker 客户端在 Mac 上运行良好,应该很快可以在 BSD 上运行,并且守护程序最终将支持 BSD、Solaris 和 Mac。 如果有人读到这些 cmets,你应该知道 Docker 仅在 12 天前达到了 ver1.0 (blog.docker.com/2014/06/its-here-docker-1-0),而且现在很多不同的平台都稳定并得到支持 (docs.docker.com/installation) vagrant 拥有 LXC 和 docker 供应商。然而 - Vagrant 和 docker 是根本不同的东西。 Vagrant 纯粹用于开发环境,docker 仅用于生产环境和 Linux。 Docker 现在可以在 Windows 10 Pro 及更高版本和 Windows Server 2016 上运行。我刚刚从 Windows 10 Home 升级到 Windows 10 Pro 并安装了 docker 应用程序。我现在可以在 Windows 10 上运行 Linux docker 镜像了。太棒了!【参考方案4】:

我承认我没有使用 Docker 的经验,只是作为一个热心的观察者,我认为这是一个非常简洁的解决方案,并且获得了很多关注。

我在 Vagrant 方面确实有相当多的经验,并且可以强烈推荐它。它肯定是一个更重量级的解决方案,因为它是基于 VM 而不是基于 LXC。但是,我发现一台不错的笔记本电脑(8 GB RAM,i5/i7 CPU)使用 Vagrant/VirtualBox 和开发工具运行 VM 没有问题。

Vagrant 的一大优点是与 Puppet/Chef/shell 脚本的集成,用于自动化配置。如果您使用这些选项之一来配置您的生产环境,您可以创建一个与您将获得的几乎相同的开发环境,这正是您想要的。

Vagrant 的另一个优点是您可以将 Vagrantfile 与应用程序代码一起版本化。这意味着您团队中的其他人都可以共享此文件,并且您可以确保每个人都使用相同的环境配置。

有趣的是,Vagrant 和 Docker 实际上可能是互补的。 Vagrant 可以扩展以支持不同的虚拟化提供商,并且 Docker 可能就是这样的提供商之一,在不久的将来会获得支持。有关该主题的最新讨论,请参阅https://github.com/dotcloud/docker/issues/404。

【讨论】:

伙计们,我为 docker 发布了一个 实验性 vagrant provider:github.com/fgrehm/docker-provider。 Docker 不是虚拟化,而是在自己的容器中运行操作系统,使用相同的主机内核,它不像其他虚拟机那样提供提供程序,因此 Vagrant 已经支持 docker。 Docker 是操作系统本身的虚拟化,隐含地重用底层硬件。它是虚拟化,因为它抽象和隔离了容器中运行的文件系统、网络和进程。【参考方案5】:

它们非常互补。

几个月来,我一直在所有项目中使用 VirtualBox、Vagrant 和 Docker 的组合,并强烈感受到以下好处。

在 Vagrant 中,您可以完全取消任何 Chef 单独配置,您所需要做的就是准备一台机器,该机器运行一个安装 docker 的小型 shell 脚本。这意味着我的每个项目的 Vagrantfiles 几乎相同且非常简单。

这是一个典型的 Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "mark2"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
  [3000, 5000, 2345, 15672, 5672, 15674, 27017, 28017, 9200, 9300, 11211, 55674, 61614, 55672, 5671, 61613].each do |p|
    config.vm.network :forwarded_port, guest: p, host: p
  end
  config.vm.network :private_network, ip: "192.168.56.20"
  config.vm.synced_folder ".", "/vagrant", :type => "nfs"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
    vb.customize ["modifyvm", :id, "--cpus", "2"]
  end
  # Bootstrap to Docker
  config.vm.provision :shell, path: "script/vagrant/bootstrap", :privileged => true
  # Build docker containers
  config.vm.provision :shell, path: "script/vagrant/docker_build", :privileged => true
  # Start containers
  # config.vm.provision :shell, path: "script/vagrant/docker_start", :privileged => true
end

安装docker的Bootstrap文件长这样

#!/usr/bin/env bash
echo 'vagrant  ALL= (ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers
apt-get update -y
apt-get install htop -y
apt-get install linux-image-extra-`uname -r` -y
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
apt-get update -y
apt-get install lxc-docker -y
apt-get install curl -y

现在要运行我需要的所有服务,我有一个看起来像这样的 docker_start 脚本

#!/bin/bash
cd /vagrant
echo Starting required service containers
export HOST_NAME=192.168.56.20
# Start MongoDB
docker run --name=mongodb --detach=true --publish=27017:27017 --publish=28017:28017 dockerfile/mongodb
read -t5 -n1 -r -p "Waiting for mongodb to start..." key
# Start rabbitmq
docker run --name=rabbitmq --detach=true --publish=5671:5671 --publish=5672:5672 --publish=55672:55672 --publish=15672:15672 --publish=15674:15674 --publish=61613:61613 --env RABBITMQ_USER=guest --env RABBITMQ_PASS=guest rabbitmq
read -t5 -n1 -r -p "Waiting for rabbitmq to start..." key
# Start cache
docker run --name=memcached --detach=true --publish=11211:11211  ehazlett/memcached
read -t5 -n1 -r -p "Waiting for cache to start..." key
# Start elasticsearch
docker run --name=elasticsearch --detach=true --publish=9200:9200 --publish=9300:9300 dockerfile/elasticsearch
read -t5 -n1 -r -p "Waiting for elasticsearch to start..." key
echo "All services started"

在这个例子中,我正在运行 MongoDB、Elastisearch、RabbitMQ 和 Memcached

非 docker Chef 单独配置会复杂得多。

当您进入生产环境时,将获得最后一个大优势,将开发环境转换为主机的基础架构,这些主机都是相同的,因为它们只有足够的配置来运行 docker,这实际上意味着很少的工作。

如果你有兴趣,我在我自己的网站上有一篇关于开发环境的更详细的文章

Implementing A Vagrant / Docker Development Environment

【讨论】:

您完成了所有 docker_start 编排,但没有费心将容器链接在一起。您是否只是使用硬编码的端口号,因为您在 Vagrant 下运行它? 您好 WineSoaked,上面的示例并未显示实际使用所有这些服务的容器。如果您查看提到的博客文章,还有另一个脚本 script/vagrant/docker_web 可以启动项目的开发容器。这确实在 docker run 命令上使用了 --link 并且 Rails 项目使用 docker 注入的环境变量来连接到服务。 我可以看到合并这两种产品的潜力。 Vagrant 作为环境测试和 docker 用于应用程序包装。合并两者,您可以在许多场景中测试单个应用程序或单元测试。我认为当时很多“测试平台服务”都在使用 Vagrant+Docker。 “它们非常值得称赞。” — 确实,两者都可以免费使用。 嗨@koppor 我最后一次使用 docker 机器大约是三个月前,还没有回去。我遇到的问题是,在使用 VMWare 驱动程序时,从我的 MAC 主机主机到运行 docker 的 VM 共享文件夹时存在错误。这意味着我无法在 Mac 上本地编辑代码并将更改反映在 docker 容器中。我不知道他们是否已经修复它,当他们修复它时,我确实会切换到它。然而,自从写下这个答案后,我已经将我所有的容器编排切换到了 docker compose【参考方案6】:

Vagrant-lxc 是 Vagrant 的插件,可让您使用 LXC 来配置 Vagrant。它没有默认的 vagrant VM (VirtualBox) 具有的所有功能,但它应该比 docker 容器更灵活。链接中有一段视频展示了它的功能,值得一看。

【讨论】:

这里是项目的直接链接github.com/fgrehm/vagrant-lxc【参考方案7】:

现在有了 Vagrant,您可以将 Docker 作为提供者。 http://docs.vagrantup.com/v2/docker/。可以使用 Docker 提供程序来代替 VirtualBox 或 VMware。

请注意,您也可以使用 Docker 通过 Vagrant 进行配置。这与使用 Docker 作为提供程序非常不同。 http://docs.vagrantup.com/v2/provisioning/docker.html

这意味着您可以将 Chef 或 Puppet 替换为 Docker。您可以使用 Docker 作为提供者 (VM) 和 Chef 作为配置者的组合。或者您可以使用 VirtualBox 作为提供者,使用 Docker 作为配置者。

【讨论】:

世界疯了 ;) 我们可以使用 docker provider 运行 vagrant,在 vagrant 中运行 docker 容器 @zainengineer,Windows 上 Vagrant 的 Docker 提供程序仍然使用 boot2docker 还是使用 Docker Toolbox 的某些变体? @zainengineer 你有一些说明性示例的链接(不是 vagrant 文档)吗?【参考方案8】:

同时使用两者是应用程序交付测试的重要组成部分。我才刚刚开始涉足 Docker,并且非常认真地思考一个应用程序团队,该团队在构建和交付其软件方面非常复杂。想想经典的 Phoenix 项目/持续交付情况。

思路是这样的:

获取 Java/Go 应用程序组件并将其构建为容器 (注意,不确定应用程序是应该在容器中构建还是在那时构建 安装到容器中) 将容器交付给 Vagrant VM。 对所有应用程序组件重复此操作。 迭代要编码的组件。 不断测试向 Vagrant 管理的 VM 的交付机制 好好睡一觉,知道什么时候部署容器,集成测试比 Docker 之前更持续地进行。

这似乎是 Mitchell 的声明的逻辑延伸,即 Vagrant 是为了开发与 Farley/Humbles 在持续交付中的思想相结合。如果我作为一名开发人员能够缩小集成测试和应用程序交付的反馈循环,那么更高质量和更好的工作环境就会随之而来。

作为一名开发人员,我不断地向 VM 交付容器并更全面地测试应用程序这一事实意味着生产版本将进一步简化。

所以我认为 Vagrant 的发展是一种利用 Docker 为应用程序部署带来的一些令人敬畏的后果的方式。

【讨论】:

你有没有关于这个的博客文章?现在已经快两年了,进展如何?还在使用 vagrant 和 docker 还是只使用 docker 和 docker-fleat/machine? 我工作的公司被收购了,他们删除了我的所有内容@Hoto。简短的回答是我在家中使用 docker-machine 来完成我的宠物项目。在工作中,我是manager,不做太多技术工作。我们没有使用 Docker 的计划,所以我们的工具通常是 Vagrant。【参考方案9】:

绝对是 Docker 的胜利!

您可能知道 Vagrant 用于虚拟机管理,而 Docker 用于软件容器管理。 如果您不知道差异,这里是: 软件容器可以与其他软件容器共享同一台机器和内核。使用容器可以节省资金,因为您不会在多个操作系统(内核)上浪费资源,您可以在每台服务器上打包更多软件,保持良好的隔离度。

当然是一门新学科,需要关注自身的陷阱和挑战。

如果您的需求超过单机资源限制,请选择 Docker Swarm。

【讨论】:

【参考方案10】:

在实际的 Oracle Java 杂志中有一篇关于将 Docker 与 Vagrant(和 Puppet)结合使用的内容非常丰富的文章:

结论

与经典 VM 相比,Docker 的轻量级容器速度更快 并已在开发人员中流行起来,并作为 CD 和 DevOps 的一部分 倡议。如果您的目的是隔离,Docker 是一个很好的选择。 Vagrant 是一个虚拟机管理器,可让您编写脚本配置 单个虚拟机以及进行配置。然而,它仍然是一个 VM 依赖于 VirtualBox(或另一个 VM 管理器),具有相对 大开销。它要求您有一个空闲的硬盘驱动器,可以 巨大的,它需要大量的 RAM,并且性能可能不是最佳的。码头工人 通过 LXC 使用内核 cgroups 和命名空间隔离。这意味着 您使用与主机相同的内核和相同的文件系统。 Vagrant 在抽象方面比 Docker 高一个层次,所以它们是 没有真正的可比性。 Puppet 等配置管理工具是 广泛用于配置目标环境。重用现有的 使用 Docker 可以轻松实现基于 Puppet 的解决方案。你也可以切片你的 解决方案,因此基础设施配备了 Puppet;这 提供中间件、业务应用程序本身或两者 使用 Docker;并且 Docker 由 Vagrant 包装。有了这个范围 工具,你可以做最适合你的场景的事情。

如何在 DevOps 中构建、使用和编排 Docker 容器 http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0

【讨论】:

丢失了很多 t

使用 Vagrant + Docker 在本地开发 Puppet

】使用Vagrant+Docker在本地开发Puppet【英文标题】:DevelopingPuppetlocallyusingVagrant+Docker【发布时间】:2017-12-0807:48:56【问题描述】:我正在尝试制定一种在本地开发傀儡角色和个人资料的策略。理想情况下,我想要一个自包含的git存... 查看详情

Vagrant 和 Docker nfs 失败:文件描述符错误

】Vagrant和Dockernfs失败:文件描述符错误【英文标题】:VagrantandDockernfsfailed:Badfiledescriptor【发布时间】:2016-05-1118:00:13【问题描述】:经过大量审查,尝试在Vagrant中使用rsync并以Docker作为提供者。(双向同步)我继续使用nfs在VMbo... 查看详情

我应该使用属性还是方法来计算值? [复制]

】我应该使用属性还是方法来计算值?[复制]【英文标题】:ShouldIuseapropertyoramethodforacalculatedvalue?[duplicate]【发布时间】:2011-09-1215:49:48【问题描述】:可能重复:PropertiesvsMethods我有一些矢量几何类,有很多功能我不知道是作为... 查看详情

elasticsearch:如何在docker容器中安装elasticstack(代码片段)

...er容器中。对于还没有UbuntuOS的开发者来说,我将使用Vagrant来安装UbuntuOS。如果你从来还没有安装过Vagrant,请参照我之前的教程“Vagrant入门教程”来进行学习。创建UbuntuOS我们使用Vagrant来创建Ubuntu。我们首先在自己的电... 查看详情

elasticsearch:如何在docker容器中安装elasticstack(代码片段)

...er容器中。对于还没有UbuntuOS的开发者来说,我将使用Vagrant来安装UbuntuOS。如果你从来还没有安装过Vagrant,请参照我之前的教程“Vagrant入门教程”来进行学习。创建UbuntuOS我们使用Vagrant来创建Ubuntu。我们首先在自己的电... 查看详情

vagrant里面不能运行docker,怎么回事

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

我应该使用相同的 VBO 来传递不同的顶点属性吗?还是我应该使用 2?

】我应该使用相同的VBO来传递不同的顶点属性吗?还是我应该使用2?【英文标题】:ShouldIusethesameVBOforpassingdifferentvertexattributes?OrshouldIuse2?【发布时间】:2015-05-2517:19:09【问题描述】:我知道glVertexAttribPointer将使用调用时绑定的V... 查看详情

我应该使用 UITableView 还是 UICollectionView 来创建这个

】我应该使用UITableView还是UICollectionView来创建这个【英文标题】:ShouldIuseaUITableVieworUICollectionViewtocreatethis【发布时间】:2015-11-0900:38:43【问题描述】:我想创建以下内容,但不确定哪个最好用:UITableView还是UICollectionView?【问... 查看详情

我应该使用迭代器还是 for 循环来迭代?

】我应该使用迭代器还是for循环来迭代?【英文标题】:ShouldIuseanIteratororaforlooptoiterate?【发布时间】:2014-04-2717:08:55【问题描述】:我不喜欢必须调用hasNext()和next()的想法,并且看到无论如何我需要一个循环来调用它们,我真... 查看详情

我应该使用 CSS 还是 SVG 来显示形状?

】我应该使用CSS还是SVG来显示形状?【英文标题】:ShouldIuseCSSorSVG\'sfordisplayingshapes?【发布时间】:2016-09-3004:16:09【问题描述】:我一直在使用CSS在我的网站中处理形状,这一切都很好,但有时在操作它们时有点烦人,因为例如... 查看详情

我应该使用 Nmap::Parser 还是 Nmap::Scanner 来审计网络?

】我应该使用Nmap::Parser还是Nmap::Scanner来审计网络?【英文标题】:ShouldIuseNmap::ParserorNmap::Scannertoauditanetwork?【发布时间】:2010-12-0316:36:27【问题描述】:我想以最快的方式审核我的大型网络的设备。我应该使用Nmap::Parser还是Nmap::... 查看详情

我应该使用 LassoCV 还是 GridSearchCV 来找到 Lasso 的最佳 alpha?

】我应该使用LassoCV还是GridSearchCV来找到Lasso的最佳alpha?【英文标题】:ShouldIuseLassoCVorGridSearchCVtofindanoptimalalphaforLasso?【发布时间】:2021-07-0219:00:02【问题描述】:据我了解,在使用Lasso回归的时候,可以在sklearn中使用GridSearchCV... 查看详情

我应该使用 bindValue() 还是 execute(array()) 来避免 SQL 注入?

】我应该使用bindValue()还是execute(array())来避免SQL注入?【英文标题】:ShouldIusebindValue()orexecute(array())toavoidSQLinjection?【发布时间】:2013-12-3107:52:54【问题描述】:为了防止SQL注入,我正在使用PDO。我见过人们同时使用这两种方法... 查看详情

我应该使用公共属性和私有字段还是公共字段来存储数据?

】我应该使用公共属性和私有字段还是公共字段来存储数据?【英文标题】:ShouldIusepublicpropertiesandprivatefieldsorpublicfieldsfordata?【发布时间】:2010-11-1915:20:25【问题描述】:在我看到的大部分代码中(在SO,thecodeproject.com上,我倾... 查看详情

我应该使用 servlet 还是过滤器来重定向 URL?

】我应该使用servlet还是过滤器来重定向URL?【英文标题】:ShouldIuseservletorfilterforredirectaURL?【发布时间】:2014-06-1907:31:24【问题描述】:我已经阅读了一些关于***的问题,例如ServletvsFilter、Howtoredirectinfilter?、基本上我只需要一... 查看详情

确定安装了哪些netframework版本

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

如何将 Vagrant box 转换为 Docker 镜像

】如何将Vagrantbox转换为Docker镜像【英文标题】:HowtoconvertaVagrantboxtoaDockerimage【发布时间】:2015-09-2800:58:15【问题描述】:我看到可以将Docker映像转换为Vagrant盒子。有没有办法将Vagrantbox转换为Docker镜像?【问题讨论】:【参考... 查看详情

一旦用户登录,我应该使用类实例(序列化)还是 Singleton 来存储 userInfo

】一旦用户登录,我应该使用类实例(序列化)还是Singleton来存储userInfo【英文标题】:ShouldIuseclassinstance(serialized)orSingletonforstoringuserInfooncetheuserlogin【发布时间】:2017-12-2521:10:29【问题描述】:我想知道在用户登录后存储用户... 查看详情