Because I like having more control of my deployment, I am currently hosting this on DigitalOcean. I don't need to worry about arbitrary row limits and I can be sure that the app is always running.
Vagrant allows me to ensure that anyone I'm collaborating with will be able to test my web application in the same environment. I also use Vagrant to setup VMs that I can use to refine my Capistrano recipes.
I'm using puppet to configure my servers. This makes it really simple to ensure that I have the same environment. There is a bit of a learning curve, but the repeatability definitely makes it worth the effort. I found puppet to be a little easier to pick up relative to chef, but I've used both. They're both great solutions.
I really like that there are a lot of modules available on the puppet forge that are being actively maintained.
For running a VM locally with Vagrant. It can be a little irritable, but it's open source and free, so I'm not complaining. I would probably use VMWare, but I don't want to pay for it right now.
I have a manifest to setup a Docker container before I have a Dockerfile. I'm still trying to figure out my preferred method of deployment, so in the meantime I figured I should try different methods to make an informed judgment.