Esta guia nos muestra como iniciar un proyecto nuevo de Django apoyandonos con Docker y docker compose. Antes de empezar, debemos instalar Docker Desktop.
Para este proyecto, debe crear un Dockerfile, un archivo de dependencias de Python,
y un archivo docker-compose.yml
. (Puede usar una extensión .yml
o .yaml
para este archivo).
-
Cree un directorio de proyecto vacío.
Puede nombrar el directorio algo fácil de recordar. Este directorio es el contexto de la imagen de su aplicación. El directorio solo debe contener recursos para construir esa imagen.
-
Cree un nuevo archivo llamado
Dockerfile
en el directorio de su proyecto.
El Dockerfile define el contenido de la imagen de una aplicación a través de una o más compilaciones y comandos que configuran esa imagen.
Una vez construida, puede ejecutar la imagen en un contenedor. Para obtener más información sobre Dockerfile
, consulte la [Guía del usuario de Docker] (https://docs.docker.com/get-started/) y la referencia de Dockerfile.
- Agregue el siguiente contenido al
Dockerfile
.
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
Este Dockerfile
comienza con una [imagen principal de Python 3] (https://hub.docker.com/r/library/python/tags/3/).
La imagen principal se modifica agregando un nuevo directorio code
. La imagen principal se modifica aún más.
instalando los requisitos de Python definidos en el archivo requirements.txt
.
4. Guarde y cierre el Dockerfile
.
5. Cree un archivo requirements.txt
en el directorio.
Este archivo es utilizado por el comando RUN pip install -r requirements.txt
en su Dockerfile
.
- Agregue los paquetes de python requeridos en el archivo (En este caso son los paquetes minimos para crear un nuevo proyecto de Django desde cero).
Django>=3.0,<4.0
psycopg2>=2.8
- Guarde y cierre el archivo
requirements.txt
. - Cree un archivo llamado
docker-compose.yml
en el directorio de su proyecto.
El archivo docker-compose.yml
describe los servicios que componen su aplicación. En
este ejemplo, esos servicios son un servidor web y una base de datos. El archivo de redacción
también describe qué imágenes de Docker utilizan estos servicios, cómo se vinculan
juntos, los volúmenes que puedan necesitar para ser montados dentro de los contenedores.
Finalmente, el archivo docker-compose.yml
describe qué puertos estos servicios
exponer. Consulte la referencia de docker-compose.yml
para obtener más información.
información sobre cómo funciona este archivo.
- Agregue la siguiente configuración al archivo.
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
depends_on:
- db
Este archivo define dos servicios: el servicio db
y el servicio web
.
- Guarde y cierre el archivo
docker-compose.yml
.
Ahora vamos a crear un proyecto en blanco de Django, compilando la imagen a partir del contexto de lo definido anteriormente
- Vamos a la raíz del directorio.
- Cree el proyecto Django ejecutando docker compose run comando de la siguiente manera.
docker compose run web django-admin startproject miproyectonuevo .
Esto le indica a Compose que ejecute django-admin startproject miproyectonuevo
en un contenedor, usando la imagen y configuración del servicio web
. Porque
la imagen web
que aún no existe, Compose la crea a partir del directorio actual, como se especifica en la línea build: .
en docker-compose.yml
.
Una vez que se crea la imagen del servicio web
, Compose la ejecuta y ejecuta el Comando django-admin startproject
en el contenedor. Este comando
le indica a Django que cree un conjunto de archivos y directorios que representen un Proyecto Django.
- Después de que se complete el comando
docker compose
, listamos el contenido de su proyecto.
$ ls -l
drwxr-xr-x 2 root root miproyectonuevo
drwxr-xr-x 3 root root data
-rw-rw-r-- 1 user user docker-compose.yml
-rw-rw-r-- 1 user user Dockerfile
-rwxr-xr-x 1 root root manage.py
-rw-rw-r-- 1 user user requirements.txt
En esta sección, configuraremos la conexión de la base de datos para Django.
-
En el directorio de su proyecto, edite el archivo
miproyectonuevo/settings.py
. -
Reemplazamos
DATABASES = ...
con lo siguiente:
# settings.py
import os
[...]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('POSTGRES_NAME'),
'USER': os.environ.get('POSTGRES_USER'),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
'HOST': 'db',
'PORT': 5432,
}
}
Estos ajustes están determinados por el
postgres Imagen de Docker especificado en docker-compose.yml
.
-
Guarde y cierre el archivo.
-
Ejecute el comando docker compose up desde el directorio del proyecto.
$ docker compose up
djangosample_db_1 is up-to-date
Creating djangosample_web_1 ...
Creating djangosample_web_1 ... done
Attaching to djangosample_db_1, djangosample_web_1
db_1 | The files belonging to this database system will be owned by user "postgres".
db_1 | This user must also own the server process.
db_1 |
db_1 | The database cluster will be initialized with locale "en_US.utf8".
db_1 | The default database encoding has accordingly been set to "UTF8".
db_1 | The default text search configuration will be set to "english".
<...>
web_1 | July 18, 2023 - 19:50:38
web_1 | Django version 3.0.8, using settings 'miproyectonuevo.settings'
web_1 | Starting development server at http://0.0.0.0:8000/
web_1 | Quit the server with CONTROL-C.
En este punto, su aplicación Django debería estar ejecutándose en el puerto 8000
.
Nota: > > En ciertas plataformas (Windows 10), es posible que deba editar
ALLOWED_HOSTS
> dentro desettings.py
y agregue su nombre de host Docker o dirección IP a la lista. > Para fines de demostración, puede establecer el valor en: > >python > ALLOWED_HOSTS = ['*'] >
> > Este valor no es seguro para uso en producción. Referirse a > Documentación de Django para obtener más información.
- Enumere los contenedores en funcionamiento.
En otra ventana de terminal, enumere los procesos de Docker en ejecución con el comando docker ps
o docker container ls
.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
def85eff5f51 django_web "python3 manage.py..." 10 minutes ago Up 9 minutes 0.0.0.0:8000->8000/tcp django_web_1
678ce61c79cc postgres "docker-entrypoint..." 20 minutes ago Up 9 minutes 5432/tcp django_db_1
-
Apague los servicios y límpielos usando cualquiera de estos métodos:
- Detenga la aplicación escribiendo
Ctrl-C
en la misma terminal donde ejecutamos los servicios:
Gracefully stopping... (press Ctrl+C again to force) Killing test_web_1 ... done Killing test_db_1 ... done
- O, cambie a un shell diferente y ejecute
docker compose down desde la raiz del proyecto.
$ docker compose down Stopping django_web_1 ... done Stopping django_db_1 ... done Removing django_web_1 ... done Removing django_web_run_1 ... done Removing django_db_1 ... done Removing network django_default
- Detenga la aplicación escribiendo