Comment utiliser Docker en local avec un site web existant développé avec Django ?

Published: 02 octobre 2020

Tags: Django; Docker;

DMCA.com Protection Status

Un exemple (étape par étape) d'utilisation de Docker avec un site web existant développé localement avec Django:

Exemple simple de structure d'un projet Django

Considérons le projet django suivant appelé ci-après "myproject" avec la structure suivante (qui est une structure commune à un projet Django):

myproject/

    manage.py

    mydatabase.db

    myproject/

            settings.py

    myfirstapp/

            models.py

            views.py

            templates/

media/

L'objectif ici est d'apprendre à utiliser localement Docker pour faire marcher une site web développé avec Django afin de partager le code source avec d'autres développeurs et travailler avec le même environnement. Pour cela, j'ai parcouru beaucoup de documentations en ligne et trouver la réponse à mon problème dans une vidéo youtube de Christian Kreuzberger ([lien vers la vidéo] (https://www.youtube.com/watch?v=90LCcim-wHQ&t=276s )). Je vais détailler ci-dessous mes premiers pas avec Docker et mes erreurs.

Comment utiliser Docker pour faire marcher un site web avec django

Pour exécuter un projet django en utilisant Docker, il faut créer deux fichiers "docker-compose.yml" (au début du projet) et "requirements.txt" (sur le premier dossier myproject) en utilisant par exemple

touch docker-compose.yml

et

touch requirements.txt

Donc, la structure du projet Django devrait maintenant ressembler à ceci:

docker-compose.yml

myproject/

    requirements.txt

    manage.py

    mydatabase.db

    myproject/

            settings.py

    myfirstapp/

            models.py

            views.py

            templates/

media/

Commençons par modifier le fichier docker-compose.yml avec les informations minimales requises pour pouvoir exécuter Django avec Docker:

version: '3'

services:
    python:
        image: python:3.6
        volumes:
            - ./myproject:/myproject
        ports:
            - 8000:8000
        command: bash -c "cd ./myproject && pip install -r requirements.txt && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"

Dans le fichier requirements.txt, ajoutez tous les modules python requis par votre projet django. Par exemple, dans mon cas, le fichier requirements.txt contient:

Django==2.2.7
Markdown==2.6.11
Pillow==3.4.2

Ensuite, pour créer et exécuter le conteneur, entrez simplement la commande suivante:

docker-compose up

et entrez

0.0.0.0:8000

dans un navigateur Web.

Comment utiliser Docker en local avec un site web existant développé avec Django ?
Comment utiliser Docker en local avec un site web existant développé avec Django ?

Erreurs que j'ai faites lors de l'exemple présenté ci-dessus

Lors de ma première tentative avec le fichier docker-compose.yml présenté ci-dessus, l'exécution a fonctionné correctement, mais l'url 0.0.0.0:8000 sur le navigateur Web a renvoyé une page vide. Donc, la première erreur que j'ai trouvée était:

Invalid HTTP_HOST header: '0.0.0.0:8000'. You may need to add '0.0.0.0' to ALLOWED_HOSTS.

Pour résoudre ce problème, j'ai modifié le fichier settings.py et ajouté '0.0.0.0' dans la liste ALLOWED_HOSTS:

ALLOWED_HOSTS = ['0.0.0.0']

Deuxième erreur, j'ai oublié certains packages python (c'est-à-dire Markdown == 2.6.110) dans le fichier requirements.txt. Il est donc important de vérifier d'abord toutes les dépendances du projet django.

Et la la dernière erreur que j'ai eu était:

You have 4 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth.
Run 'python manage.py migrate' to apply them.

J'ai donc ajouté le "python manage.py migrate" dans le fichier docker-compose.yml.

Remarque: Une solution simple pour effectuer une analyse d'erreur consiste à modifier le fichier docker-compose.yml comme ceci:

version: '3'

services:
    python:
        image: python:3.6
        volumes:
            - ./myproject:/myproject
        ports:
            - 8000:8000
        command: sleep infinity

et entrez la commande suivante dans le terminal

 docker-compose exec python bash

qui ouvrira une console à partir du conteneur (99b2d5d86c9d est l'id de votre conteneur et devrait être différent)

root@99b2d5d86c9d:

maintenant nous pouvons entrer quelques commandes et essayer de comprendre pourquoi "python manage.py runserver 0.0.0.0:8000" renvoie une page vide. Par exemple, je viens de faire:

root@99b2d5d86c9d:  ls
root@99b2d5d86c9d:  cd myproject/
root@99b2d5d86c9d:  ls
root@99b2d5d86c9d:  pip install -r requirements.txt
root@99b2d5d86c9d:  python manage.py migrate
root@99b2d5d86c9d:  python manage.py runserver 8000

pour trouver les erreurs dont nous avons parlé précédemment.

Utiliser un dockerfile

L'exemple ci-dessus présentait une configuration minimale pour exécuter django avec Docker. Faisons maintenant cela en utilisant un fichier docker. Commencez par créer, par exemple, un dossier Docker contenant un autre dossier appelé python:

mkdir docker
mkdir docker/python

et créez un Dockerfile

touch docker/python/Dockerfile

Donc, la structure du projet Django devrait maintenant ressembler à ceci:

docker-compose.yml

docker/

    python/

        Dockerfile

myproject/

    requirements.txt

    manage.py

    mydatabase.db

    myproject/

            settings.py

    myfirstapp/

            models.py

            views.py

            templates/

media/

Modifiez le fichier docker:

From python:3.6

COPY ./myproject myproject

WORKDIR /myproject

RUN pip install -r requirements.txt

RUN python manage.py migrate

CMD ["python","manage.py","runserver", "0.0.0.0:8000"]

et mettez à jour le fichier docker-compose.yml pour utiliser maintenant le Dockerfile:

version: '3'

services:
    python:
        build:
            context: .
            dockerfile: docker/python/Dockerfile
        volumes:
            - ./myproject:/myproject
        ports:
            - 8000:8000

Entrez ensuite les deux commandes suivantes:

docker-compose build

er

docker-compose up

Et enfin entrer

0.0.0.0:8000

dans un navigateur Web.

Voilà !. J'espère que cette note vous a été utile.

Références

Image

of