dockeriza tu sitio web con django y nginx
Publicado Aug. 23, 2025, 12:08 p.m. por marco
Despliegue de sitio web con django, gunicorn y nginx, utilizando docker
Este tutorial es una guía detallada para poder desplegar un sitio web utilizando contenedores. Esto hace que el sitio sea accesible y portable, evitándote problemas de dependencias
---Paso 1: Instalación de Docker y Permisos
Antes de empezar con los archivos, lo primero es tener instalado Docker en tu servidor. Aquí te va la receta para que lo hagas en corto y sin broncas.
Instalar Docker en tu Servidor
# Actualiza el sistema e instala paquetes que necesitas
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
# Agrega la clave oficial de Docker para que tu sistema confíe en ellos
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Agrega el repositorio de Docker a tu lista de fuentes
UBUNTU_CODENAME=$(lsb_release -cs)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ${UBUNTU_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instala Docker y sus componentes
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Permisos de Usuario
Para no tener que escribir sudo
cada vez que uses un comando de Docker, lo que sigue es añadir tu usuario al grupo de Docker.
sudo usermod -aG docker $USER
¡Atención! Para que los permisos se apliquen, tienes que cerrar tu sesión de terminal y volver a entrar. Puedes hacerlo en corto con el comando exit
y volviendo a conectarte a tu servidor.
Estructura del proyecto
.
├── proyecto_django/
│ ├── myapp/
│ ├── proyecto/
│ ├── db.sqlite3
│ ├── manage.py
│ └── requirements.txt
├── docker-compose.yml
├── Dockerfile
└── nginx.conf
Nota: Es necesario contar con un archivo requirements.txt
que liste todas las dependencias de Python de tu proyecto. Puedes generarlo ejecutando pip freeze > requirements.txt
en el entorno de tu proyecto.
Paso 2: Creación del Dockerfile
El Dockerfile
es el guion de instrucciones que Docker sigue para construir la imagen de tu aplicación. Define el entorno de Python, copia el código y especifica el comando de inicio de Gunicorn.
Archivo: Dockerfile
FROM python:3.10-slim
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "--bind", ":8000", "myproject.wsgi:application"]
---
Paso 3: Orquestación con Docker Compose
El archivo docker-compose.yml
orquesta los servicios de tu aplicación, permitiendo que múltiples contenedores (Django y Nginx) se comuniquen entre sí.
Este archivo también configura los volúmenes para compartir archivos estáticos y certificados SSL entre los contenedores y el host.
Archivo: docker-compose.yml
version: '3.8'
services:
web:
build: .
restart: always
volumes:
- ./media:/usr/src/app/media
- ./static:/usr/src/app/static
expose:
- "8000"
networks:
- my_network
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./media:/usr/src/app/media
- ./static:/usr/src/app/static
- /etc/letsencrypt:/etc/letsencrypt
networks:
- my_network
depends_on:
- web
networks:
my_network:
driver: bridge
---
Paso 4: Configuración de Nginx
El archivo nginx.conf
actúa como un proxy inverso. Su función es recibir las peticiones de los usuarios y redirigirlas al contenedor de Gunicorn. También gestiona la redirección de HTTP a HTTPS y el uso de los certificados SSL.
Archivo: nginx.conf
worker_processes 4;
events { worker_connections 1024; }
http {
# Redirige todo el tráfico HTTP a HTTPS
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
# Bloque principal para el tráfico HTTPS
server {
listen 443 ssl;
server_name your-domain.com;
# Reemplaza las rutas con las de tu certificado de Certbot
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /usr/src/app/static/;
}
location /media/ {
alias /usr/src/app/media/;
}
}
}