Instalar postgresql en docker


En este post vamos a trabajar en la instalación de postgresql sobre una imagen de docker

Instalar postgresql en docker
oscar Escrito por oscar 22 August 2021 10714 1

Acerca del proyecto

En este post vamos a trabajar en la instalación de postgresql sobre una imagen de docker, en post pasados se a instalado postgresql en Windows y Linux, como van a encontrar en el conocimiento previo de este post, pero en este caso vamos a hacer la instalación y la configuración desde una imagen docker ya creada para generar nuestra base de datos de forma fácil sin tener que instalar el motor completamente.

Se ha creado un paso a paso desde cómo descargar la imagen necesaria con la versión que necesitemos, crear un volumen para poder almacenar los datos y las base de datos, por último generaremos el usuario y la contraseña de administrador para acceder.

Ya por último vamos a ver cómo acceder a la consola de postgres desde el contenedor que se está ejecutando con la imagen de postresql.

Conocimiento previo

Para realizar este proyecto se requiere conocimiento previo de los siguientes temas, si aun no has trabajado con lo que se menciona en la siguiente tabla, allí están los links a los post para que puedas dar un repaso adicional o puedas recordar el conocimiento necesario para poder realizar este proyecto.

Proyecto Descripción
Introducción postgresql En este post damos la introducción, definición y los temas que trabajaremos con postgresql, ademas están los links de los post de este tema.
Docker build En este post explicamos como crear una imagen a partir de un archivo dockerfile
Introducción a docker Damos la introducción, definición y los temas principales de docker para poder entender entrono de trabajo con contenedores.
Docker comandos básicos Explicamos los comandos que vamos a usar en este post, ademas damos ejemplos a detalle
dockerfile Realizamos la explicación de archivo con que creamos las imágenes de docker
Volúmenes en docker Realizamos la explicación de los volúmenes en docker, como crearlos, usarlos, leer y escribir datos.

Entrono y programas a instalar

Para este post usamos los siguientes programas:

  • Microsoft Windows [Versión 10.0.19043.1110], Linux
  • Docker version 20.10.7, build f0df350
  • Imagen oficial de postgres 12.6 en docker hub
  • Visual studio code, pero puede usar cualquier editor de texto

Imagen de postgresql

Para este caso usare la imagen de postgres que ya esta creada, depurada, verificada y lista para funcionar, esta la vamos a encontrar en docker hub, como postgres, en este proyecto vamos a usar la versión mas reciente a la fecha.

Docker compose

Compose es una herramienta para definir y ejecutar aplicaciones Docker de varios contenedores. Con Compose, usa un archivo YAML para configurar los servicios de su aplicación. Luego, con un solo comando, crea e inicia todos los servicios desde su configuración.[1]

El siguiente es un ejemplo, pero detallaremos mas adelante cuan ejecutemos el código.

docker-compose up

Crear el proyecto de postgresql con docker

Para crear el proyecto de usar postgresql con docker los explicare paso a paso lo mas detallado posible, para que se pueda entender correctamente.

Directorio ubicación

Vamos a crear una carpeta donde vamos a adicionar él o los archivos de este proyecto, recomiendo que sea una ruta fácil de encontrar y llegar desde la consola de comandos (CMD) ya que la ejecución de docker compose se ejecuta por este medio.

En mi caso creare el directorio o carpeta docker-postgres en la ubicación C:\code\codigoelectronica\docker-postgres, pero aclaro que pueden usar cualquier ubicación.

Crear archivo docker-compose

Después de tener la carpeta procedemos a crear el archivo principal con el que vamos a trabajar, este archivo lo vamos a nombrar como docker-compose.yml, debe ser de esta forma ya que el mismo comando lo reconoce con este nombre, se puede nombrar de otra forma pero por el momento no lo trabajaremos de ese modo.

C:\code\codigoelectronica\docker-postgres
----docker-compose.yml

docker-compose.yml

Ahora explicaremos el archivo yml paso a paso, el cual si lo copiamos tal cual deberá funcionar sin ningún problema, creando la imagen y ejecutándola en un contenedor:

Nota: muy importante, los archivos yml y yaml son estrictos con los espacios y la tabulación.

# Trabajaremos con la versión 3 docker
version: '3.8'

# Creamos los servicios
services:
  db:                                 # Creamos el servicios mydb para identificar la imagen
    image: postgres:17.4-alpine                 # Usamos la imagen postgresql en la versión 17
    restart: always
    volumes:
      - postgresdb:/var/lib/postgresql  # Crearemos un volumen para almacenar los datos de la db
    ports:
      - "5432:5432"                     # Habilitamos el puerto 5432 para acceder a la db
    environment:                        # Creamos las variables del usuario contraseña y base de datos 
      POSTGRES_USER: admin              #   que se crea cuando inicia docker
      POSTGRES_PASSWORD: admin
      POSTGRES_DB: testdb

  pgadmin:
    image: dpage/pgadmin4:9.8 # Use a specific version of pgAdmin
    container_name: pgadmin_server
    restart: always
    environment:
      PGADMIN_DEFAULT_EMAIL: your_email@example.com # Replace with your desired email
      PGADMIN_DEFAULT_PASSWORD: your_pgadmin_password # Replace with your desired pgAdmin password
    ports:
      - "5050:80" # Map host port 5050 to container port 80 (pgAdmin's default)
    depends_on:
      - db # Ensure PostgreSQL starts before pgAdmin

volumes:                                # Creamos y asignamos el volumen de docker
  postgresdb:
    driver: local

Antes de ejecutar el comando para crear la imagen debemos tener en cuenta lo siguiente:

  1. Se debe crear el volumen con el comando docker volume create postgresdb, sin el volumen genera un error al ejecutarse.
  2. En la selección de la versión de la imagen se observa que usamos la 12.6, pero podemos también la que necesitemos en nuestro proyecto como la 13 o latest que seria la ultima estable para trabajar.

Ejecutar el comando docker-compose

Después de tener el archivo docker-compose.yml listo procedemos a generar la images y crear el contenedor que va a iniciar y ejecutar postgresql, para elló usamos el comando docker-compose el cual se encargara de crear la imagen y correrla en un contenedor.

Para ejecutar docker compose abrimos la terminal de comandos (CMD) y nos ubicamos en el directorio donde esta el archivo con el mismo nombre, donde vamos a escribir el siguiente comando:

docker-compose up -d

Ahora vamos a explicar la respuesta del comando, primero va a descargar la imagen de postgesql a nuestra maquina local

Pulling mydb (postgres:12.6)...
12.6: Pulling from library/postgres
69692152171a: Pull complete
a31b993d5cc6: Pull complete
...
44248978f8ed: Pull complete
c74c1c4f5ca3: Pull complete
83addcc511dd: Pull complete
478b899f4ef8: Pull complete
Digest: sha256:26ce5e265fbbf120b4a89a9b26770bad757a7dfa4f329038d93770edbe5aae00
Status: Downloaded newer image for postgres:12.6

Luego procederá a crear el contenedor con la imagen postgresql descargada, liego va a iniciar la base de datos donde empezara a cargar los archivos necesarios, su configuración, habilitara los puertos de comunicación y cargara las db que tenga almacenadas

Creating docker-postgres_db_1 ... done
Attaching to docker-postgres_db_1
db_1  | The files belonging to this database system will be owned by user "postgres".
db_1  | This user must also own the server process.

Cuando se finalice la ejecución, al finalizar mostrara los últimos logs donde indicara en que puesto esta disponible para realizar la comunicación y el mensaje de que la base de datos esta disponible para usar.

db_1  | 2021-08-22 15:47:18.568 UTC [1] LOG:  starting PostgreSQL 17.6 (Debian 12.6-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
db_1  | 2021-08-22 15:47:18.568 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1  | 2021-08-22 15:47:18.568 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1  | 2021-08-22 15:47:18.571 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1  | 2021-08-22 15:47:18.579 UTC [76] LOG:  database system was shut down at 2021-08-22 15:47:18 UTC
db_1  | 2021-08-22 15:47:18.582 UTC [1] LOG:  database system is ready to accept connections

Acceder a la consola postgresql desde docker

Este es un paso opcional ya que si queremos comprobar la versión de postgresql instalada o trabajar desde la consola de postgres, para ello debemos identificar el contenedor en donde se esta ejecutando postgresql, veamos los pasos:

Nota: para mas detalle de los comandos que vamos a trabajar en el post docker comandos básicos ls explicamos a detalle.

Aunque es opcional con el siguiente comando podemos ver que versión de la imagen de postgres se ha descargado.

docker image list

Respuesta 

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
postgres     12.6      145bb83bd157   3 months ago   314MB

Ahora vamos a identificar el contenedor donde se esta ejecutando postgresql, ejecute el siguiente comando donde mostrara la información del id del contenedor, la imagen que usa y datos adicionales.

docker ps -a

Respuesta

CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS              PORTS                                       NAMES
915a33cf511f   postgres:12.6   "docker-entrypoint.s…"   29 minutes ago   Up About a minute   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp   docker-postgres_mydb_1

Con el id del contenedor podemos adjuntamos o ingresar a el para que nos muestre su terminal de comandos, es decir la terminal linux de la imagen postgresql.

docker exec -it 915a33cf511f bash

Respuesta

root@915a33cf511f:/#

Por ultimo en la terminal linux ingresamos lo siguiente: 

psql -U admin -W -h localhost testdb

root@915a33cf511f:/# psql -U admin -W -h localhost testdb
Password:
psql (12.6 (Debian 12.6-1.pgdg100+1))
Type "help" for help.

testdb=#
  • psql: es la instrucción que nos permite ingresar a la terminal de postgresql
  • -U admin: es el usuario que registramos en la variable "POSTGRES_USER" del archivo docker-compose-yml
  • -W: es la bandera para que nos solicite la contraseña de acceso, creada en la variable "POSTGRES_PASSWORD"
  • -h localhost: en este caso la maquina local, que seria el contenedor docker que se esta ejecutando
  • testdb: nombre de la base de datos a la que vamos a ingresar

Puede revisar a detalle Consola de postgresql

Resumen de los comandos psql

Comando Explicación
\l Listar bases
\c Conectar BD
\dt Listar tablas
\d <table> Estructura tabla
\df Funciones
\dv Vistas
\dn Esquemas
\di Índices
\du Roles
\i file.sql Ejecutar archivo
\o file Redirigir salida
\e Editar SQL
\r Reset buffer
\timing Medir tiempo
\copy Import/export
\! Comando del sistema
\q Salir

PGAdmin

En el archivo docker compose, creamos un servicio de pg admin para tener una interfaz web con la que podamos interactuar con la base de datos, esto es para facilitar el trabajo po si no quiere trabajar con la consola psql.

Para acceder a la consola procedemos a ingresar 

👉 http://localhost:5050

Esto abrirá la interfaz de pg admin

Interfaz de pgadmin
Interfaz de pgadmin

Procedemos a iniciar sesión con el usuario configurados en el docker compose

PGADMIN_DEFAULT_EMAIL: your_email@example.com
PGADMIN_DEFAULT_PASSWORD: your_pgadmin_password

Configurar pgadmin

Iniciada la sesion con pgadmin, procedemos a registrar el servidor de base de datos postgresql, para ello seguimos los siguientes pasos:

En server damos boton derecho > regster > server, en donde aparecerá el siguiente formulario

Registrar server en pgadmin
Registrar server en pgadmin

En la información general solo necesitamos el nombre del host 

Procedemos a configurar la conexion como se muestra en el siguiente formulario 

Configurar conexión de pgadmin
Configurar conexión de pgadmin

En esta pantalla vamos a colocar los siguientes campos

  • host name/address: se pude colocar uno de los siguientes
    • db que es el servicio creado en el docker compose
    • host.docker.internal que seria el equivalente a localhost en la red docker
  • port: 5432
  • maintenace database: postgres
  • username: admin
  • password: admin

Damos en guardar y podemos ver el servidor postgres conectado a pgadmin

Servidor postgres conectado a pgadmin
Servidor postgres conectado a pgadmin

Eliminar los contenedores docker compose

Por si desea eliminar lo creado, a continuación están los comandos

docker-compose down

Referencias

[1] docker compose https://docs.docker.com/compose/, Consultado Agosto 2021


Comentario

Debe aceptar antes de enviar

29 October 2022 08:38

me ayudó mucho. gracias.