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/;
        }
    }
}
    

Volver al listado