I am back from a long break. I was touring Europe for a couple of weeks. Now back to the thing I love doing the most - learning new things and blogging about them!
Today at work, I was working with venv, which is sort of rare for me because my most projects are in Java and very few in Python. I understand that a virtual enviroment is an isolated python environment, but it sort of led me to an unease of how it is similar to and different from a docker container. Cause a docker too, in many ways is a virtual env.
So here is the difference in pointers which I got from StackOverflow!
- A virtualenv only encapsulates Python dependencies. A Docker container encapsulates an entire OS.
- With a Python virtualenv, you can easily switch between Python versions and dependencies, but you're stuck with your host OS.
- With a Docker image, you can swap out the entire OS - install and run Python on Ubuntu, Debian, Alpine, even Windows Server Core.
- There are Docker images out there with every combination of OS and Python versions you can think of, ready to pull down and use on any system with Docker installed.
Two clarifying questions that I would like to know:
- Can you spin up a venv inside a docker container?
Absolutely! A docker container is so very close to a VM, you can think of it being an independent machine/OS. Here you can create a venv and play around with different py versions. But this is generally not advised. Stick to a py version in a docker container.
- Can you spin up a docker container inside a venv?
This is a little tricky, so needed GPT's help with this! The Docker CLI (docker) is usually installed system-wide, not within the virtual environment. Thus, when you run docker commands, you are invoking the system-wide Docker CLI. The docker command interacts with the Docker daemon, which manages Docker containers, images, networks, and volumes.
The Python virtual environment only affects Python-related environment variables such as PATH and PYTHONPATH. It does not interfere with Docker's operation. While, the Docker CLI uses environment variables like DOCKER_HOST, DOCKER_CERT_PATH, and DOCKER_TLS_VERIFY to communicate with the Docker daemon. These are not affected by the Python virtual environment.
When you run a Docker container, the container operates in an isolated environment, separate from the virtual environment. The container will not have access to the virtual environment's Python interpreter or its installed packages unless explicitly configured to do so via volume mounts or environment variables! So it is basically different.