Docker = containers technology. The idea is that you have isolated work loads on a linux machine in that it uses the existing kernel and it's Processes (creating a container). We can refer to these containers as a Virtual Environment and not a Virtual Machine.
Vagrant = Managed VMs (virtual machines) . It allows you to script and package the Virtual Machine configuration and the provisioning setup. It is designed to run on top of almost any VM tool.
At its core, Vagrant is a simple wrapper around Virtualbox or VMware (and other hypervisor technologies). You can do "Infrastructure as Code" or DevOps. In that your entire virtual machine can be both created and managed all with a single vagrant file without even opening up the console for either virtual box or vmware.
Virtual Machines are full blown isolated "virtual' operating systems.
You use Vagrant to deploy to VirtualBox, VMWare, AWS, etc.
I think with a lot of the noise out there this is yet another technology in which it really shouldn't be (WHICH should I use) but more so... two DIFFERENT technologies. So depending on your needs. I see them both being used in the same shops however fitting two different needs.
VAGRANT will provide you with a full Virtual Machine, including the OS. It's great at providing you a Linux environment for example when you're on MacOS, or Windows.
DOCKER is a lightweight Virtual Environment of sorts and not a virtual machine. It will allow you to build contained architectures faster and cheaper than with Vagrant. Why? Because containers make better use of overhead.
Another way of thinking about it:
Vagrant is a virtual machine manager because it allows us to script out the virtual machine configuration as well as the provisioning. However, it is STILL a virtual machine depending on Virtual Box, AWS, VMware, and many other with a huge overhead. It requires a LOT more hard drive space, and takes a lot of ram, and performance depending on your resources are sometimes not that great.
Docker however. uses kernel namespacing via lxc. (linux containers) It means that you are using the same kernel as the host and the same file system. You use a Dockerfile with the docker build command in order to handle the provisioning and configuration of your container.