The linked-to essay describes several reasons why the author uses virtualenv. Which of them don't you understand?
My package supports several optional back-ends, selectable at run-time, and it runs under Python 2.7 and 3.6+. I use tox to manage different virtualenvs for the combination of {backend X but not Y or Z, Python 2.7}, {backend X but not Y or Z, Python 3.6}, etc. for Y, and Z, as well as {backend X and Y and Z} for the two versions. Oh, and I support several releases of each of the X, Y, and Z. That's a lot of virtualenvs.
Usually I only develop on the X+Y+Z version because full test suite across all the combinations takes about 15 minutes.
I also do coverage testing, and the Python coverage tool isn't hard to use under this setup to combine tox results across multiple virturalenvs.
I don't know if Docker is better. I've been using this setup for some years.