Daily Archives: 24/09/2016

Publicar una Aplicación de DJango en un Contenedor Docker

Podemos estar tentados de pasar a producción el contenedor Docker con el runserver que proporciona el manager.py de DJango. Pero esto es un gravísimo error de seguridad. En la siguiente entrada explicaremos como crear el contenedor Docker con el módulo wsgi de Apache.

En la siguiente entrada veremos lo sencillo que es construir nuestra imagen para Docker de nuestra App de DJango con el Dockerfile que nos proporciona Graham Dumpleton.

Lo único que necesitamos es el código DJango de la aplicación (obviamente) y el fichero requirements.txt que debe estar en la raiz donde vamos a colocar nuestro Dockerfile.

Pongamos que nuestro requirements.txt tiene este aspecto:

numpy==1.6.2
Django==1.4.2
django-tastypie==0.9.14
pyes==0.19.1

Lo siguiente que necesitamos conocer es el dónde colocar los estáticos tanto la URL como la ubicación física en el directorio.

Lo típico es poner los estáticos bajo la URL /static/ y en el disco en el directorio static de nuestra aplicación. Debemos conocer estos datos para pasarlo al comando con el que arrancar la imagen.

Bien, como decíamos, partimos de la imagen siguiente

FROM grahamdumpleton/mod-wsgi-docker:python-2.7-onbuild

Usaremos onbuild porque tiene dos disparadores interesantes que nos simplifican muchísimo la vida. El primero copia el contenido del directorio actual a /app y el segundo ejecuta

pip install -r requirements.txt

Con el contenido de nuestro fichero de requirements.

La única línea que tenemos que añadir a nuestro Dockerfile sería la siguiente:

CMD ["--url-alias", "/static", "awesomeapp/static", "awesomeapp/wsgi.py"]

Y la construimos

# docker build -t awesomeapp-wsgi .

Ya podemos ponerla en producción sin riesgo.

# docker run -d -p 80:80 --name awesomeapp-pro awesomeapp-wsgi

Referencias:

  1. http://blog.dscpl.com.au/2014/12/hosting-python-wsgi-applications-using.html
  2. https://hub.docker.com/r/grahamdumpleton/mod-wsgi-docker/
  3. https://github.com/GrahamDumpleton/mod_wsgi-docker