Django + Postgresql dockerizada!



WOW! "Dockerizada", que palabrita!

Luego del comentario de gilgamezh sobre docker y como utilizarlo como alternativa a instalar un motor en la maquina host, y la charla de Ricardo en la PyCon, decidí sentarme y aprender a utilizar docker como herramienta de desarrollo.

Así es que preparé una pequeña charla para el primer meetup que se realizó acá en San Rafael, sobre Docker y Docker-Compose. Me sirvió como excusa para comenzar a utilizarlo. La presentación que armé para esa charla la podés encontrar acá.

Pero bueno, vayamos al objetivo de este post. Utilizar docker y docker compose para administrar contenedores que nos permitan utilizar un motor PostgreSQL sin necesidad de instalarlo en la máquina.

Voy a suponer que sabés que es Docker y que conocés de la herramienta de su staff Docker Compose.

Basándome en este script, creé mi propia imagen y la subí a Docker Hub (matuu/postgresql). Podés usar esa o cualquier otra con postgres instalado.

Dentro de la carpeta del proyecto Django creamos un archivo docker-compose.yml con el siguiente contenido:

data:
  restart: always
  image: matuu/postgresql:latest
  volumes:
    - /var/lib/postgresql
  command: "true"

postgres:
  restart: always
  image: matuu/postgresql:latest
  volumes_from:
    - data
  ports:
    - "5432:5432"

Básicamente, lo que hacemos con este archivo es indicarle a Docker Compose cómo tiene que orquestar todo el entorno de desarrollo del proyecto. Indicamos que cree un contenedor para el storage, y un contenedor con el motor postgresql exponiendo el puerto 5432.

Para arrancar el entorno completo (todo lo que indicamos con el archivo docker-compose.yml), hacemos:

sudo docker-compose up -d

Esto creará y ejecutará los contenedores. Con -d indicamos que se ejecute en background.

sudo docker-compose ps
Name                     Command               State           Ports
-----------------------------------------------------------------------------------
web_data_1       true                             Up
web_postgres_1   /usr/lib/postgresql/9.3/bi ...   Up      0.0.0.0:5432->5432/tcp

Genial! Están ambos ejecutandose.

Probemos entonces si podemos acceder al motor.

$ psql -Udocker -h localhost -W docker
Contraseña para usuario docker:
psql (9.4.5, servidor 9.3.10)
conexión SSL (protocolo: TLSv1.2, cifrado: DHE-RSA-AES256-GCM-SHA384, bits: 256, compresión: desactivado)
Digite «help» para obtener ayuda.

docker=#

¡¡Éxito!!

La imagen tiene configurada un usuario docker (con password docker) y una base de datos docker, por lo que tendrémos que reflejar esos datos en los settings del proyecto.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'docker',
        'USER': 'docker',
        'PASSWORD': 'docker',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

Acá ya podemos hacer syncdb o migrate

Importando la base de datos desde un dump

Viendo que nos podemos conectar directamente al motor del contenedor, podemos restaurar la base de datos normalmente con:

cat dump.sql | psql -Udocker -h localhost -W docker

Tené en cuenta que quizás tengas, o bien, que modificar tu dump cambiando el nombre de la base de datos y/o usuario a docker, o bien, añadiendo la base de datos y usuario correspondiente.

Cualquier cosa, dejame un comentario.

Abrazo!

Comments


Comments powered by Disqus