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.
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
- Dockerize your Django Application - Part 1/3
- CREATING A DJANGO PROJECT with Docker
- Docker & Django local development: a minimal, step-by-step guide
- A Simple Recipe for Django Development In Docker (Bonus: Testing with Selenium)
- Set up your project locally
- Using Docker Compose for Python Development
- How to Dockerize a Django Application
- Dockerize existing Django project
- Docker Compose with Django Apps
- Watching for file changes with StatReloader Exception in thread django-main-thread: