Vagrant lets you spin up pre-configured VMs on-demand. I presume this is extremely useful for people looking to create reproducible environments quickly (I’ve heard of Nix, I just haven’t gotten around to it yet).
Vagrant’s DX is similar to Docker’s to me. You create a
Vagrantfile that describes
how to build your “box” (which is what it calls preconfigured VM images), then Vagrant
can bring it up whenever you want. This is the simplest
Vagrantfile; it will bring up
a VM with vanilla Debian:
Vagrant.configure("2") do |config| config.vm.box = "debian/bullseye" end
Then you run:
in the directory with your
Vagrantfile. Vagrant stores the VM’s state in a
directory next to the
Vagrantfile, so you’ll have to make sure you run
in this directory only. In general, you’ll run all
vagrant commands in this directory.
Very few of them actually work in a global context.
vagrant up boots up your VM (downloading the initial box if needed), then exits
(so the first boot is significantly slower). If you want to see what VMs are running,
You can SSH into a running VM by:
Remember to stop a VM:
And destroy it after you’re done:
One cool thing I learnt is that Vagrant doesn’t include a virtualization engine like Docker,
it leans on something you already have installed (this is called a
It defaults to
VirtualBox, but you can switch it to whatever. This means it is
very flexible, but also that the “just works” factor is probably not as high as you
might expect. By default, you’ll want both Vagrant and VirtualBox installed. I’m
on an M1 chip, so I needed to switch the emulation engine to QEMU and install that
instead. I wrote a post about how I got that to work here: Virtual Machines on the M1
Vagrant also supports provisioners like
that will let you configure your VM the way you please when
it boots up. You can install stuff like
nginx so you don’t have to do it manually
everytime (this is what provisioning means, at least in this context: to set up a
machine in some specific way).
Once you provision a box, you can package it up into a new box. This lets you skip provisioning the next time you create a new VM. You can also share this new box with folks so they don’t have to worry about provisioning:
Vagrant Cloud has a bunch of such pre-packaged
boxes for you to start off with. Just remember to make sure the box you want is compatible
with the virtualization engine you use. The
Provider segmented control on the search
page will let you do that.
I personally really like the
Packer workflow though, which
I’ll write about in a few days. I haven’t tried out Vagrant’s provisioners.
Very cool stuff!