Vagrant describes itself as a way to "Create and configure lightweight, reproducible, and portable development environments".
From my current (limited) understanding of it, it describes a development environment (for most use cases, this is a virtual machine that we will use to test our project on). This description is in fact a Vagrantfile that is created when you initialise your project with the vagrant init command.
In the Vagrantfile you can specify what "box" your virtual machine will be based on, port forwarding rules, if the virtual machine should run in headless mode or if you need a GUI, etc. This file is typically checked-in with your code, so that a new developer can just type vagrant up and have a fully working test environment.
Vagrant refers to base virtual machines as boxes. The simplest way is to just use a pre-made one from their site, but you can also import a box from a VirtualBox virtual machine and use that.
You can ssh into the virtual machine with a simple "vagrant ssh" command, and the folder where the Vagrantfile is located is shared with the virtual machine (you can access it in /vagrant). All very developer friendly (I was doing all this manually until now!).
Vagrant is typically used for web development, but given that it supports several types of providers (what actually runs the VM), I can see it being used for other use cases as well.
Overall, I'm very glad I gave vagrant a try.