Article original : How to Dockerize Your Django Project

Si vous travaillez sur un projet Django et que vous souhaitez vous simplifier la vie, surtout lorsqu'il s'agit d'exécuter votre application dans différents environnements, Docker est votre nouveau meilleur ami.

Docker permet d'empaqueter votre application Django, ainsi que toutes ses dépendances, dans ce qu'on appelle un "conteneur".

Ainsi, elle s'exécute de la même manière sur votre ordinateur, celui de votre collègue, un serveur de test, ou même en production.

Lorsque j'ai commencé à utiliser Docker, cela m'a semblé un peu écrasant. Mais après l'avoir configuré pour quelques applications Django, tout est devenu clair.

La bonne nouvelle ? Je vais vous guider étape par étape, de manière facile à suivre, même si vous êtes nouveau dans Docker.

Table des Matières

  1. Ce Dont Vous Avez Besoin

  2. Comment Dockeriser Votre Projet Django

  3. Problèmes Courants

  4. FAQ

  5. Conseil Supplémentaire : Utiliser .dockerignore

  6. Ce Que Vous Avez Construit

  7. Voulez-vous Approfondir ?

  8. Lectures Complémentaires

Ce Dont Vous Avez Besoin

Avant de commencer, assurez-vous d'avoir installé quelques éléments :

Vous n'avez pas besoin d'être un expert en Docker. Je vais expliquer chaque partie au fur et à mesure que nous le construirons ensemble.

Comment Dockeriser Votre Projet Django

Étape 1 : Démarrer un Projet Django

Si vous avez déjà un projet Django, vous pouvez sauter cette partie.

Sinon, ouvrez votre terminal et exécutez :

django-admin startproject monprojet
cd monprojet

Cela créera un nouveau projet Django appelé monprojet. Vous verrez une structure comme celle-ci :

monprojet/
├── manage.py
└── monprojet/
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Disons que c'est votre application que vous souhaitez exécuter dans Docker.

Étape 2 : Créer un Dockerfile

À la racine de votre projet (dans le même dossier que manage.py), créez un fichier appelé Dockerfile. Pas d'extension de fichier, juste Dockerfile.

Voici ce qui va à l'intérieur :

# Utilise l'image officielle Python
FROM python:3.10-slim

# Définit les variables d'environnement
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

# Définit le répertoire de travail dans le conteneur
WORKDIR /app

# Installe les dépendances
COPY requirements.txt /app/
RUN pip install --upgrade pip && pip install -r requirements.txt

# Copie le reste du code
COPY . /app/

Laissez-moi décomposer cela :

  • FROM python:3.10-slim : Cela indique à Docker d'utiliser une version légère de Python 3.10.

  • ENV : Ces lignes aident à avoir des logs plus propres et de meilleures performances.

  • WORKDIR /app : Cela définit le répertoire de travail par défaut à l'intérieur du conteneur.

  • COPY et RUN : Ces lignes copient votre code dans le conteneur et installent vos packages Python.

Étape 3 : Ajouter un requirements.txt

Vous aurez besoin d'un fichier listant vos packages Python.

Créez un fichier appelé requirements.txt dans le dossier racine et ajoutez :

Django>=4.0,<5.0

Vous pouvez en ajouter plus tard si votre projet grandit. Pour l'instant, cela suffit.

Pour générer une liste complète des dépendances à partir de votre environnement virtuel local, exécutez :

pip freeze > requirements.txt

Étape 4 : Créer docker-compose.yml

Maintenant, créons le fichier qui indique à Docker comment exécuter tout ensemble.

Dans votre dossier racine, créez docker-compose.yml :

version: '3.9'

services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"

Passons en revue ligne par ligne :

  • build: . : Cela indique à Docker d'utiliser le Dockerfile dans le dossier courant.

  • command : Cela exécute le serveur de développement de Django à l'intérieur du conteneur.

  • volumes : Cela monte votre code dans le conteneur afin que les modifications soient reflétées en direct.

  • ports : Cela mappe le port 8000 à l'intérieur de Docker au port 8000 sur votre machine.

Ainsi, si vous allez sur http://localhost:8000, vous verrez votre application.

Étape 5 : Exécuter !

Maintenant, la partie amusante. Depuis votre terminal, exécutez :

docker-compose up --build

Cela indique à Docker de :

  • Construire le conteneur

  • Installer les dépendances

  • Exécuter le serveur Django

Si tout se passe bien, vous verrez les logs du serveur Django, et vous pourrez ouvrir votre navigateur et aller sur http://localhost:8000.

Vous devriez voir l'écran de bienvenue de Django.

Problèmes Courants

Port Déjà Utilisé ?

Si le port 8000 est occupé, changez cette ligne dans docker-compose.yml :

ports:
  - "8001:8000"

Puis allez sur http://localhost:8001.

Base de Données Ne Fonctionne Pas ?

Si vous avez besoin d'une base de données (comme PostgreSQL), vous pouvez ajouter un autre service à docker-compose.yml. Voici un exemple avec PostgreSQL :

services:
  db:
    image: postgres
    environment:
      POSTGRES_DB: mabasededonnees
      POSTGRES_USER: utilisateur
      POSTGRES_PASSWORD: motdepasse
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db

Ensuite, mettez à jour votre settings.py dans Django pour utiliser cette base de données.

FAQ

Ai-je besoin de Docker pour le développement ?

Non, mais cela aide à garder votre environnement propre et cohérent. Si cela fonctionne dans Docker, cela fonctionnera partout.

Puis-je exécuter des migrations à l'intérieur de Docker ?

Oui ! Il suffit d'exécuter :

docker-compose run web python manage.py migrate

Comment tout arrêter ?

Appuyez sur Ctrl+C pour arrêter le serveur en cours d'exécution, et si vous voulez supprimer les conteneurs :

docker-compose down

Conseil Supplémentaire : Utiliser .dockerignore

Tout comme .gitignore, vous pouvez créer un fichier .dockerignore pour éviter de copier des fichiers inutiles dans le conteneur Docker. En voici un simple :

__pycache__
*.pyc
*.pyo
*.pyd
.env
.git

Ce Que Vous Avez Construit

À ce stade, vous avez :

  • Créé un projet Django

  • Construit un conteneur Docker pour celui-ci

  • Configuré docker-compose pour exécuter le tout

  • Appris à tout gérer facilement

Une fois que vous êtes à l'aise, vous pouvez étendre cette configuration avec des fichiers statiques, NGINX, Gunicorn, ou même des builds Docker prêts pour la production.

Voulez-vous Approfondir ?

Si cela semble beaucoup, c'est normal. Cela prend un peu de pratique, mais une fois que vous l'avez fait quelques fois, Docker devient une seconde nature.

Vous passerez moins de temps à déboguer les problèmes de configuration et plus de temps à coder votre application.

Lectures Complémentaires