An example (step by step) of how to use Docker with an existing Django project on my local machine:
An example of an existing Django project structure
So let's consider the following django project called hereafter "myproject" with the following structure (which is a common structure of a Django project):
myproject/
manage.py
mydatabase.db
myproject/
settings.py
myfirstapp/
models.py
views.py
templates/
media/
This project is working well on my local machine and in production as well. However I wanted to learn how to use Docker with an existing Django project to be able to share the code with others and work on the same environnement to continue developing the project. I went through a lot of online articles but the best answer of my problem was the video created by Christian Kreuzberger (that can be found here) which help me a lot to understand how to start with Docker for a Django project. Below you will find my notes on how to do that and the errors I had to fix.
How to use Docker to run a django project
To run a django project using Docker, we need to create two files "docker-compose.yml" (at the beginning of the project ) and "requirements.txt" (on the first folder myproject) using for example
touch docker-compose.yml
and
touch requirements.txt
So the structure of the Django project should now look like this:
docker-compose.yml
myproject/
requirements.txt
manage.py
mydatabase.db
myproject/
settings.py
myfirstapp/
models.py
views.py
templates/
media/
Lets first edit the docker-compose.yml file with the minimal information required to be able to run Django with 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"
In the requirements.txt file add all python modules required by your django project. For example in my case the requirements.txt file contains:
Django==2.2.7
Markdown==2.6.11
Pillow==3.4.2
Then to create and run the container just enter the following command:
docker-compose up
and enter
0.0.0.0:8000
in a web browser.
Errors I have made during the example presented above
In my first attempt with the docker-compose.yml file presented above, the execution worked correctly, however the url 0.0.0.0:8000 on the web browser returned an empty page. So first error I found was:
Invalid HTTP_HOST header: '0.0.0.0:8000'. You may need to add '0.0.0.0' to ALLOWED_HOSTS.
To fix that , I edited the settings.py file and added '0.0.0.0' in the ALLOWED_HOSTS list:
ALLOWED_HOSTS = ['0.0.0.0']
Second error, I forgot some python packages (i.e Markdown==2.6.110) in the requirements.txt file. So it is important to check first all the dependencies of the django project.
And the last one I got was:
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.
So I added the "python manage.py migrate" in the docker-compose.yml file.
A simple solution to do an error analysis is to change the docker-compose.yml:
version: '3'
services:
python:
image: python:3.6
volumes:
- ./myproject:/myproject
ports:
- 8000:8000
command: sleep infinity
and enter the following command in the terminal
docker-compose exec python bash
which will open a console from the container (99b2d5d86c9d is the id of your container and should be different)
root@99b2d5d86c9d:
now we can enter some commands and try to understand why "python manage.py runserver 0.0.0.0:8000" returns an empty page. For example, I just did:
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
to find the errors that we talked previously.
Using a dockerfile
The example above presented a minimal configuration to run django with Docker. Let's now do that using a dockerfile. First create, for example, a folder Docker that contains another folder called python:
mkdir docker
mkdir docker/python
and create a Dockerfile
touch docker/python/Dockerfile
So the structure of the Django project should now look like this:
docker-compose.yml
docker/
python/
Dockerfile
myproject/
requirements.txt
manage.py
mydatabase.db
myproject/
settings.py
myfirstapp/
models.py
views.py
templates/
media/
Edit the dockerfile:
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"]
and update the docker-compose.yml file to use now the Dockerfile:
version: '3'
services:
python:
build:
context: .
dockerfile: docker/python/Dockerfile
volumes:
- ./myproject:/myproject
ports:
- 8000:8000
Then enter the following two commands:
docker-compose build
and
docker-compose up
And finally enter
0.0.0.0:8000
in a web browser.
That's it !. Hope you find something useful in that note.
References
- 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: