Si estás construyendo una aplicación que usa PostgreSQL en producción para almacenar datos, tarde o temprano vas a necesitar correr PostgreSQL para desarrollo en tu máquina local.
A veces puedes usar algo como SQLite en desarrollo y Postgres en producción, pero cuando tu app se vuelve algo serio, vas a querer que tus entornos coincidan.
Ejemplo de Postgres en Docker para desarrollo local
Prefiero usar docker-compose en lugar del CLI de docker, pero tú decides. Aquí te muestro ambos.
Te recomiendo cambiar la imagen que se usa aquí para que coincida con la versión que usas en producción, por ejemplo postgres:9.4 en lugar de postgres:latest.
PostgreSQL con el CLI de Docker
docker run -d \
--name psql \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=example \
-v psql:/var/lib/postgresql/data \
-p 5555:5432 \
postgres:latest
Esto iniciará tu servidor PostgreSQL y lo dejará disponible en localhost:5555. Ponlo en un script como dev/postgres y ejecútalo cada vez que inicies tu app.
PostgreSQL con Docker Compose
Prefiero usar Docker Compose, porque facilita cambiar la configuración de la base de datos y agregar más servicios (por ejemplo, Redis) cuando los necesito.
version: '3'
volumes:
psql:
services:
psql:
image: postgres:latest
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: example # only do this in development
volumes:
- psql:/var/lib/postgresql/data # save data between restarts
ports:
- 5555:5432 # binds port 5555 on your computer to the postgres port!
De nuevo, tu base de datos de desarrollo estará disponible en localhost:5555
Recomendaciones para desarrollo local con Postgres
Te recomendamos gestionar Postgres de desarrollo de la siguiente manera:
- Asegúrate de usar la imagen oficial de Postgres.
- Guarda tu configuración de Postgres en un archivo de Docker Compose (abajo hay un ejemplo).
- Sube el archivo de docker compose al control de versiones (como Git) junto con el código fuente de tu proyecto.
- Haz que todo tu equipo use la misma configuración de Postgres en desarrollo.
- Inicializa tu imagen de Postgres (si lo necesitas) usando algunas de las funciones más avanzadas de la imagen de Docker.
- Asegúrate de especificar un
volumepara que el contenedor guarde los datos; así persisten entre ejecuciones. - Usa las funciones integradas de la imagen para ejecutar SQL de inicialización, definir credenciales y crear bases de datos.
Docker vs. instalación de Postgres en el sistema
Puedes simplemente instalar Postgres en tu computadora. Hay versiones para los tres sistemas operativos principales. Parece la forma más fácil, pero este enfoque tiene algunos problemas.
Problemas de instalar Postgres a nivel de sistema
- Postgres siempre estará corriendo como un servicio del sistema
- Fácilmente solo puedes tener una versión de Postgres instalada y corriendo a la vez
- Cada app que necesite su propia base de datos Postgres tendrá que compartir la misma instancia
- Requiere acceso root/admin a tu máquina
- Si trabajas en equipo, cada configuración puede ser un poco distinta, lo que complica compartir configuraciones de desarrollo.
Docker resuelve (casi todos) estos problemas
Con Docker, cada proyecto en desarrollo puede tener su propio Postgres fijado a la versión correcta, con una configuración estándar que se comparte con tu equipo y se puede subir al control de versiones.
El mayor problema de correr Postgres en un contenedor de Docker es, pues, aprender Docker si nunca lo has usado.
Usar Docker para Postgres en producción
Si usas Docker directamente en producción, tener una base de datos Postgres es bastante parecido a nuestra configuración de desarrollo
version: '3.8'
volumes:
psql_data:
driver: local
services:
postgres:
image: postgres:14
container_name: postgres
restart: always
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mysecurepassword
POSTGRES_DB: mydatabase
volumes:
- psql_data:/var/lib/postgresql/data
- ./backups:/backups
ports:
- 5432:5432
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myuser"]
interval: 30s
timeout: 10s
retries: 5
Respaldar y restaurar bases de datos Postgres en Docker
Lo siguiente no es una guía completa de cómo gestionar Postgres en producción, pero te sirve como punto de partida para una estrategia de respaldo sencilla.
En un entorno de producción, los respaldos de PostgreSQL se pueden automatizar exportando periódicamente la base de datos a un archivo de respaldo. Puedes lograrlo programando un cron job o un contenedor de respaldo dedicado que ejecute periódicamente un comando pg_dump para exportar los datos a un directorio (por ejemplo, /backups) montado en el sistema host. La carpeta backups de la configuración anterior está montada en un directorio de la máquina host, donde los archivos de respaldo se pueden guardar de forma segura.
Crear respaldos de Postgres en Docker
Para una estrategia de respaldo básica:
- Ejecuta
pg_dumppara exportar la base de datos:docker exec postgres pg_dump -U myuser mydatabase > ./backups/backup_$(date +%F).sqlEste comando crea un respaldo de la base de datos dentro del directorio
backups. - Puedes configurar un cron job u otro mecanismo de programación para ejecutar este comando a intervalos regulares (por ejemplo, diario o semanal).
0 2 * * * docker exec postgres pg_dump -U myuser mydatabase > /path/to/backups/backup_$(date +\%F).sql - Sube el respaldo a S3 o a un almacenamiento similar
aws s3 cp ./backups/backup_$(date +%F).sql s3://your-bucket-name/path/to/backup/Además, podrías configurar el archivado de WAL (Write-Ahead Logging) para crear respaldos continuos de los cambios y permitir la recuperación a un punto en el tiempo, pero eso está fuera del alcance de este artículo; consulta la documentación oficial para más información.
Restaurar un respaldo
- Descarga el respaldo desde S3
aws s3 cp s3://your-bucket-name/path/to/backup/backup_YYYY-MM-DD.sql ./backups/Este comando descargará el archivo de respaldo desde S3 a tu directorio local de backups.
- Restáuralo en tu base de datos
docker exec -i postgres psql -U myuser -d mydatabase < ./backups/backup_YYYY-MM-DD.sqlEste comando usará psql para restaurar el archivo de respaldo en tu contenedor de PostgreSQL en ejecución.
Conclusión
Ya deberías tener claro lo básico para iniciar y gestionar un contenedor de Postgres en Docker. Ten en cuenta que hay muchas otras cosas que necesitarás para correr un clúster de Postgres en producción (por ejemplo, monitoreo y alertas), pero ojalá lo anterior te sirva para empezar.
Beekeeper Studio es un cliente de bases de datos gratuito y de código abierto
La mejor herramienta de consultas y edición de SQL que he usado. Tiene todo lo que necesito para administrar mi base de datos. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio es rápido, intuitivo y fácil de usar. Es compatible con muchísimas bases de datos y funciona de maravilla en Windows, Mac y Linux.
Lo que dicen los usuarios de Beekeeper Studio
"Beekeeper Studio reemplazó por completo mi antiguo flujo de trabajo con PostgreSQL. Es rápido, intuitivo y hace que trabajar con bases de datos vuelva a ser un placer."
"He probado muchas GUIs de bases de datos, pero Beekeeper logra el equilibrio perfecto entre funciones y simplicidad. Simplemente funciona."