Both Virtualenv and Docker solve similar problems: isolation. However they do this on different levels in the IT stack and with different rigor. With virtualenv's you isolate applications from each other on the Python interpreter level, giving each application its own default interpreter, Standard Library and set of modules. A Docker container creates isolation at the of the operating system and run-time libraries, i.e. on a lower level.