Instalar postgresql en docker
En este post vamos a trabajar en la instalación de postgresql sobre una imagen de docker
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:
- Se debe crear el volumen con el comando
docker volume create postgresdb, sin el volumen genera un error al ejecutarse. - 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
Esto abrirá la interfaz de pg admin
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
En la información general solo necesitamos el nombre del host
Procedemos a configurar la conexion como se muestra en el siguiente formulario
En esta pantalla vamos a colocar los siguientes campos
- host name/address: se pude colocar uno de los siguientes
dbque es el servicio creado en el docker composehost.docker.internalque 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
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
29 October 2022 08:38