Thanks to Mark Winterbottom for the interesting videos and the idea for this post.

Creating a Django project

Start by creating a new directory for your project (eg: vscode-django-docker), and open it in VSCode.

mkdir vscode-django-docker
cd vscode-django-docker
git init
code .

Then, add a .gitignore for your project. You can use template for Python provided by GitHub or generate on gitignore.io.

Now let’s create a Django project by running the one-line-command below

for Windows:

docker run -v %cd%:/app -w /app python:3.9-alpine sh -c "pip install Django==3.2.4 && django-admin startproject config ."

for Linux

docker run -v ${PWD}:/app -w /app python:3.9-alpine sh -c "pip install Django==3.2.4 && django-admin startproject config ."

Creating auto generating Docker templates for Django with VSCode

Press Ctrl + Shift + P add start typing add docker. Choose Docker: Add Docker Files to Workspace at command pallet.

After answering the questions, the following files should be added to your project.

.vscode/
    launch.jsonn
    tasks.json
.dockerignore
docker-compose.yml
Dockerfile
requirements.txt

Update the requirements.txt file to look like this (choose the versions for your needs):

django>=3.2,<3.3
gunicorn>=20.0.4,<20.1

Update the Dockerfile. Change base Docker image to python:3.9-alpine3.13 because it is more lightweight.

FROM python:3.9-alpine3.13

Modified the gunicorn command to use the config.wsgi file for running our app. Change the last string to

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "config.wsgi"]

Now you can build and run docker container by running the following commands:

docker-compose build
docker-compose up

You should be able to view your Django app by visiting http://127.0.0.1:8000 in your favourite browser.

Debugging a dockerized Django app with VSCode

Create a new file at ./config/views.py and fill it with the following contents:

from django.http import HttpResponse


def index(request):
    return HttpResponse('Hello World!')

Then modify ./config/urls.py to the following code:

from django.contrib import admin
from django.urls import path

from .views import index


urlpatterns = [
    path('', index),
    path('admin/', admin.site.urls),
]

For testing debugger add a breakpoint on the return line of ./config/views.py by clicking the area left of the line number.

Now start the debugger by selecting Run > Start Debugging. Debugger running in VSCode and you can inspect how your dockerized app works.

You can find the final source code here.