Setting up Django in a docker container proved to be harder than I expected, so I am recording the steps here.
Oerview:
- Get Docker Desktop
- Get Ubuntu 20.04 on Windows Subsystem for Linux (WSL)
- Install Django
- Create Django project
- Install Docker inside Ubuntu
- Create Docker project
- Run Docker container
Get Docker Desktop
Install docker desktop from Docker desktop web site.
Get Ubuntu 20.04 on WSL
- Open command prompt.
- Run
wsl --install -d Ubuntu-20.04
. If you did not have any Linuxes installed, restart (it’s still Windows), the installation will continue after restart. - Run
wsl -l -v
to ensure you have Ubuntu 20.04 and WSL 2. - If you have more than one Linux installed, run
wsl --set-default Ubuntu-20.04
- Run
bash
. - Run
lsb_release -a
to check Ubuntu version.
Install Python and Django
In bash run the following:
python3 --version # ensure it's at least Python 3.8 sudo apt update # get available apt package versions sudo apt -y install python3.8-venv # you don't want python3-venv, it leads to trouble sudo apt -y install python3-pip # install PIP mkdir myproj && cd mproj # create project dir python -m venv .venv # create a virtual environment . .venv/bin/activate # enter the virtual environment pip install django # install Django into the venv
Create Django Project
Run in bash:
django-admin startproject django_web . # create Django project named django_web in the current dir python3 manage.py migrate # prepare the project python3 manage.py runserver # run server locally
Open localhost:8000/ in the browser and make sure Django start page appears.
Go back to bash and press Ctrl+C to stop Django server.
Install Docker inside Ubuntu
sudo apt -y install docker.io docker-compose
NOTE: I was not able to make Docker daemon run inside WSL. Instead, docker process running inside Ubuntu connects to the Docker Deskop running on the host Windows OS. It is still needed to install the docker packages inside Ubuntu.
Create docker project
Run in bash, while still in the venv:
pip freeze > requirements.txt deactivate
Create file named Dockerfile
with the following contents:
# Pull base image FROM ubuntu:20.04 # Set environment variables ENV PIP_DISABLE_PIP_VERSION_CHECK 1 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 RUN apt update RUN apt -y install software-properties-common RUN add-apt-repository ppa:deadsnakes/ppa -y RUN apt update RUN apt -y install python3.8 python3-pip # Set work directory WORKDIR /code # Install dependencies COPY ./requirements.txt . RUN pip install -r requirements.txt # Copy project COPY . .
Create file named docker-compose.yml
with the following contents:
version: "3." services: web: build: . ports: - "8000:8000" command: python3 manage.py runserver 0.0.0.0:8000 volumes: - .:/code
Create file named .dockerignore
with the folliwing contents:
.venv .git .gitignore
Run Docker container
sudo docker-compose up
This should build the image and start the container. You may see Windows Defender warning about Docker trying to listen on port 8000. After the container has started, open the browser again on http://localhost:8000/
, and you should see Django hello window.
Permalink
Thank you for this post Vanya! I had been running Ubuntu 20.04 as a VM, but due to HD size constraints, I removed VMWare and the VM. I decided that since I was only using the VM for Django, I can get the same functionality using WSL2 and Docker. Thank you again my friend!
P.S. Website is coming soon!!