Configuración Django Docker

Que es docker?

Docker es una tecnologia que permite tener el software en paquetes individuales, permitiendo tener diferentes dependencias y aislar e independizar cada los componentes de la nuestras aplicaciones.

Cada paquete individual se conoce como "contenedor" y mediante una definición sencilla se puede replicar fácilmente una configuración o entorno.

Beneficios

Al implementar docker en el desarrollo de nuestras aplicaciones obtenemos los siguientes beneficios:

  • Independencia de los paquetes presentes en cada uno de los contenedores. Esto permite tener diferentes versiones de dependencias sin que estas generen problemas.
  • Se evita el problema de "en mi laptop funciona".
  • Facilita replicar y configurar entornos. De esta forma se facilita el escalamiento de las aplicaciones.
  • Facilita el desarrollo ya que las configuraciones se pueden mantener dentro del código de la aplicación y de esta manera controlar los diferentes entornos (producción, desarrollo, testing, integración, etc).

Repositorio

En el siguiente repositorio de GitHub he dejado un ejemplo de un pequeño proyecto de Django montado sobre contenedores de Docker;

Descripción

Esta estructura se compone de varios contenedores encargados de desplegar la estructura básica de un proyecto de Django. Esto incluye postgresql, redis, gunicorn, nginx.

GitHubLogo

En seguida esta el ejemplo del docker compose donde se define los contenedores definidos anteriormente.

docker-compose.yml
GitHubLogo
Contenedor Web

El contenedor web tiene la aplicación de Django y se ejecuta usando gunicorn en el puerto 8000 con dos workers.

web:  
  restart: always
  build: ./web
  expose:
    - "8000"
  links:
    - postgres:postgres
    - redis:redis
  volumes:
    - /usr/src/app
    - /usr/src/app/static
    # Uncomment to config media folder
    #- /path/to/media:/usr/src/app/media
  env_file: .env
  command: /usr/local/bin/gunicorn project_example.wsgi:application -w 2 -b :8000

Dockerfile:

FROM python:2.7-onbuild

RUN chown -R www-data:www-data ./static  
RUN chown -R www-data:www-data ./media  
Contenedor Postgres

El contenedor de postgres usa la imagen oficial de postgresql, el puerto de comunicación y el volumen de donde debe almacenar los archivos. Este contenedor se basa en la imagen oficial de Postgresql en DockerHub.

postgres:  
  restart: always
  image: postgres:9.5
  ports:
    - "5432:5432"
  volumes:
    - pgdata:/var/lib/postgresql/data/
Contenedor NGINX

Por ultimo se encuentra la configuración del contenedor nginx en el puerto 80 ademas de tener los volúmenes desde el contenedor web

nginx:  
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  volumes:
    - /www/static
    - /www/media
  volumes_from:
    - web
  links:
    - web:web

Dockerfile:

FROM tutum/nginx  
RUN rm /etc/nginx/sites-enabled/default  
ADD sites-enabled/ /etc/nginx/sites-enabled  

Para NGINX es necesario actualizar su configuración para que sirva de proxy reverso con el contenedor web(django) que corre en el puerto 8000. Esto se realiza de la siguiente manera.

server {

    listen 80;
    server_name example.com;
    charset utf-8;

    location /static {
        alias /usr/src/app/static;
    }

    location /media {
        alias /usr/src/app/media;
    }

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

}

Finalmente estos contenedores pueden correrse fácilmente con el comando docker-compose up.

Carlos Martinez

Read more posts by this author.