使用Vagrant、VirtualBox和Docker
照片:Caspar Camille RubinonUnsplash
开发团队面临着一个古老的问题:你如何确保你的开发环境对团队中的所有开发人员都是一样的?一个不太常见但同样重要的问题是,让一个新的开发人员加入到一个项目中需要多长时间?几个小时?还是几天?如果我告诉你,你可以在几分钟内完成呢?
在我的机器上工作 ¯\_(ツ)_/¯
开发环境往往是脆弱的。如果你直接把所有的软件安装在你的电脑上,你就有可能因为一个项目的升级导致另一个项目停止工作。更糟糕的是,你有时会从你的团队中的某个人那里得到可怕的 "在我的机器上能用 "的借口,但它在你的机器上不能用,或者它在你的机器上能用,但在生产中不能用。如果你能在你的笔记本电脑或桌面上使用虚拟机自动创建一致的本地开发环境,只需很少或不费吹灰之力,会怎么样?
自动化一切:甚至是开发人员
小心翼翼、不厌其烦地创建文档,对如何通过剪切-粘贴的方式重新创建开发环境进行逐步说明,这不是很敏捷的做法。请记住,我们看重的是工作的软件而不是全面的文档。DevOps的信条之一是以_基础设施即代码_的形式实现自动化。这是不手工制作服务器和网络等基础设施的做法,而是使用Terraform等配置工具和/或Ansible、Chef或Puppet等配置管理解决方案来自动部署和配置所需的基础设施,使你的软件使用代码而不是文档运行。但是,开发人员呢?他们的环境不应该也是自动化的吗?
我在纽约大学教一门关于DevOps和敏捷方法 的研究生课程,这在课堂上有特别的影响,学生们带着Windows PC、Mac、甚至Linux笔记本电脑来上课,而课程的要求可能与学生们正在学习的另一门课程不同。他们被期望能够同时进行两门课程的项目工作。这与开发人员同时进行多个项目没有区别。对于这个问题,有各种特定的语言解决方案,但如果能以一种与语言无关的方式来解决这个问题,岂不更好?
可口可乐大战:我受不了了
百事可乐--可乐,纸--塑料,Windows--Mac,这么多的选择,这么少的生产力。为了解决课堂上和工作中团队的这个问题,我使用Vagrant、VirtualBox和Docker三部曲,让我所有的开发人员和学生在Linux上开发。如果 "基础设施即代码 "对生产有好处,那么为什么不使用它来自动配置开发者的笔记本电脑环境呢?另外,让开发人员养成在无头服务器环境中工作的习惯也是很好的,因为当云中的生产工作负载出现问题时,他们在调试时就会遇到这种情况。
Vagrant是一个开发者工具,用于通过命令行界面自动创建轻量级的、可重复的和可移植的虚拟环境。VirtualBox是一个免费的管理程序,可以在macOS、Windows和Linux上运行,它可以在你的笔记本电脑或台式电脑上托管虚拟机。在过去,我为我的开发团队创建了虚拟机,将它们导出为OVA文件,并不得不上传巨大的数千兆字节的OVA图像,他们必须下载才能使用。这将花费我几个小时。当软件需要更新时,我不得不创建一个新的图像并上传,开发人员需要再次下载它,这需要更多的时间。有了Vagrant,我只需要在我们的git仓库中放置一个小文件,称为Vagrantfile,其他的事情都由开发人员来处理。更新就像更新一个通过版本控制跟踪的文本文件一样简单。
从哪里开始?
为了开始,我让我的开发团队和学生安装两个软件。Vagrant和VirtualBox。就这样吧!当然,他们需要一个像Visual Studio Code这样的程序员编辑器,但对于开发环境,他们只需要Vagrant和VirtualBox。这意味着,新的开发人员或学生入职的时间与安装Vagrant和VirtualBox的时间一样长,而且可以通过Mac上的Homebrew或Windows上的Chocolatey两个简单的命令自动完成。
在macOS上使用Homebrew。
$ brew install --cask vagrant
在Windows上使用Chocolatey。
C:\> choco install vagant
当然,你需要安装Mac上的Homebrew或Windows上的Chocolatey,但如果你没有它们,你会喜欢它们,因为它们会自动保持你的软件的更新。我认为,每个开发者都应该使用这些命令行工具,或者类似的工具,来管理软件的安装,提高他们的工作效率。如果你不想使用这些工具,你总是可以从它们各自的网站上下载Vagrant和VirtualBox,并手动安装它们。
Vagrant是Puppet Master
Vagrant提供了自动化,拉动了控制一切的弦。它被用来快速配置复杂的配置,并具有可重复性。VirtualBox为开发人员提供虚拟机(VM),而Docker则处理所有的中间件,不需要任何安装。我已经使用这个三部曲有一段时间了,并取得了巨大的成功。如果你的笔记本电脑运行在Windows,或macOS,或Linux上,这都不重要。每个人都在使用一个一致的Linux环境,他们不会出错,因为这都是自动化的。没有麻烦,没有大惊小怪,没有任何错误的版本。每个人都在完全相同的环境中工作。
一旦安装了Vagrant和VirtualBox,为一个项目或实验室创建一个完整的开发环境就像这些命令一样简单。
$ git clone
就是这样!为一个项目需要安装什么软件并不重要,它对开发者来说是隐藏的。不同的项目有不同的要求,有时甚至是冲突的要求,这一切都被虚拟机所隔离。开发者所需要的一切都已经被安装和配置好了,而且是一致的、可重复的。你可以试试上面的命令,自己看看。这是我在一些会议上开办的教程中的资源库,比如在波士顿的Lisa16会议上,关于用Vagrant、VirtualBox和Docker让开发者更有效率的教程。
要从头开始你自己的空开发环境,为你的工作和使用创建一个文件夹。
$ vagrant init ubuntu/bionic64
这将初始化一个带有ubuntu/bionic64盒子的新的Vagrant文件,并使用Ubuntu 20.10 Bionic64图像建立一个虚拟机。Vagrantfile是一个Ruby文件,包含了如何提供和配置虚拟机的说明。最初,它只包含了使用样本代码的方框,你可以不加注释或添加额外的命令。你可以从Vagrant文档中了解更多关于这些命令的信息。这个盒子是要开始使用的虚拟机镜像。Vagrant有很多镜像可供选择,你可以在Vagrant Cloud浏览到
一个文件决定一切
真正的魔力来自于编辑Vagrant文件和添加命令来安装、配置和构建你自己的环境。你可以使用shell命令,但Vagrant也可以使用流行的配置管理系统的文件,如Ansible、Chef和Puppet。想一想这一点。配置生产服务器的相同文件也可以配置开发人员的环境。这就是你如何获得12-Factor AppDev/Prod的平等。
下面是一个简单的Vagrant文件,它将使用Docker创建一个带有git和PostgreSQL数据库的Python 3开发环境。
Vagrant.configure(2) do |config|
config.vm.network “forwarded_port”, guest: 8080, host: 8080
config.vm.provider “virtualbox” do |vb|
if File.exists?(File.expand_path("~/.gitconfig"))
config.vm.provision “shell”, inline: <<-SHELL
config.vm.provision :docker do |d|
end
这个Vagrant文件提供了一个Ubuntu 20.10虚拟机,将虚拟机上的8080端口转发到主机上的8080,这样你就可以使用localhost:8080来访问你的应用程序。用你的应用程序监听的任何端口代替。它也给了虚拟机一个IP地址,并分配了1GB内存和2个CPU。然后,它把你的.gitconfig文件复制到虚拟机中,以便git知道你是谁,然后安装git和Python 3开发环境。最后,它使用Docker在Docker容器中配置一个PostgreSQL数据库。Docker支持是Vagrant原生的,这就是为什么我们不需要在笔记本电脑上下载和安装Docker。我们在虚拟机内使用Docker,这样我们的每个Docker环境也是相互隔离的。
如果你需要更多的软件,你只需将命令添加到你的Vagrantfile,然后使用。
$ vagrant reload --provision
这将再次重新运行配置块,重新安装软件。需要注意的是,一旦你配置了一个虚拟机,在你下次使用vagrant时,Vagrant会忽略配置块,所以现有的虚拟机很快就会出现,因为一切都已经安装好了。
每次改变Vagrant文件时,将其提交到你的git repo中,以确保团队中的每个开发人员每次都能带出相同的一致环境。
当你想关闭环境时,只需使用。
$ vagrant halt
这将停止虚拟机。然后vagrant up会在你需要时再次启动它。你也可以使用vagrant suspend和vagrant resume来保留当前的运行状态,而不是重启。
当开发环境不再需要时,或者如果一切都出错了,你可以删除虚拟机。
$ vagrant destroy
这就是基础设施即代码的魅力所在。当出了问题,"昨天还能用,今天就不行了",你不必浪费时间去修复它。只需删除虚拟机并提供一个新的。
$ vagrant destroy
这将给你一个新的开发环境,就像你刚开始工作的时候一样新鲜。
我的文件怎么办?
这就是Vagrant真正的优势所在。现在你可能会想,"我不需要把我的文件复制到虚拟机里吗?"或者 "如果我删除了虚拟机,我不会失去我所有的工作吗?"这两个问题的答案都是 "不"。这就是原因。
Vagrant在虚拟机内的挂载点/vagrant共享你的当前工作目录。你的项目文件从未被复制到虚拟机中。它们与虚拟机共享,这样你在虚拟机外或虚拟机内所做的任何改变都会在两个地方看到,因为真正的文件只存在于一个地方,那就是你的笔记本或桌面。
一旦你进入虚拟机,你可以在/vagrant文件夹下找到你的项目文件。在这个例子中,你可以从虚拟机中看到你在电脑上创建的Vagrant文件。
$ vagrant ssh
因为这些文件在虚拟机中是共享的,所以你可以在电脑上使用你喜欢的开发编辑器,如Visual Studio Code,来编辑这些文件,同时在虚拟机中执行程序。这给了你两个世界最好的东西,一个可移植的开发环境来运行你的代码,它类似于生产环境,并且熟悉和方便使用你最喜欢的GUI编辑器工作。
总结
希望我已经为你的开发团队建立了使用像Vagrant这样的基础设施即代码解决方案的案例,以便不仅自动化,而且拥有可重复的开发环境,消除 "在我的机器上工作 "的综合症。当你考虑到每个开发人员花在管理他们的开发环境的时间时,生产力的提升是累积性的。这也减少了新员工入职的摩擦,或者当人们转换团队时。
除了使用VirtualBox作为提供者外,Vagrant还支持VMware、SoftLayer、亚马逊AWS和Digital Ocean。这意味着你的开发人员也可以立即为自己建立基于云的开发环境。如果你使用Visual Studio Code远程开发扩展,你实际上可以在云虚拟机内进行开发。我将把这个问题留给另一篇博文。
创建可重复的开发环境》最初发表在《Nerd For Tech》杂志上,人们通过强调和回应这个故事来继续对话。