Can I run PostgreSQL in Docker?

Guía: Instalar PostgreSQL en Alpine Linux

02/03/2024

Valoración: 4.84 (12844 votos)

Instalar y configurar un servidor de bases de datos como PostgreSQL en una distribución tan minimalista y orientada a la seguridad como Alpine Linux puede presentar desafíos únicos. A diferencia de otras distribuciones más grandes, Alpine requiere un enfoque más manual y preciso para asegurar que todo funcione correctamente, especialmente en entornos virtualizados o en contenedores. Esta guía completa te llevará de la mano a través de cada paso del proceso, desde la instalación inicial hasta la automatización del servicio, asegurando que tengas una instancia de PostgreSQL robusta y lista para producción.

How to install PostgreSQL in Alpine Linux?
, Step 1: Determine PostgreSQL / Alpine Linux Version. ... , Step 2: Update Package Repository Index and Install the PostgreSQL Package. ... , Step 3: Create Required Folders for PostgreSQL. ... , Step 4: Create a New Database Cluster with initdb. ... , Step 5: Allow Remote Connections via Password Authentication (Optional)
Índice de Contenido

Preparativos: Versiones y Repositorios

Antes de escribir cualquier comando, es fundamental entender la relación entre las versiones de Alpine Linux y los paquetes que ofrecen. Cada versión de Alpine apunta a un repositorio de paquetes específico, y este repositorio contiene una versión concreta de PostgreSQL. Por ejemplo, Alpine Linux v3.10 ofrece PostgreSQL 11.6. Es crucial verificar qué versión necesitas y cuál está disponible en el repositorio de tu sistema.

Puedes consultar el listado de paquetes disponibles directamente en el sitio web de Alpine Linux. Para este tutorial, nos basaremos en la instalación de PostgreSQL 11.6 en Alpine Linux v3.10, pero los principios son aplicables a otras versiones con ligeros ajustes.

Paso 1: Instalación de PostgreSQL

El primer paso práctico es actualizar el índice de paquetes de Alpine y luego instalar el paquete de PostgreSQL. Esto se hace con el gestor de paquetes apk.

Primero, actualizamos el índice para asegurarnos de que estamos obteniendo la lista más reciente de software disponible:

~ # apk update

Una vez actualizado, procedemos a instalar el paquete principal de PostgreSQL. El gestor de paquetes se encargará de resolver e instalar todas las dependencias necesarias, como las librerías libpq y otras utilidades.

~ # apk add postgresql

Durante la instalación, verás cómo apk descarga e instala varios componentes. Es una buena práctica observar estos paquetes para familiarizarte con las dependencias de tu sistema. Una nota para los que buscan optimizar el espacio: puedes combinar ambos comandos en uno solo usando el flag --no-cache para evitar guardar el índice de paquetes, ahorrando así algunos megabytes.

Paso 2: Creación de la Estructura de Directorios

Con el software instalado, necesitamos preparar el entorno de directorios donde PostgreSQL operará. Esto incluye un directorio para el socket de comunicación y, más importante aún, el directorio que albergará los datos de nuestras bases de datos.

2.1 El Directorio del Socket UNIX

PostgreSQL utiliza un archivo de socket UNIX para las conexiones locales. Por defecto, intenta crearlo en /run/postgresql. Sin embargo, en ciertos entornos como los contenedores LXC, el contenido del directorio /run no es persistente y se pierde tras un reinicio. Esto puede causar que el servicio falle al intentar arrancar automáticamente.

Si no te preocupa la persistencia y prefieres crear el directorio manualmente cada vez, puedes usar:

~ # mkdir /run/postgresql ~ # chown postgres:postgres /run/postgresql/

Sin embargo, si buscas una solución permanente y automatizada, te recomendamos omitir este paso por ahora. Más adelante en la configuración, ajustaremos PostgreSQL para que utilice un directorio persistente como /tmp.

2.2 El Directorio de Datos

Este es el directorio más crítico, ya que contendrá todos tus datos, tablas e índices. Debemos crearlo y asignarle los permisos correctos. Estas operaciones deben realizarse como el usuario postgres, que fue creado durante la instalación del paquete.

How to install PostgreSQL in Alpine Linux?
, Step 1: Determine PostgreSQL / Alpine Linux Version. ... , Step 2: Update Package Repository Index and Install the PostgreSQL Package. ... , Step 3: Create Required Folders for PostgreSQL. ... , Step 4: Create a New Database Cluster with initdb. ... , Step 5: Allow Remote Connections via Password Authentication (Optional)

Primero, cambiamos al usuario postgres:

~ # su postgres -

A continuación, dentro del directorio home del usuario postgres (que suele ser /var/lib/postgresql), creamos el directorio de datos y restringimos sus permisos para que solo el propietario pueda leerlo y escribir en él. Esto es una medida de seguridad fundamental.

$ mkdir /var/lib/postgresql/data $ chmod 0700 /var/lib/postgresql/data

Paso 3: Inicializando el Clúster de la Base de Datos con `initdb`

Ahora que tenemos la estructura de directorios, es el momento de crear un nuevo "clúster" de base de datos. Un clúster en el contexto de PostgreSQL es una colección de bases de datos gestionadas por una única instancia del servidor. El comando initdb se encarga de esta tarea inicial.

Ejecutamos el siguiente comando, especificando la ruta a nuestro directorio de datos recién creado:

$ initdb -D /var/lib/postgresql/data

La salida de este comando te proporcionará información valiosa sobre la configuración inicial. Presta atención a la advertencia sobre la autenticación "trust" para conexiones locales. Esto significa que, por defecto, cualquier usuario local puede conectarse a la base de datos sin contraseña. Si bien esto es conveniente para el desarrollo, es un riesgo de seguridad en producción. Lo abordaremos más adelante.

Paso 4: Configuración para Conexiones Remotas y Persistencia (Opcional)

Por defecto, PostgreSQL solo escucha conexiones locales. Si necesitas acceder a tu base de datos desde otra máquina, debes realizar dos cambios clave. Además, si estás en un contenedor LXC y quieres que el servicio se inicie automáticamente, necesitarás ajustar la configuración del socket.

Permitir Conexiones Remotas

Edita dos archivos de configuración dentro de tu directorio de datos:

  1. pg_hba.conf: Este archivo controla la autenticación. Para permitir que cualquier IP (0.0.0.0/0) se conecte usando una contraseña encriptada (md5), añade la siguiente línea:
    $ echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf
  2. postgresql.conf: Este archivo controla la configuración general del servidor. Debes indicarle que escuche en todas las interfaces de red, no solo en localhost.
    $ echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf

Ajustar Directorios del Socket para Persistencia

Para resolver el problema de persistencia en contenedores LXC, edita el archivo postgresql.conf y modifica la directiva unix_socket_directories. Simplemente elimina la ruta no persistente /run/postgresql, dejando solo /tmp.

# Original: unix_socket_directories = '/run/postgresql,/tmp' # Modificado: unix_socket_directories = '/tmp'

Paso 5: Iniciando y Probando el Servidor

Con todo configurado, es hora de iniciar el servidor de PostgreSQL usando el comando pg_ctl. Este comando es la utilidad principal para controlar el estado del servidor.

$ pg_ctl start -D /var/lib/postgresql/data

Si todo va bien, verás un mensaje de "server started". El log mostrará que el servidor está escuchando en las interfaces de red y en los sockets UNIX configurados. Para verificar que todo funciona, conéctate usando el cliente de línea de comandos psql:

$ psql psql (11.6) Type "help" for help. postgres=# 

Una vez dentro, puedes ejecutar algunos comandos SQL para confirmar que la base de datos está operativa. Por ejemplo, lista las bases de datos existentes y crea una nueva:

postgres=# SELECT datname FROM pg_database; postgres=# CREATE DATABASE demo; postgres=# SELECT datname FROM pg_database;

Si puedes crear y ver la nueva base de datos "demo", ¡tu instalación ha sido un éxito!

Paso 6: Automatización del Inicio con OpenRC

El último paso es asegurar que el servicio de PostgreSQL se inicie automáticamente cada vez que el sistema arranque. Alpine Linux utiliza el sistema de inicio OpenRC. Configuraremos un script simple para que el servicio `local` se encargue de iniciar nuestro servidor.

Primero, vuelve a ser el usuario root. Luego, crea un nuevo script de inicio ejecutable:

# touch /etc/local.d/postgres-custom.start # chmod +x /etc/local.d/postgres-custom.start

Edita este archivo y añade el siguiente contenido. Este script simplemente ejecuta el comando `pg_ctl start` como el usuario `postgres`:

#!/bin/sh su postgres -c 'pg_ctl start -D /var/lib/postgresql/data'

Finalmente, añade el servicio `local` al runlevel por defecto para que se ejecute en el arranque:

~ # rc-update add local default

Para probar que funciona, reinicia tu máquina o contenedor. Después de reiniciar, intenta conectarte directamente con `psql` como el usuario `postgres`. Si puedes acceder y tu base de datos "demo" sigue ahí, has configurado con éxito el inicio automático.

Tabla Comparativa de Configuración

Aquí tienes un resumen de los cambios de configuración más importantes para un entorno de producción o contenedorizado.

ParámetroValor por DefectoValor RecomendadoPropósito
listen_addresses'localhost''*'Permitir conexiones desde cualquier IP.
Autenticación Local (pg_hba.conf)trustmd5 / scram-sha-256Requerir contraseña para conexiones locales, mejorando la seguridad.
unix_socket_directories'/run/postgresql,/tmp''/tmp'Evitar problemas de persistencia del socket en reinicios (LXC).

Preguntas Frecuentes (FAQ)

¿Por qué usar Alpine Linux para un servidor PostgreSQL?
Alpine Linux es extremadamente ligero y su enfoque en la seguridad (utiliza musl libc y binarios compilados como PIE) lo convierte en una excelente base para servicios contenerizados o sistemas donde los recursos y la superficie de ataque deben ser mínimos.
¿Es seguro usar la autenticación "trust"?
No, no es seguro para entornos de producción. La autenticación "trust" permite a cualquier usuario del sistema operativo conectarse a la base de datos sin contraseña. Siempre debe cambiarse a un método que requiera credenciales, como `md5` o el más seguro `scram-sha-256`.
¿Puedo ejecutar PostgreSQL en Docker usando una imagen base de Alpine?
¡Absolutamente! De hecho, la imagen oficial de PostgreSQL en Docker Hub ofrece variantes basadas en Alpine. Usar Docker simplifica muchos de los pasos de configuración manual, ya que el `Dockerfile` se encarga de la inicialización y configuración. Puedes conectarte a una base de datos en un contenedor Docker usando `docker exec -it <nombre_contenedor> psql -U <usuario> -d <db>` o mediante herramientas gráficas conectándote a `localhost` si has mapeado los puertos correctamente.

Si quieres conocer otros artículos parecidos a Guía: Instalar PostgreSQL en Alpine Linux puedes visitar la categoría Automovilismo.

Subir