Not really.
Chef / Puppet is "the same", they control the configuration. Although you can use them to manage virtual machines or cloud / private clouds, most people are reluctant to use them that way. This is configuration management. They usually come into play after starting the virtual machine to get them in their desired state. That is, what software is needed on the virtual machine, which users need to be added, what configuration is needed, etc. Therefore, it is typically used to scale infrastructure.
Vagrant, and can also be used to manage virtual machines and public / private clouds, is usually used for only one environment. It provides a linked file for creating a virtual machine. This is similar to a chef / puppet, but has no tendency to use on a scale.
Docker is a separate beast. It has several components, but it is mainly used for “binding” (note: it does much more, but this is an ELI5 solution) and requires the host system (or infrastructure) to work. It adds little security for applications, but basically provides a consistent "OS" for the application that will work.
In practice, they can all be used in the environment. Here is an example:
Say you have a FunTime app. You have eight developers who contribute to this, and FunTime is designed to run on a scalable infrastructure on AWS. It is intended for use in the interface (FunTime-Front) and back-end (FunTime-API) and requires postgres. 4 developers work on the front panel, four developers work on the backend.
I would do the following (there are many ways to discard this cat, but this is one example):
I would use Docker for FunTime-Front and FunTime-API. I would use Vagrant to create a development environment for developers (so that they can customize various components). Vagrant: launch a virtual local area network locally (or, if necessary, in the cloud), install dockers, pull out docker images for FunTime-Front and FunTime-API, install postgres and fill postgres with dummy data, configure network ports for various components.
Now the developer has a full FunTime stack on his local machine and should not spin up with setting anything by himself: they can just type “roving”.
On the infrastructure side, I would use a chef (or puppet) to set up the environment: Production, stage and development (or something else), then the chef will install the docker on the "application" servers, "postgres" on the postgres servers , apply security settings, etc. Thus, all linked servers are the same. If I needed to upgrade the server or add a patch, it would be trivial with configuration management.
In all cases, Docker will be used so that there is no difference in applications between environments, including the developers workstation.
This will make sure that you don’t hear the excuse "Well, it works on my local machine!" Often. Also, if there is an unsuccessful deployment, rolling back the application will be very easy with Docker.
I hope this gives a little more information on how to use them.