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.

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

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
.