Virtualenv was created long before docker. Today, I lean towards docker instead of virtualenv for these reasons:
- Virtualenv still means people consuming your product need to download eggs. With docker, they get something which is “known to work”. No strings attached.
- Docker can do much more than virtualenv (like create a clean environment when you have products that need different Python versions).
The main drawback for Docker was the poor Windows support. That changed with the version for Windows 10.
As for “how many apps per container”, the usual policy is 1.