They both are two completely different things. Typically virtualenv is used to abstract yourself from OS's use of Python. You must know that ubuntu relies heavily on Python installed by default, mucking around with that might end up creating really bad situations. Talking about in general terms, it is always good to isolate yourself as much as possible in order to achieve repeatability and reliability. There is a case if you are running multiple apps on the same VM, then you might want to isolate yourself from other apps making changes to your runtime env. Virtualenvs play a big role there.
Now if you are breaking those multiple apps into individual Docker containers, then you might be thinking why virtualenv, and I would tend to agree with that line of thought in eliminating an additional layer of complexity. But, since there is not much of a tax for using virtualenvs, I would strongly recommend using both together creates a better more flexible environment that with just one. If you are interested in learning Docker then you must learn it by getting a valuable certification. I would suggest you must take up following Docker Training Course. For your reference, I am also mentioning a video tutorial which I would suggest you must watch to learn all the basics of Docker. .